2021 更新日志
ClickHouse 发布 v21.12,2021-12-15
向后不兼容的变更
- 修复此前一个行为不符合预期的功能。 不再允许对 Kafka/RabbitMQ/FileLog 进行直接查询(direct select)。可以通过设置
stream_like_engine_allow_direct_select来启用。即使通过该设置启用了直接查询,如果存在挂载的物化视图,仍不允许直接查询。对于 Kafka 和 RabbitMQ,直接查询(如果被允许)默认不会提交消息。要在直接查询时启用提交,用户必须使用存储级别设置kafka{rabbitmq}_commit_on_select=1(默认值为0)。#31053(Kseniia Sumarokova)。 - 对一个新函数的行为进行轻微变更。 在 JSON_VALUE 中返回未加引号的字符串。修复 #27965。#31008(Kseniia Sumarokova)。
- 设置项重命名。 为 TSV/CSV 输入格式添加自定义 null 表示形式的支持。修复在 TSV/CSV/JSONCompactStringsEachRow/JSONStringsEachRow 输入格式中反序列化 Nullable(String) 的问题。将
output_format_csv_null_representation和output_format_tsv_null_representation分别重命名为format_csv_null_representation和format_tsv_null_representation。#30497(Kruglov Pavel)。 - 进一步废弃已经未使用的代码。 仅与仍在使用 20.6 之前版本 ClickHouse 的用户相关。从
ReplicatedMergeTree中移除了“leader 选举”机制,因为自 20.6 起已支持多个 leader。如果你是从更早的版本升级,并且某个旧版本副本当前是 leader,那么在升级后该服务器将无法启动。请先停止旧版本的副本以便新版本能够启动。之后将无法再降级到 20.6 之前的版本。#32140(tavplubix)。
新功能
- 在 clickhouse-keeper 中实现了更多 ZooKeeper “Four Letter Words” 命令: https://zookeeper.apache.org/doc/r3.4.8/zookeeperAdmin.html#sc_zkCommands。#28981(JackyWoo)。现在
clickhouse-keeper的功能已全部实现。 - 支持
Bool数据类型。#31072 (kevin wan)。 - 在 File、URL 和 HDFS 存储以及
INSERT INTO表函数中支持PARTITION BY。修复 #30273。#30690(Kseniia Sumarokova)。 - 添加了
CONSTRAINT ... ASSUME ...(在INSERT期间不会检查约束)。添加了将查询转换为 CNF 形式(https://github.com/ClickHouse/ClickHouse/issues/11749),以便更方便地进行优化。添加了基于约束的简单查询改写(目前仅支持简单匹配,后续将改进以支持 <,=,> 等)。在可能的情况下,添加了用轻量级列替换重量级列的功能。#18787(Nikita Vasilev)。 - 为
http/url函数提供基本身份验证。#31648 (michael1589)。 - 在
WITH FILL修饰符的STEP子句中支持使用INTERVAL类型。 #30927 (Anton Popov)。 - 在
FROM INFILE子句中增加对从多个文件并行读取以及使用 glob 通配符的支持。 #30135 (Filatenkov Artur)。 - 为
Identifier表和数据库查询参数提供支持。解决 #27226。 #28668 (Nikolay Degterinsky)。 - TLDR:大幅提升各文本格式的完备性与一致性。 重构
TSV、TSVRaw、CSV以及JSONCompactEachRow、JSONCompactStringsEachRow格式,去除代码重复,为带有-WithNames和-WithNamesAndTypes后缀的格式新增基础接口。新增CSVWithNamesAndTypes、TSVRawWithNames、TSVRawWithNamesAndTypes、JSONCompactEachRowWIthNames、JSONCompactStringsEachRowWIthNames、RowBinaryWithNames格式。为TSVWithNamesAndTypes、TSVRaw(WithNames/WIthNamesAndTypes)、CSVWithNamesAndTypes、JSONCompactEachRow(WithNames/WIthNamesAndTypes)、JSONCompactStringsEachRow(WithNames/WIthNamesAndTypes)等格式添加并行解析支持。为RowBinaryWithNamesAndTypes格式增加列映射与类型检查支持。新增input_format_with_types_use_header设置,用于指定是否需要检查<format_name>WIthNamesAndTypes格式中写入的类型是否与表结构匹配。新增input_format_csv_empty_as_default设置,并在 CSV 格式中用它替代input_format_defaults_for_omitted_fields(因为后者不应控制csv_empty_as_default)。修正input_format_defaults_for_omitted_fields的使用方式(之前它只被当作csv_empty_as_default使用,但实际上应控制对被省略字段的默认表达式计算)。修复TSVRaw格式中的 Nullable 输入/输出问题,使该格式与向 TSV 插入时完全兼容。在启用input_format_null_as_default时,修复LowCardinality(Nullable)中插入NULL的问题(之前会插入默认值而非实际的NULL)。修复JSONStringsEachRow/JSONCompactStringsEachRow格式中的字符串反序列化问题(字符串此前只会解析到首个 '\n' 或 '\t' 为止)。为 Template 输入格式添加使用Raw转义规则的能力。为 JSONCompactEachRow(WithNames/WIthNamesAndTypes) 输入格式增加诊断信息。修复在min_chunk_bytes_for_parallel_parsing小于单行字节数时,对-WithNames格式进行并行解析的 bug。#30178(Kruglov Pavel)。允许在CustomSeparated输入/输出格式中输出/解析列名和类型。新增CustomSeparatedWithNames/WithNamesAndTypes格式,类似于TSVWithNames/WithNamesAndTypes。#31434(Kruglov Pavel)。 - 支持阿里云 OSS 存储。#31286 (cfcz48)。
- 在配置文件中开放全局线程池的所有设置。 #31285 (Tomáš Hromada)。
- 引入了窗口函数
exponentialTimeDecayedSum、exponentialTimeDecayedMax、exponentialTimeDecayedCount和exponentialTimeDecayedAvg,在较大的窗口下它们比exponentialMovingAverage更高效,同时也支持了更多使用场景。#29799(Vladimir Chebotarev)。 - 新增选项,可在将日志写入文件之前使用 LZ4 进行压缩。关闭了 #23860。#29219(Nikolay Degterinsky)。
- 支持具有 CROSS JOIN 语义的
JOIN ON 1 = 1写法。修复了 #25578。#25894(Vladimir C)。 - 为
Map类型添加 Map 组合器。将用于映射数组的旧sum-, min-, max- Map重命名为sum-, min-, max- MappedArrays。 #24539 (Ildus Kurbangaliev). - 使通过 HTTP 进行的读取操作可重试。修复 #29696。#29894 (Kseniia Sumarokova).
实验性特性
- 在 ClickHouse 中通过
WINDOW VIEW启用流式处理。#8331 (vxider)。 - 移除在
MaterializedMySQL中使用 Ordinary 数据库的支持。#31292 (Stig Bakken)。 - 为 Log 系列表引擎实现
BACKUP和RESTORE命令。该功能仍在开发中。#30688 (Vitaly Baranov)。
性能改进
- 在使用
Parquet、ORC、Arrow格式通过s3/url/hdfs读取时减少内存占用(由设置input_format_allow_seeks控制,默认启用)。同时新增设置remote_read_min_bytes_for_seek用于控制随机访问(seek)。解决 #10461。解决 #16857。#30936 (Kseniia Sumarokova). - 为 JOIN ON 中的常量条件添加优化,参考 #26928。#27021 (Vladimir C).
- 为除
JSONEachRowWithProgress和PrettyCompactMonoBlock之外的所有文本格式提供并行格式化支持。#31489 (Kruglov Pavel). - 加速对可空列的 count 计算。#31806 (Raúl Marín).
- 加速聚合函数
avg和sumCount。#31694 (Raúl Marín). - 提升 JSON 和 XML 输出格式的性能。#31673 (alexey-milovidov).
- 改进将数据同步到块设备时的性能。解决 #31181。#31229 (zhanglistar).
- 修复
LiveView表中的查询性能问题。修复 #30831。#31006 (vzakaznikov). - 加速查询解析。#31949 (Raúl Marín).
- 允许为普通/带标签的指标拆分
GraphiteMergeTree汇总规则(可选字段rule_type)。#25122 (Michail Safronov). - 移除对
remote()的多余DESC TABLE请求(在remote('127.1', system.one)这种情况下(即使用标识符作为 db.table 而不是字符串)会产生多余的DESC TABLE请求)。#32019 (Azat Khuzhin). - 在启用设置
optimize_functions_to_subcolumns时,将函数tupleElement优化为读取子列。#31261 (Anton Popov). - 在启用设置
optimize_functions_to_subcolumns时,将函数mapContains优化为读取子列key。#31218 (Anton Popov). - 新增设置
merge_tree_min_rows_for_concurrent_read_for_remote_filesystem和merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem。#30970 (Kseniia Sumarokova). - 在
StorageMergeTree中跳过对不同分区的 mutation 操作。#21326 (Vladimir Chebotarev).
改进
- 若有其他表或字典依赖于某个表或字典,则禁止删除该表或字典。 #30977 (tavplubix).
- 允许对聚合函数状态进行版本管理。现在我们可以在聚合函数状态的序列化格式中引入向后兼容的变更。修复了 #12552。#24820(Kseniia Sumarokova)。
- 支持 PostgreSQL 风格
ALTER MODIFY COLUMN语法。#32003 (SuperDJY)。 - 为
RangeHashedDictionary、ComplexKeyRangeHashedDictionary添加对update_field的支持。 #32185 (Maksim Kita). murmurHash3_128和sipHash128函数现在可以接受任意数量的参数。这解决了问题 #28774。#28965(小路)。- 为
HDFS存储添加默认表达式支持,并在源为列式格式时优化数据读取。#32256 (李扬)。 - 优化 OpenTelemetry span 的操作名称。#32234(Frank Chen)。
- 对于输出格式
JSONEachRow使用Content-Type: application/x-ndjson(http://ndjson.org/)。#32223(Dmitriy Dorofeev)。 - 改进了在 Template/CustomSeparated 格式中基于带引号转义规则跳过未知字段的行为。此前只能跳过带引号的字符串,现在可以跳过任意类型的值。#32204(Kruglov Pavel)。
- 现在,当配置中包含重复的 ID 或端点时,
clickhouse-keeper将拒绝启动或应用配置更改。修复了 #31339。#32121(alesapin)。 - 在由 URL 引擎发出的 HTTP 报文中设置 Content-Type。 #32113 (Frank Chen).
- 在启用
output_format_json_array_of_rows时,将JSONEachRow格式的 Content-Type 返回为 'application/json'。 #32112 (Frank Chen)。 - 支持在
Float32/Float64值前解析+。 #32079 (Kruglov Pavel). - 允许用户为
DiskHDFS和StorageHDFS配置hdfs_replication参数。解决 #32039。#32049(leosunli)。 - 将 ClickHouse 的
exception和exception_code字段添加到 OpenTelemetry span 的日志中。#32040 (Frank Chen). - 改进 OpenTelemetry span 日志的持续时间计算——如果查询发生异常,在查询级别的持续时间会被记为 0。 #32038 (Frank Chen).
- 修复无法创建
Int256类型的LowCardinality的问题。#31832(alexey-milovidov)。 - 如果
engine/partition_by不同,则重新创建system.*_log表。 #31824 (Azat Khuzhin). MaterializedMySQL:修复对名为 'table' 的表的处理问题。#31781 (Håvard Kvålen)。- ClickHouse 字典源:支持预定义连接。修复 #31705 问题。#31749(Kseniia Sumarokova)。
- 允许为 Kafka 和 RabbitMQ 引擎使用预定义的连接配置(用法与其他集成表引擎相同)。#31691 (Kseniia Sumarokova)。
- 在 clickhouse-client 中浏览历史记录时始终重新渲染命令提示符。这将提升在处理无法完全显示在屏幕上的超长查询时的易用性。#31675 (alexey-milovidov)(作者:Amos Bird)。
- 添加用于浏览历史记录的按键绑定(取代逐行/历史模式)。 #31641 (Azat Khuzhin).
- 改进对
max_execution_time的检查。修复了某些情况下未进行超时检查、导致查询可能运行过长的问题。#31636 (Raúl Marín)。 - 当由于密码哈希不正确而无法加载
users.xml时,提供了更清晰的异常信息。此更改解决了 #24126。#31557(Vitaly Baranov)。 - 在
ReplicatedMergeTree参数中展开宏时,如果这些宏未在配置中定义,则使用Replicated数据库参数中的分片和副本名称。修复 #31471。#31488(tavplubix)。 - 改进了对
min/max/count投影的分析。现在,在启用allow_experimental_projection_optimization时,虚拟min/max/count投影可以与分区键中的列一起使用。#31474(Amos Bird)。 - 为
clickhouse-local添加--pager支持。 #31457 (Azat Khuzhin). - 修复在交互式查询编辑时编辑器阻塞等待的问题(
waitpid()在收到SIGWINCH时返回 -1,且EDITOR与clickhouse-local/clickhouse-client同时运行)。 #31456 (Azat Khuzhin). - 如果在
JSONCompactStrings(EachRow)格式中字段之后存在多余数据,则抛出异常。 #31455 (Kruglov Pavel). http_send_timeout和http_receive_timeout设置的默认值从 1800(30 分钟)修改为 180(3 分钟)。#31450 (tavplubix)。MaterializedMySQL现在可以处理CREATE TABLE ... LIKE ...DDL 查询。#31410(Stig Bakken)。- 在对 system 表执行
show create table时返回模拟生成的 CREATE 查询语句。 #31391 (SuperDJY). - 此前仅
numbers表函数会显示进度,现在numbers_mt也会显示进度了。#31318 (Kseniia Sumarokova)。 - 现在会使用用户的初始角色来确定适用的行策略,参见 #31080。#31262(Vitaly Baranov)。
- 如果修改了某个已废弃的设置,则在
system.warnings中显示警告。#31252 (tavplubix)。 - 改进了
MergeTree中用于后台清理任务的退避机制。设置项merge_tree_clear_old_temporary_directories_interval_seconds和merge_tree_clear_old_parts_interval_seconds从用户设置中移动到了 MergeTree 设置中。#31180 (tavplubix)。 - 现在,每个副本只会向客户端发送 profile events 计数器的增量信息。#31155 (Dmitry Novik)。这使得
clickhouse-client中的--hardware_utilization选项变得可用。 - 默认启用 clickhouse-client 的多行编辑功能。该改动修复了 #31121。#31123(Amos Bird)。
- 对
ALTER查询中的函数名进行规范化处理。这有助于避免在使用索引/投影创建表与通过ALTER命令添加索引/投影之间出现元数据不匹配。这是对 https://github.com/ClickHouse/ClickHouse/pull/20174 的后续 PR。由于目前没有相关缺陷报告且该场景相对少见,将其标记为改进项。#31095(Amos Bird)。 - 为
RENAME DATABASE/TABLE/DICTIONARY查询添加对IF EXISTS修饰符的支持。当使用该修饰符时,如果要重命名的 DATABASE/TABLE/DICTIONARY 不存在,将不会报错。#31081 (victorgao)。 - 在删除分区时取消垂直合并。这是对 https://github.com/ClickHouse/ClickHouse/pull/25684 和 https://github.com/ClickHouse/ClickHouse/pull/30996 的后续工作。#31057(Amos Bird)。
- ClickHouse 字典源内部的本地会话将不再把其事件发送到会话日志。这修复了在关闭时可能发生的死锁问题(tsan 报警)。此外,此 PR 还修复了不稳定的
test_dictionaries_dependency_xml/。 #31013 (Vitaly Baranov). - 减少 ALTER 命令中的锁定。#31010 (Amos Bird).
- 修复 clickhouse-local 交互模式中的
--verbose选项,并支持将日志写入文件。#30881 (Kseniia Sumarokova). - 在
clickhouse-client中新增了\l、\d、\c命令,类似于 MySQL 和 PostgreSQL 中的对应命令。#30876 (Pavel Medvedev)。 - 对于 clickhouse-local 或 clickhouse-client:如果在使用
--query或--queries-file时同时指定了--interactive选项,则先按非交互模式执行这些查询,然后再进入交互模式。#30851 (Kseniia Sumarokova)。 - 修复可能出现的“The local set of parts of X doesn't look like the set of parts in ZooKeeper”错误(当在 ZooKeeper 中删除 znode 时 DROP 操作失败的情况)。#30826 (Azat Khuzhin).
- Avro 格式现已支持 Kafka。已添加
output_format_avro_rows_in_file设置。#30351 (Ilya Golshtein). - 允许为单个
MaterializedPostgreSQL数据库指定一个或多个 PostgreSQL 模式。修复了 #28901。修复了 #29324。#28933(Kseniia Sumarokova)。 - 将 clickhouse-keeper 内部通信使用的默认端口从 44444 更改为 9234。修复了 #30879。#31799(alesapin)。
- 实现支持 Decimal 参数的 transform 函数。 #31839 (李帅).
- 通过增加对 HDFS URL 结构的额外检查,在 HDFS URL 非法时,修复了调试服务器中的异常中止问题以及发布服务器中的
DB::Exception: std::out_of_range: basic_string错误。#31042 (Kruglov Pavel)。 - 修复
hdfs表函数/引擎中潜在的断言问题,并添加测试。#31036 (Kruglov Pavel).
缺陷修复
- 修复在启用位置参数时 group by / order by / limit by 中的别名解析问题。关闭 #31173。#31741(Kseniia Sumarokova)。
- 修复在包含
Map类型的表中使用Buffer表引擎时的问题。修复了 #30546。#31742(Anton Popov)。 - 修复在启用
use_uncompressed_cache时从MergeTree表读取数据的问题。#31826 (Anton Popov). - 修复了在启用设置
empty_result_for_aggregation_by_empty_set时,无需执行任何操作的 mutation 会卡住的问题。 #32358 (Nikita Mikhaylov). - 修复在写入 protobuf 时跳过列的问题。此 PR 修复了 #31160,参见评论 #31160#issuecomment-980595318。#31988(Vitaly Baranov)。
- 修复在子查询中删除不需要的列时的 bug。如果在查询中存在不带
GROUP BY的聚合函数,即使该聚合函数被认为是不需要的,也不要删除。#32289 (dongyifeng). - 配额尚未用尽,却被视为已超出限制。此 PR 修复了 #31174。#31337(sunny)。
- 在使用部分撤销权限时修复
SHOW GRANTS的行为。此 PR 修复了 #31138。#31249(Vitaly Baranov)。 - 当 ClickHouse 在具有 cgroup 限制的容器中运行时,内存大小被错误估计。#31157 (Pavel Medvedev)。
- 修复当默认表达式的数据类型与列的数据类型不一致时的
ALTER ... MATERIALIZE COLUMN ...查询。#32348(Anton Popov)。 - 修复了在聚合函数
avgWeighted中使用Decimal参数时导致的 SIGFPE 崩溃。修复了 #32053。#32303(tavplubix)。 - 如果
Dictionary表引用了与其同名的 XML 字典,服务器在启动时可能会因报错Cannot attach 1 tables due to cyclic dependencies而启动失败,该问题已修复。修复 #31315。#32288(tavplubix)。 - 修复在使用
Quoted转义规则对Nullable(Float)反序列化 NaN 时的解析错误。#32190 (Kruglov Pavel)。 - XML 字典:在创建表查询中使用的标识符,在升级到新版本时可以限定为
default_database。解决了 #31963。#32187(Maksim Kita)。 - 在使用 quorum 插入时,如果在某些副本上禁用了
replicated_can_become_leader设置,活动副本的数量可能会被错误计算。该问题已修复。 #32157 (tavplubix)。 - Dictionaries: 修复在自定义数据库查询中
{condition}不生效的问题。#32117 (Maksim Kita)。 - 修复在使用
cast_keep_nullable对Nullable进行CAST时的问题(此前在例如toUInt32OrDefault(toNullable(toUInt32(1)))的情况下会触发PARAMETER_OUT_OF_BOUND错误)。 #32080 (Azat Khuzhin). - 在某些罕见场景下修复 Join Storage 的
CREATE TABLE行为。关闭 #31680。#32066 (SuperDJY)。 - 修复在分离 part 时出现的
Directory ... already exists and is not empty错误。#32063(tavplubix)。 MaterializedMySQL(实验特性):修复从 MySQL 读取DECIMAL数据时的错误解析问题。#31990(Håvard Kvålen)。FileLog(实验特性)引擎在创建表失败时会不必要地创建元数据目录。修复 #31962。 #31967(flynn)。- 如果某个
GET_PART条目对应的 part 在所有副本上都丢失,并且同一分区中没有其他 part,那么该条目可能会挂起在复制队列中。在分区键仅由整数类型或Date[Time]类型的列组成的情况下,该问题已被修复。修复了 #31485。#31887(tavplubix)。 - 修复
UUID类型参数下的empty和notEmpty函数问题。修复了 #31819。#31883(Anton Popov)。 - 在构造
KeeperTCPHandler时,将配置路径从keeper_server.session_timeout_ms更改为keeper_server.coordination_settings.session_timeout_ms。operation_timeout同样更改。#31859 (JackyWoo)。 - 修复在使用 Nullable 主键时对 Nullable 类型的非法类型转换问题。(不推荐使用 Nullable 主键——请勿使用。)此修复对应 #31075。#31823(Amos Bird)。
- 修复了 SQL 中递归 UDF 导致的崩溃。关闭 #30856。#31820(Maksim Kita)。
- 修复在字典属性类型为
Nullable时使用显式指定类型的dictGet函数导致的崩溃问题。修复了 #30980。#31800(Maksim Kita)。 - 修复在使用某些 ODBC 驱动时,当 ODBC 查询结果为空会导致的崩溃问题。关闭 #31465。#31766 (Kseniia Sumarokova).
- 修复在禁用查询分析器时的问题(在
query_profiler_real_time_period_ns>0/query_profiler_cpu_time_period_ns>0的情况下,即使查询结束后,查询分析器仍可能保持启用状态)。 #31740 (Azat Khuzhin)。 - 修复了在并发执行
ATTACH PARTITION查询时罕见出现的段错误。 #31738 (tavplubix). - 修复
JSONEachRowWithProgress输出格式中的竞态条件,当输出中同时包含数据行和进度行时可能出现该问题。#31736(Kruglov Pavel)。 - 修复了在执行
ON CLUSTER查询时,如果指定的集群名称是某个Replicated数据库的名称,会报there are no such cluster here错误的问题。#31723 (tavplubix)。 - 修复了在 Nullable 列上调用
decrypt函数时在某些情况下抛出的异常。修复了 #31662。修复了 #31426。#31707(alexey-milovidov)。 - 修复了在字符串包含 UTF-8 字符时 ngrams 函数的问题。#31706 (yandd).
- 设置
input_format_allow_errors_num和input_format_allow_errors_ratio在解析IPv4等域类型时不起作用的问题已修复。修复 #31686。#31697(tavplubix)。 - 修复了在
MATERIALIZE COLUMN中出现的空指针异常问题。 #31679 (Nikolai Kochetov). - 在
Ordinary数据库中尝试重命名 DDL 字典时,RENAME TABLE查询行为不正确,现已修复。 #31638 (tavplubix). - 按预期实现
sparkbar聚合函数,参见:#26175#issuecomment-960353867、comment。#31624(小路)。 - 修复在仅有列名包含无效 UTF-8 序列时生成的无效 JSON。 #31534 (Kevin Michel)。
- 在修复与此优化相关的 bug 之前,禁用
partial_merge_join_left_table_buffer_bytes。参见 #31009)。移除冗余选项partial_merge_join_optimizations。#31528 (Vladimir C)。 - 修复短
INSERT SELECT查询的进度显示。#31510 (Azat Khuzhin). - 修复在 GROUP BY 与位置参数配合使用时的错误行为。关闭 #31280#issuecomment-968696186。 #31420 (Kseniia Sumarokova).
- 修复用于 S3 的 STS 凭证提供程序中出现的
nullptr问题。 #31409 (Vladimir Chebotarev)。 - 从索引分析中移除
notLike函数,因为其实现不正确。#31169(sundyli)。 - 修复 Keeper 中的一个 bug:当部分协调日志丢失且可用快照比最新日志更新时,可能导致无法启动的问题。#31150 (alesapin)。
- 在本地
JOIN时重写右侧分布式表。解决了 #25809。#31105(abel-cheng)。 - 修复使用别名和 WHERE 条件的
Merge表(此前完全无法正常工作)。关闭 #28802。#31044(Kseniia Sumarokova)。 - 修复 JSON_VALUE/JSON_QUERY 在带引号标识符中的处理方式,使其支持在 JSON 路径中包含空格。关闭了 #30971。#31003(Kseniia Sumarokova)。
- 在非面向行的格式中使用
formatRow函数会导致段错误。因此不再允许在此类格式中使用该函数(因为这没有意义)。#31001 (Kruglov Pavel). - 修复了一个在删除物化视图后会导致后续
SELECT查询失败的 bug。问题见 #30691。#30997(Kseniia Sumarokova)。 - 在执行 ATTACH PARTITION ... FROM 和 MOVE PARTITION ... 操作时跳过对
max_partition_size_to_drop的检查 #30995 (Amr Alaa)。 - 修复了
INTERSECT和EXCEPT运算符的某些边缘情况。关闭了 #30803。#30965(Kseniia Sumarokova)。
构建/测试/打包改进
- 修复非 x86 构建上的错误过滤结果。修复了 #31417。修复了 #31524。#31574(alexey-milovidov)。
- 使 ClickHouse 构建完全可复现(在不同机器上生成的二进制在字节级完全一致)。修复了 #22113。#31899(alexey-milovidov)。从二进制文件中移除指向构建目录的文件系统路径,以实现可复现构建。此更改是为了解决 #22113。#31838(alexey-milovidov)。
- 为
zlib-ng、cassandra、mariadb-connector-c以及xz、re2、sentry、gsasl、arrow、protobuf使用我们自己的 CMakeLists。这是为了解决 #20151,也是 #9226 的一部分,是移除构建系统中恼人冗余内容的一小步。#30599(alexey-milovidov)。 - Hermetic 构建:使用固定版本的 libc,并确保在构建过程中不会使用来自宿主操作系统的任何源码或二进制文件。修复了 #27133。修复了 #21435。修复了 #30462。#30011(alexey-milovidov)。
- 新增函数
getFuzzerData(),以便更容易对特定函数进行模糊测试(fuzz)。修复了 #23227。#27526(Alexey Boykov)。 - 在 Docker 内更规范地设置 capabilities。#31802(Constantine Peresypkin)。
- 启用 clang 编译选项
-fstrict-vtable-pointers、-fwhole-program-vtables。#20151(Maksim Kita)。 - 避免为 FreeBSD 交叉编译下载工具链 tar 包。#31672(alexey-milovidov)。
- 初步支持 RISC-V。有关注意事项和已测试的构建命令,请参见 development/build-cross-riscv。#31309(Vladimir Smirnov)。
- 支持在 ARM 机器上使用参数 "-DENABLE_TESTS=OFF" 进行编译。#31007(zhanghuajie)。
ClickHouse 版本 v21.11,发布于 2021-11-09
向后不兼容变更
- 调整 SQL/JSON 函数中
json_path和json参数的顺序(以与标准保持一致)。关闭 #30449。#30474(Kseniia Sumarokova)。 - 移除
MergeTree表设置项write_final_mark。该设置现在始终为true。#30455(Kseniia Sumarokova)。无需采取任何操作,所有表都与新版本兼容。 - 移除函数
bayesAB。如需恢复该函数,请以更新后的形式重新提交。这将关闭 #26233。#29934(alexey-milovidov)。 - 仅当你已经开始使用实验性的
clickhouse-keeper支持时才适用。现在 ClickHouse Keeper 默认使用ZSTD编解码器压缩快照,而不是自定义的 ClickHouse LZ4 分块压缩。可以通过协调设置compress_snapshots_with_zstd_format关闭此行为(在所有 quorum 副本上必须保持一致)。向后不兼容的情况非常少见,只会在新节点向旧节点发送快照(例如在恢复场景中)且旧节点无法读取 ZSTD 格式快照时发生。#29417(alesapin)。
新特性
- 新的异步 INSERT 模式允许在后台累积插入的数据,并将其作为单个批次存储。在客户端,可以通过为带有内联数据或使用独立缓冲区(例如通过 HTTP 协议执行的
INSERT查询)的INSERT查询设置async_insert来启用该模式。如果wait_for_async_insert为 true(默认值),客户端将等待数据刷写到表中。在服务器端,该模式由async_insert_threads、async_insert_max_data_size和async_insert_busy_timeout_ms这些设置进行控制。实现了 #18282。#27537(Anton Popov)。#20557(Ivan)。关于性能说明:使用异步插入时,每秒最多可以执行约 10 000 条独立的 INSERT 查询,因此如果希望达到每秒数百万行的插入性能,仍然建议按批次进行插入。 - 为
clickhouse-local添加了交互模式。现在,你可以直接运行clickhouse-local,在无需连接服务器的情况下获得命令行 ClickHouse 界面,并处理来自文件和外部数据源的数据。同时合并了clickhouse-client和clickhouse-local的代码。关闭 #7203。关闭 #25516。关闭 #22401。#26231(Kseniia Sumarokova)。 - 新增对可执行(可脚本化的)用户自定义函数的支持。此类 UDF 可以使用任何编程语言编写。 #28803 (Maksim Kita).
- 允许为外部数据源预定义连接。这样在使用外部数据源时,就可以避免每次都指定凭证或地址,而是通过名称进行引用。修复了 #28367。#28577(Kseniia Sumarokova)。
- 在
system数据库中添加了INFORMATION_SCHEMA数据库,其中的SCHEMATA、TABLES、VIEWS和COLUMNS视图对应相应的表。解决了 #9770。#28691(tavplubix)。 - 支持
EXISTS (subquery)。解决 #6852。#29731(Kseniia Sumarokova)。 - 用于审计的会话日志。将所有成功和失败的登录和注销事件记录到新的
system.session_log表中。 #22415 (Vasily Nemkov) (Vitaly Baranov). - 支持多维余弦距离和欧几里得距离函数;L1、L2、Lp、Linf 距离和范数。支持对元组进行内积运算以及各种算术运算符操作。这完全解决了 #4509 中的问题,并且实现了更多功能。#27933(Alexey Boykov)。
- 为
INTO OUTFILE和FROM INFILE添加压缩和解压缩支持(支持自动检测或通过额外的可选参数指定)。#27135(Filatenkov Artur)。 - 通过 HTTP
OPTIONS请求添加了 CORS(跨域资源共享)支持。这意味着现在 Grafana 在 serverless 请求场景下可以正常工作,无需任何变通方案。修复了 #18693。#29155(Filatenkov Artur)。 - 包含 JOIN ON 子句的查询现在支持逻辑或(OR)。 #21320 (Ilya Golshtein).
- 新增函数
tokens。该函数允许使用非字母数字的 ASCII 字符作为分隔符,将字符串拆分为标记。 #29981 (Maksim Kita)。新增函数ngrams,用于从文本中提取 n-gram。已关闭 #29699。 #29738 (Maksim Kita)。 - 新增 Unicode 规范化函数:
normalizeUTF8NFC、normalizeUTF8NFD、normalizeUTF8NFKC、normalizeUTF8NFKD。#28633 (darkkeks)。 - 在 ClickHouse 中使用
FileLog表引擎对应用程序日志文件进行流式消费。它类似于Kafka或RabbitMQ引擎,但用于本地文件系统中仅追加写入并会轮转的日志文件。解决了 #6953。#25969(flynn)(Kseniia Sumarokova)。 - 添加
CapnProto输出格式,重构CapnProto输入格式。#29291 (Kruglov Pavel). - 允许在查询中使用二进制字面量来书写数字。例如
SELECT 0b001;。#29304(Maksim Kita)。 - 新增
hashed_array字典类型。在使用具有多个属性的字典时可以节省内存。解决了 #30236。#30242(Maksim Kita)。 - 添加了
JSONExtractKeys函数。#30056(Vitaly)。 - 添加了函数
getOSKernelVersion——返回操作系统内核版本的字符串。#29755 (Memo)。 - 添加了
MD4和SHA384函数。MD4 是一种已过时且不安全的哈希函数,仅应在极少数情况下使用,例如某些遗留系统已经在使用 MD4,而你需要得到与其完全相同的结果时。 #29602 (Nikita Tikhomirov). - 可以通过在配置文件中将
hsts_max_age参数设置为正数,为 ClickHouse HTTP 服务器启用 HSTS。#29516 (凌涛)。 - 添加对华为 OBS 存储的支持。关闭 #24294。#29511(kevin wan)。
- 新增函数
mapContainsKeyLike,用于判断 map 中是否存在键名匹配简单正则表达式的元素。 #29471 (凌涛)。新增函数mapExtractKeyLike,用于从 map 中提取仅保留键名匹配指定模式的元素。 #30793 (凌涛)。 - 已实现
ALTER TABLE x MODIFY COMMENT。#29264(Vasily Nemkov)。 - 新增了 ClickHouse 中尚未提供、但可通过 H3 API 使用的 H3 检查函数:https://h3geo.org/docs/api/inspection。#29209(Bharat Nallan)。
- 允许在 Replicated 数据库中对非复制表执行 ALTER TABLE FETCH 和 ATTACH 操作。#29202 (Kevin Michel)。
- 新增了设置
output_format_csv_null_representation:其作用与output_format_tsv_null_representation相同,但用于 CSV 输出。#29123 (PHO)。 - 新增函数
zookeeperSessionUptime(),用于返回当前 ZooKeeper 会话的存活时间(以秒为单位)。#28983 (tavplubix). - 实现了
h3ToGeoBoundary函数。#28952(Ivan Veselov)。 - 添加聚合函数
exponentialMovingAverage,可用作窗口函数。这一变更关闭了 #27511。#28914(alexey-milovidov)。 - 允许将表列的子列包含到
DESCRIBE查询结果中(可通过设置describe_include_subcolumns启用)。 #28905 (Anton Popov). Executable、ExecutablePool新增选项send_chunk_header。如果该选项为 true,则会在数据块之前向客户端发送一行包含该块行数(rows_count)及换行符的头信息。 #28833 (Maksim Kita)。tokenbf_v1和ngram支持键类型为 String 或 FixedSring 的 Map。它在使用 map 键作为过滤条件进行查询时可以增强数据跳过能力。sql CREATE TABLE map_tokenbf ( row_id UInt32, map Map(String, String), INDEX map_tokenbf map TYPE ngrambf_v1(4,256,2,0) GRANULARITY 1 ) Engine=MergeTree() Order by id使用上述表时,查询select * from map_tokebf where map['K']='V'会跳过不包含键A的 granule。当然,具体会跳过多少行取决于你设置的granularity和index_granularity。#28511 (凌涛).- 将性能剖析事件从服务器发送到客户端。引入了新的数据包类型
ProfileEvents。已关闭 #26177。#28364(Dmitry Novik)。 - 为
FixedString和String数据类型提供位移运算。此更改修复了 #27763 中的问题。#28325(小路)。 - 在数据库引擎 MaterializedPostgreSQL 中支持动态添加 / 删除参与复制的表。支持对数据库设置执行 ALTER 操作。关闭 #27573。#28301(Kseniia Sumarokova)。
- 新增函数 accurateCastOrDefault(x, T)。修复 #21330。作者 @taiyang-li。#23028(Maksim Kita)。
- 新增函数
toUUIDOrDefault、toUInt8/16/32/64/256OrDefault、toInt8/16/32/64/128/256OrDefault,使用户可以在字符串解析失败时指定默认值(非 null)。 #21330 (taiyang-li)。
性能优化
- 后台合并任务可以相互抢占执行,并按合适的优先级进行调度。现在,长时间运行的合并任务不会阻止短合并任务继续执行。这样可以更好地调度和控制合并的执行,减少出现 “too many parts” 错误的概率。#22381。#25165(Nikita Mikhaylov)。新增:允许同时执行的合并和变更(mutations)任务数量可以多于后台线程池中的线程数量。合并和变更会根据其大小依次分步执行(越小优先级越高)。要执行的任务数与线程数的比例由设置
background_merges_mutations_concurrency_ratio控制,默认值为 2。#29140(Nikita Mikhaylov)。 - 允许对远程文件系统使用异步读取,减少从远程文件系统读取时的寻道操作次数。这极大地提升了性能,并使实验性的
web和s3磁盘在某些条件下比 EBS 运行得更快。#29205(Kseniia Sumarokova)。与此同时,web磁盘类型(托管在 Web 服务器上的静态数据集)也从实验特性毕业,正式达到生产可用级别。 - 在
clickhouse-client中,带有INTO OUTFILE的查询现在将使用多线程。修复了在使用INTO OUTFILE时进度条闪烁的问题。此更改关闭了 #30873。此更改关闭了 #30872。#30886(alexey-milovidov)。 - 减少在某些类型的
SELECT查询中从磁盘读取的冗余压缩数据量(仅适用于MergeTree引擎族)。#30111 (alesapin)。 - 在 MergeTree 系列表引擎中读取压缩数据块时,移除了一些多余的
seek调用。#29766 (alesapin). - 使
url表函数能够并行处理多个 URL。修复了 #29670 和 #29671。#29673(alexey-milovidov)。 - 在启用
optimize_aggregation_in_order设置时,提升按主键顺序聚合的性能。 #30266 (Anton Popov). - 现在 ClickHouse 在与外部 S3 通信时会使用 DNS 缓存。#29999 (alesapin)。
- 为外部数据库(例如 MySQL)添加对
IS NULL/IS NOT NULL下推的支持。#29463(Azat Khuzhin)。将isNull/isNotNull转换为IS NULL/IS NOT NULL,以便下推到外部数据库(例如 MySQL)。#29446(Azat Khuzhin)。 - 对 Dictionary 表执行的 SELECT 查询现在会使用多线程。#30500 (Maksim Kita)。
- 提升
Decimal列在筛选(WHERE 操作)时的性能。#30431(Jun Jin)。 - 使用性能更优的
popcnt/ctz实现,移除过滤操作中的多分支代码。 #29881 (Jun Jin). - 改进过滤 bytemask 生成器函数(用于 WHERE 运算符),将 SSE/AVX2/AVX512 指令集统一到一个实现中。注意,默认情况下 ClickHouse 仅使用 SSE,因此这只与自定义构建相关。#30014 (jasperzhu). #30670 (jasperzhu).
- 提高 SUM 聚合函数在 Nullable 浮点数上的性能。 #28906 (Raúl Marín).
- 在使用多个磁盘时加速数据分片的加载过程。思路类似于 https://github.com/ClickHouse/ClickHouse/pull/16423。生产环境中显示性能提升:24 分钟缩短为 16 分钟。#28363(Amos Bird)。
- 将 S3 分段上传的默认分片大小减小,以降低内存使用。#28679 (ianton-ru).
- 提升
bitmapAnd函数的性能。#28332 (dddounaiking)。 - 当合并仍在进行时,移除了
StorageMergeTree中效果不佳的变更通知。#27552 (Vladimir Chebotarev)。 - 尝试优化字符串比较性能。 #28767 (alexey-milovidov).
- 主键索引和分区过滤器现在支持 tuple。 #29281 (凌涛)。
- 如果查询中包含多个具有相同参数但
level参数不同的 quantile 聚合函数,并且启用了optimize_syntax_fuse_functions设置,它们将被融合在一起,并在同一次遍历中执行。#26657(hexiaoting)。 - 现在,针对主键的第一个表达式的 min-max 聚合已通过投影(projection)进行了优化。此改动用于解决 #329。#29918(Amos Bird)。
实验性功能
- 为 ClickHouse Keeper 新增支持修改节点配置(在
.xml文件中)。#30372 (alesapin)。 - 新增
sparkbar聚合函数。此变更解决了 #26175 中的问题。#27481 (小路)。注意:该函数存在一个已知缺陷,其行为将在未来版本中进行调整。
改进
- 允许用户无需重启即可更改日志级别。#29586 (Nikolay Degterinsky)。
- 对 SQL UDF 进行了多项改进。用于管理 SQL 用户自定义函数的查询现在支持
ON CLUSTER子句。例如CREATE FUNCTION test_function ON CLUSTER 'cluster' AS x -> x + 1;。修复 #30666。#30734(Maksim Kita)。支持CREATE OR REPLACE、CREATE IF NOT EXISTS语法。#30454(Maksim Kita)。新增DROP IF EXISTS支持。例如DROP FUNCTION IF EXISTS test_function。#30437(Maksim Kita)。支持 lambda 表达式。例如CREATE FUNCTION lambda_function AS x -> arrayMap(element -> element * 2, x);。#30435(Maksim Kita)。为clickhouse-local提供 SQL 用户自定义函数支持。#30179(Maksim Kita)。 - 全局启用逐查询内存分析器(将
memory_profiler_step设为 4MiB)。#29455(Azat Khuzhin)。 - 已在
system.data_skipping_indices中新增列data_compressed_bytes、data_uncompressed_bytes、marks_bytes。已在system.parts中新增列secondary_indices_compressed_bytes、secondary_indices_uncompressed_bytes、secondary_indices_marks_bytes。已关闭 #29697。#29896(Maksim Kita)。 - 为 system.tables 添加名为
table的别名,并为 system.databases 添加名为database的别名 #29677。#29882(kevin wan)。 - 在服务器启动时正确解析表之间的依赖关系。修复 #8004,修复 #15170。#28373(tavplubix)。
- 当在函数
divide、intDiv和modulo中分母为 Nullable 时,避免出现“Division by zero”错误。解决 #22621。#28352(Kruglov Pavel)。 - 允许在文本格式中将
Date数据类型的值解析为YYYYMMDD,除了YYYY-MM-DD形式之外。此更改修复了 #30870。#30871(alexey-milovidov)。 - Web UI:在表格单元格中渲染条形图。 #29792 (alexey-milovidov).
- 用户现在可以在创建字典时添加注释:
CREATE DICTIONARY ... COMMENT 'vaue'... #29899 (Vasily Nemkov)。用户现在也可以在CREATE DATABASE语句中为数据库添加注释 ... #29429 (Vasily Nemkov)。 - 引入
compiled_expression_cache_elements_size设置。如果你将来需要用到这个设置,你自然会知道它是做什么的。#30667(Maksim Kita)。 - clickhouse-format 现在支持选项
--query。在之前的版本中,必须通过 stdin 传入查询。#29325 (凌涛)。 - 支持对
Memory数据库中的表执行ALTER TABLE操作。Memory数据库用于clickhouse-local。#30866 (tavplubix). - 现在,
arrayStringConcat已支持所有可序列化类型的数组。#30840 (Nickita Taranov)。 - ClickHouse 现在在获取系统内存大小时会考虑 Docker/cgroup 的限制。参见 #25662。#30574(Pavel Medvedev)。
- 现在从 PostgreSQL 数据库获取的表结构更加可靠。#30477 (Kseniia Sumarokova).
- 在 GROUP BY 和 ORDER BY 中全面支持位置参数。 #30433 (Kseniia Sumarokova).
- 允许使用 JSONExtractString 将非字符串元素提取为字符串类型。此更改对应于 pull/25452#issuecomment-927123287。 #30426(Amos Bird)。
- 新增支持在针对
GraphiteMergeTree的SELECT查询中使用 FINAL 子句。 #30360 (Nikita Mikhaylov). - 对副本克隆以及为损坏数据片段入队抓取操作进行了小幅改进,可避免在复制队列中极其罕见出现
GET_PART条目卡住的问题。 #30346 (tavplubix). - 允许在
user_files目录中使用指向文件的符号链接,以用于文件表函数。#30309 (Kseniia Sumarokova). - 修正了
Date32与Date、DateTime、DateTime64和String的比较。 #30219 (liang.huang). - 允许从
MergeTree表中删除SAMPLE BY表达式(ALTER TABLE <table> REMOVE SAMPLE BY)。 #30180 (Anton Popov). - 现在,
Keeper(作为clickhouse-server的一部分)如果能够连接到其他节点,将会以异步方式启动。#30170 (alesapin)。 - 现在
clickhouse-client支持内置多行编辑。#30143(Amos Bird)。 polygon字典(反向地理编码):在将store_polygon_key_column设置为 true 时,新增支持通过 SELECT 查询读取字典内容。解决了 #30090。#30142(Maksim Kita)。- 在 Play UI 中添加 ClickHouse 徽标。 #29674 (alexey-milovidov).
- 在从
Arrow、ArrowStream、Parquet和ORC等 Arrow 支持的格式读取列时改进了异常信息。解决了 #29926。#29927(alexey-milovidov)。 - 修复
Buffer表中刷新和启动之间的数据竞争问题。该问题可能会在测试中出现。#29930 (Azat Khuzhin)。 - 修复
DatabaseMemory和LiveView执行DROP TABLE时的lock-order-inversion(锁顺序反转)问题。Live View 是一个实验性特性。Memory 数据库用于 clickhouse-local。#29929 (Azat Khuzhin). - 修复定期重载字典与重载配置之间的锁顺序反转问题。 #29928 (Azat Khuzhin).
- 将 zoneinfo 文件更新至 2021c。#29925 (alexey-milovidov).
- 为
clickhouse-copier新增支持配置重试次数及其间隔时间的功能。#29921 (Azat Khuzhin)。 - 添加
shutdown_wait_unfinished_queries服务器配置项,以允许在关闭时等待正在运行的查询完成,最长等待时间为shutdown_wait_unfinished。这是为了解决 #24451。#29914(Amos Bird)。 - 新增对峰值内存使用情况的追踪能力(在
system.trace_log中新增 trace_typeMemoryPeak)。 #29858 (Azat Khuzhin). - PostgreSQL 外部表:为获取副本标识索引的查询添加了分区表前缀 'p'。#29828 (Shoh Jahon).
- 在 mutate/merge 操作期间应用
max_untracked_memory/memory_profiler_step/memory_profiler_sample_probability,用于在合并过程中分析内存使用情况。 #29681 (Azat Khuzhin). - 查询混淆器:
clickhouse-format --obfuscate现在支持更多类型的查询。#29672 (alexey-milovidov)。 - 修复了一个问题:
clickhouse-format --obfuscate无法处理包含内置字典(regionTo...函数)的查询。#29667(alexey-milovidov)。 - 修复 JSON 函数对 Nullable 类型的不正确处理。此修复解决了 #29615。将其标记为改进,因为 https://github.com/ClickHouse/ClickHouse/pull/28012 尚未发布。#29659(Amos Bird)。
- 默认提高
listen_backlog(以匹配较新 Linux 内核中的默认值)。#29643 (Azat Khuzhin). - 当服务器配置
dictionaries_config、models_config、user_defined_executable_functions_config发生更改时,重新加载字典、模型和用户自定义的可执行函数。关闭 #28142。#29529(Maksim Kita)。 - 去除对 projection 名称的不必要限制。现在 projection 名称可以以
tmp_开头。#29520(Amos Bird)。 - 修复了在包含嵌套子查询的 mutation 中出现的
There is no query or query context has expired错误。当表为复制表且禁用了allow_nondeterministic_mutations设置时,不再允许在 mutation 中使用子查询。#29495 (tavplubix)。 - 在运行时对
max_concurrent_queries应用配置变更(无需重启)。#29414(Raúl Marín)。 - 新增了设置
use_skip_indexes。 #29405 (Maksim Kita)。 - 为内存 part 添加对
FREEZE的支持(用于备份)。 #29376 (Mo Xuan). - 为
clickhouse-benchmark透传初始 query_id(此前如果通过clickhouse-benchmark运行远程查询,各分片上的查询不会通过initial_query_id与初始查询关联)。#29364 (Azat Khuzhin)。 - 跳过索引
tokenbf_v1和ngrambf_v1:新增对键类型为String或FixedString的Array数据类型的支持。#29280 (Maksim Kita)。跳过索引tokenbf_v1和ngrambf_v1:新增对键类型为String或FixedString的Map数据类型的支持。作者 @lingtaolf。#29220 (Maksim Kita)。 - 函数
has:新增对Map数据类型的支持。#29267 (Maksim Kita)。 - 为 clickhouse-keeper 添加
compress_logs设置,用于将 clickhouse-keeper 的(复制状态机)日志压缩为ZSTD格式。实现:#26977。#29223(alesapin)。 - 添加
external_table_strict_query设置——即使不兼容,也会强制在查询中将整个 WHERE 表达式传递给外部数据库。 #29206 (Azat Khuzhin). - 当使用
ARRAY JOIN时禁用 projection。在之前的版本中,对 projection 的分析可能会导致ARRAY JOIN中的别名失效。#29139(Amos Bird)。 - 在
MsgPack输入/输出格式中支持更多类型。#29077 (Kruglov Pavel)。 - 允许在
ORC输入/输出格式中读写LowCardinality列。 #29062 (Kruglov Pavel). - 从
system.distributed_ddl_queue中执行SELECT可能会显示不正确的值,该问题已修复。#29061 (tavplubix)。 - 修复 HTTP 连接在处理未知方法时的行为。解决了 #29050。#29057(Filatenkov Artur)。
clickhouse-keeper:修复clickhouse-keeper-converter中的一个 bug,该 bug 在从 ZooKeeper 日志(非快照)中恢复数据时可能导致部分数据丢失。#29030(小路)。修复clickhouse-keeper-converter中的一个 bug,该 bug 可能导致 ZooKeeper 日志反序列化不正确。#29071(小路)。- 应用
CREATE ... AS SELECT查询中的设置(修复:#28810)。#28962(Azat Khuzhin)。 - 在执行 ALTER TABLE ... ON CLUSTER ... REPLACE/MOVE PARTITION FROM/TO ... 时尊重默认数据库设置 #28955 (anneji-dev)。
- gRPC 协议:允许客户端更改服务端压缩设置。 #28953 (Vitaly Baranov).
- 在读取用于异步指标的温度传感器时跳过 “no data” 异常。解决了 #28852。#28882(alexey-milovidov)。
- 修复了一个逻辑竞态条件,该问题在极少数情况下可能会导致已存在的字典出现
Dictionary not found错误。#28853 (tavplubix). - 放宽用于 If 组合子检查的嵌套函数限制(但禁止嵌套相同的组合子)。 #28828 (Azat Khuzhin).
- 修复在服务器终止时可能出现的未捕获异常。#28761 (Azat Khuzhin).
- 如果 mutation/merge 持续时间异常地长,则禁止清理可能被正在执行的 mutation/merge 使用的 tmp 目录。 #28760 (Azat Khuzhin).
- 允许在使用别名时启用优化
optimize_arithmetic_operations_in_aggregate_functions = 1。 #28746 (Amos Bird)。 - 为
ReplicatedMergeTree实现detach_not_byte_identical_parts设置,使其在合并/变更后对非字节级完全一致的部件执行分离而不是删除操作。 #28708 (Azat Khuzhin). - 为
MergeTree实现max_suspicious_broken_parts_bytes设置(用于限制所有损坏分片(part)的总大小,默认值为1GiB)。#28707 (Azat Khuzhin). - 在
RabbitMQ表设置中启用宏展开。 #28683 (Vitaly Baranov)。 - 恢复了使用多线程读取
Log引擎表数据的功能。#28125(Vitaly Baranov)。 - 修复 JSON 函数在处理 NULL 列时的异常行为。修复了 #27930。#28012(Amos Bird)。
- 允许为跳过索引单独设置与列分开的 Mark/Uncompressed 缓存大小。 #27961 (Amos Bird).
- 允许将带有
USING的 JOIN 与其他 JOIN 类型混用。#23881 (darkkeks)。 - 更新 aws-sdk 子模块,以支持 Yandex Cloud S3 的限流处理。#30646 (ianton-ru)。
- 修复在处理 gRPC 调用时于查询处理结束后释放 query ID 和 session ID 的问题。#29954 (Vitaly Baranov)。
- 修复
AccessControlManager的关闭逻辑,以解决测试偶发失败的问题。#29951(Vitaly Baranov)。 - 修复从
HDFS读取时触发的断言失败。更新 libhdfs3 库,使其能够在调试构建中运行测试。关闭 #29251。关闭 #27814。#29276(Kseniia Sumarokova)。
构建 / 测试 / 打包改进
- 为 Aarch64 机器新增对 FreeBSD 构建的支持。#29952 (MikaelUrankar).
- ClickHouse 不再需要递归子模块。#30315 (alexey-milovidov).
- ClickHouse 现在可以使用 Musl 进行静态构建。该功能以实验性质提供,目前不支持构建
odbc-bridge、library-bridge、与 CatBoost 的集成以及部分库。#30248 (alexey-milovidov). - 为
AArch64和Darwin(macOS) 构建启用Protobuf、Arrow、ORC、Parquet支持,从而关闭了 #29248 和 #28018。#30015 (alexey-milovidov). - 添加对 PowerPC(powerpc64le)的交叉编译构建支持,从而关闭了 #9589。为 AArch64 和 PowerPC 启用与 MySQL 交互的支持,从而关闭了 #26301。#30010 (alexey-milovidov).
- 在交叉编译工具链中仅保留必要文件,并将其作为子模块包含(此前是以 tarball 的形式下载)。#29974 (alexey-milovidov).
- 在 ClickHouse 中为
select语句解析器实现结构感知模糊测试方法。#30012 (Paul). - 为 clang 启用实验性的
constexpr表达式求值器,以加速模板代码编译。#29668 (myrrc). - 新增支持:在不使用新符号的前提下,可使用较新版本的 glibc 进行编译。#29594 (Azat Khuzhin).
- 通过启用 clang 的优化选项,减小 Debug 构建生成的二进制文件体积。#28736 (flynn).
- 现在所有用于 CI 的镜像都会放置在单独的 Docker Hub 仓库中。#28656 (alesapin).
- 改进对使用 clang-13 进行构建的支持。#28046 (Sergei Semin).
- 为
clickhouse-client新增打印原始 profile 事件的功能(可用于调试和测试)。#30064 (Azat Khuzhin). - 为 clickhouse-server unit 添加时间依赖关系(systemd 和 sysvinit init)。#28891 (Azat Khuzhin).
- 在符号重新加载时重新加载堆栈跟踪(stacktrace)缓存。#28137 (Amos Bird).
Bug 修复
- 用于在 UTF-8 字符串中进行不区分大小写搜索的函数(例如
positionCaseInsensitiveUTF8和countSubstringsCaseInsensitiveUTF8)在极少数情况下可能会错误地将实际上不匹配的子字符串识别为匹配,该问题已修复。 #30663 (tavplubix). - 修复在加密磁盘上读取空文件时的问题。 #30494 (Vitaly Baranov).
- 修复在分布式查询中,当设置
legacy_column_name_of_tuple_literal = 0时,将 OR 条件链转换为IN(由设置optimize_min_equality_disjunction_chain_length控制)的问题。#28658 (Anton Popov). - 即使将
insert_allow_materialized_columns设置为 0,也允许在分布式表中使用物化列作为分片键。#28637 (Vitaly Baranov)。 - 修复在同时设置
TO和FROM且结果集为空时使用ORDER BY ... WITH FILL的问题。 #30888 (Anton Popov). - 修复在具有两个以上操作数的 AND/OR 表达式中未使用集合索引的问题。修复了 #30416。#30887(Amos Bird)。
- 修复在物化带哈希函数的 projection 时发生的崩溃,修复了 #30861。该问题与 https://github.com/ClickHouse/ClickHouse/pull/28560 类似,根本原因都是对“header 为空”这一不变式缺乏正确理解。#30877(Amos Bird)。
- 修复了在
ReplicatedMergeTree中从 ZooKeeper 路径提取辅助 ZooKeeper 名称时存在的歧义问题。此前,如果 ZooKeeper 路径中包含冒号,服务器在启动时可能会失败并报错Unknown auxiliary ZooKeeper name。修复了 #29052。此外,之前允许指定不以斜杠开头的 ZooKeeper 路径,但该行为现已弃用,且不再允许使用此类路径创建新表。辅助 ZooKeeper 名称中同样不允许出现斜杠和冒号。#30822(tavplubix)。 - 当 localBackup 因某些原因失败时,清理临时目录。#30797 (ianton-ru).
- 修复了在非复制
MergeTree表中,REPLACE/MOVE PARTITION与后台合并之间的竞争条件,该问题可能导致部分被移动/替换的数据残留在分区中。修复了 #29327。#30717(tavplubix)。 - 在 PREWHERE 条件恒为 true 时,修复 PREWHERE 与 WHERE 联用时的行为。 #30668 (Azat Khuzhin).
- Limit 下推优化可能会引发
Cannot find column错误。修复了 #30438。#30562(Nikolai Kochetov)。 - 在将
isNotNull/isNull重写为IS [NOT] NULL时补全缺失的括号(修复包含isNotNull(1)+isNotNull(2)等内容的查询)。 #30520 (Azat Khuzhin). - 修复对同一张表执行带标量子查询的 ALTER 操作时导致的死锁,关闭 #30461。#30492(Vladimir C)。
- 修复了一个问题:在执行 REPLACE PARTITION 期间,如果会话过期,可能会导致段错误。 #30432 (tavplubix).
- 在使用聚合 projection 时,包含类似
IN (subquery)条件的查询可能会返回不正确的结果。已修复为 projection 创建集合的方式。 #30310 (Amos Bird)。 - 修复在启用 projection 时执行
JOIN查询时的列别名解析问题。此更改修复了 #30146。#30293(Amos Bird)。 - 修复
replaceRegexpAll函数中的一些问题。#30292 (Memo)。 - 修复 ComplexKeyHashedDictionary 与 ComplexKeySparseHashedDictionary 在从布局配置中解析
preallocate选项时的问题。 #30246 (Maksim Kita). - 修复
[I]LIKE函数。关闭 #28661。#30244(Nikolay Degterinsky)。 - 修复在 multiIf 中使用 shortcircuit 和 LowCardinality 时发生的崩溃问题。 #30243 (Raúl Marín).
- 修复 FlatDictionary 和 HashedDictionary 在可为 NULL 属性上的 bytes_allocated 计算。#30238(Maksim Kita)。
- 在多个 JOIN 中允许使用以数字开头的标识符。#30230(Vladimir C)。
- 修复在将
max_read_buffer_size设置为0时从MergeTree读取数据的问题(这种配置可能导致抛出Can't adjust last granule、LOGICAL_ERROR等异常,甚至造成数据丢失)。 #30192 (Azat Khuzhin). - 修复在使用
min_bytes_to_use_direct_io时pread_fake_async/pread_threadpool的问题。#30191 (Azat Khuzhin). - 修复
INSERT SELECT在基于Nullable列填充MATERIALIZED列时会产生错误填充的问题。 #30189 (Azat Khuzhin). - 为函数
initializeAggregation添加对可空参数的支持。 #30177 (Anton Popov)。 - 修复在包含
GLOBAL IN和WITH TOTALS的查询中出现的Port is already connected错误。仅针对 21.9 和 21.10。#30086 (Nikolai Kochetov)。 - 修复 MergeTree 中
MOVE PARTITION与合并/变更操作之间的竞态条件。 #30074 (Azat Khuzhin). - 在服务器重启后,已删除的
Memory数据库可能会重新出现,此问题已修复(#29795)。另外新增了force_remove_data_recursively_on_drop设置项,作为在删除Ordinary数据库时遇到Directory not empty错误的变通方案(因为在云环境中无法手动清理残留数据)。#30054(tavplubix)。 - 通过
tuple()修复示例程序中的崩溃,关闭 #30004。#30016(flynn)。 - 尝试关闭 issue:#29965。#29976(hexiaoting)。
- 修复
FileChecker与StorageLog/StorageStripeLog之间可能存在的数据竞争。 #29959 (Azat Khuzhin). - 修复
StorageLog中LogSink::writeMarks()与LogSource之间的数据竞争问题。 #29946 (Azat Khuzhin). - 修复 MergeTree 表并发查询限制中潜在的资源泄漏问题,该问题是在 https://github.com/ClickHouse/ClickHouse/pull/19544 中引入的。#29879(Amos Bird)。
- 修复系统表重建检查逻辑(此前无法检测到枚举值的变更)。 #29857 (Azat Khuzhin).
- MaterializedMySQL:修复了一个问题:当与 MySQL 的连接丢失时,会导致只能处理事务的一部分。#29837 (Håvard Kvålen)。
- 避免在极其罕见的情况下出现
Timeout exceeded: elapsed 18446744073.709553 seconds错误,该错误可能是由内核中的某个 bug 引起。修复了 #29154。#29811(tavplubix)。 - 修复在
ATTACH TABLE ... FROM 'path'查询中,将非字符串字面量用作路径时出现的错误类型转换问题。这可能导致读取未初始化内存。#29790 (alexey-milovidov). - 修复在
GROUP BY过程中对LowCardinality的并发访问问题(与Buffer表结合使用时可能会导致问题)。#29782 (Azat Khuzhin). - 修复了在分布式查询中,当分片混用版本
<= 21.3和>= 21.4,GROUP BY键由多个且均为固定大小的列构成,并启用了两级聚合(参见group_by_two_level_threshold和group_by_two_level_threshold_bytes)时,结果中出现具有相同键的多行数据(错误的GROUP BY)的问题。修复了 #29580。#29735(Nikolai Kochetov)。 - 修复了在服务器重启时设置
materialized_postgresql_tables_list时出现的不正确行为。见 #28529。#29686(Kseniia Sumarokova)。 - 在下推优化过程中,过滤谓词中的条件可能会丢失。#29625 (Nikolai Kochetov).
- 修复在包含别名和短路求值表达式时的 JIT 表达式编译问题。关闭 #29403。#29574(Maksim Kita)。
- 修复在
ALTER MODIFY查询中,当在DEFAULT表达式中使用类似x.y.z...这样的错误表标识符时可能出现的罕见段错误。修复了 #29184。#29573(alesapin)。 - 修复
GROUP BY WITH TOTALS HAVING中的空指针解引用问题(当HAVING中使用的列未被选出时)。 #29553 (Azat Khuzhin)。 - 当同时对 Join table engine 表进行读写操作时避免发生死锁。 #29544 (Raúl Marín).
- 修复了
pathStartsWith检查中的 bug,原因是此前对std::mismatch的使用存在问题:The behavior is undefined if the second range is shorter than the first range.。#29531(Kseniia Sumarokova)。 - 在 ODBC bridge 中为
Invalid cursor state错误添加重试机制。该错误是可重试的。关闭 #29473。#29518(Kseniia Sumarokova)。 - 修复了在加载
Lazy数据库时对表名的错误解析。修复了 #29456。#29476(tavplubix)。 - 修复在下推
HAVING谓词的子查询中可能出现的Block structure mismatch错误。修复了 #29010。#29475(Nikolai Kochetov)。 - 修复 greatest/least 函数中出现的
Cannot capture columns逻辑错误。关闭 #29334。#29454(Kruglov Pavel)。 - RocksDB 表引擎:修复在多次打开数据库时出现的竞争条件(并重新启用一些在 CI 上可以触发该问题的测试)。#29393 (Azat Khuzhin).
- 修复在配置错误时,replicated access storage 未能正常关闭的问题。 #29388 (Kevin Michel).
- 由于不具备内存安全性,移除了窗口函数
nth_value。关闭了 #29347。#29348(alexey-milovidov)。 - 修复投影部分的垂直合并问题。修复了 #29253。此 PR 还修复了由 https://github.com/ClickHouse/ClickHouse/pull/25165 中引入的若干投影合并/变更相关问题。#29337(Amos Bird)。
- 修复在为 Replicated 数据库添加新副本时 DDL 查询卡住的问题。#29328(Kevin Michel)。
- 修复连接超时问题(
send_timeout/receive_timeout)。#29282(Azat Khuzhin)。 - 修复在重新创建或创建新的
ReplicatedMergeTree副本时,如果某个表的列包含带有大小写不敏感函数的默认表达式,可能出现的Table columns structure in ZooKeeper is different from local table structure异常。#29266(Anton Popov)。 - 通过 TCP 向客户端发送常规的
Database doesn't exist错误(UNKNOWN_DATABASE),而不是Attempt to read after eof(ATTEMPT_TO_READ_AFTER_EOF)。#29229 (Azat Khuzhin). - 修复在 Avro 输入格式中向类型为 LowCardinality(Nullable) 的列插入数据时出现的段错误。 #29132 (Kruglov Pavel).
- 在启用服务器间密钥时禁止重用先前的凭据(在通过 Buffer/Kafka 向为该集群配置了服务器间密钥的 Distributed 表执行 INSERT 之前,可能会重用此前为该连接设置的用户)。 #29060 (Azat Khuzhin).
- 在与字典进行 JOIN 时正确处理
any_join_distinct_right_table_keys,解决 #29007。#29014(Vladimir C)。 - 修复在对别名列执行 join 时出现的 “Not found column ... in block” 错误,关闭 #26980。#29008(Vladimir C)。
- 修复
GLOBAL IN子查询中使用的线程数(自从修复 #19414 bug 之后,该子查询一直只在单线程中执行)。#28997(Nikolai Kochetov)。 - 修复当 ORDER BY 包含 WITH FILL 时的不正确优化。关闭 #28908。关闭 #26049。#28910(alexey-milovidov)。
- 使用 const 参数修复高阶数组函数中
arrayCompact的SIGSEGV错误以及arrayDifference和arrayCumSumNonNegative的ILLEGAL_COLUMN错误。 #28904 (Azat Khuzhin). - 修复在设置
mutations_sync=2时等待 mutation 的问题。 #28889 (Azat Khuzhin). - 修复在查询外部数据库(如 MySQL)时,在
IN中使用多列(例如(k,v) IN ((1, 2)))的问题。#28888(Azat Khuzhin)。 - 修复在短路函数求值中与
LowCardinality相关的 bug,并关闭 #28884。#28887(Kruglov Pavel)。 - 修复从紧凑数据片段读取子列时的问题。#28873 (Anton Popov)。
- 修复了
DROP PART与REPLACE/MOVE PARTITION之间的竞争条件,该问题在极少数情况下可能导致副本状态不一致。#28864 (tavplubix)。 - 修复使用短路求值时的表达式编译。#28821 (Azat Khuzhin).
- 修复在对所有副本进行硬重启后,
ReplicatedMergeTree副本在极少数情况下可能出现数据不一致的问题。该错误表现为Part ... intersects (previous|next) part ...。 #28817 (alesapin)。 - 更好地检查连接是否可用,并在
RabbitMQ关闭时捕获任何异常,以防万一。#28797 (Kseniia Sumarokova). - 修复 ReplicatedMergeTreeQueue 中的无害竞态条件。按理说用户不应该感知到这一问题,但它可能会导致一些隐蔽的错误。#28734 (alesapin)。
- 修复在出现异常时,带有部分创建聚合投影的
SELECT查询可能发生的崩溃问题。#28700 (Amos Bird)。 - 修复了在创建分布式表时,由于传入参数错误而导致的核心转储问题。#28686 (Zhiyong Wang)。
- 为 system.processes 表添加 Settings.Names 和 Settings.Values 别名。#28685 (Vitaly).
- 支持 S2 Geometry 库:修正
s2RectAdd和s2RectContains函数所需参数的数量。#28663(Bharat Nallan)。 - 修复在使用 Nullable 或 LowCardinality 主键时发生的无效常量类型转换。 #28636 (Amos Bird).
- 通过 PREWHERE 修复 “Column is not under aggregate function and not in GROUP BY” 报错(修复:#28461)。#28502(Azat Khuzhin)。
ClickHouse 版本 v21.10,2021-10-16
向后不兼容的变更
- 目前,以下 MergeTree 表级设置:
replicated_max_parallel_sends、replicated_max_parallel_sends_for_table、replicated_max_parallel_fetches、replicated_max_parallel_fetches_for_table已不再起任何作用。它们一直工作得不理想,现已被max_replicated_fetches_network_bandwidth、max_replicated_sends_network_bandwidth和background_fetches_pool_size所取代。 #28404 (alesapin)。
新特性
- 新增对以 lambda 表达式创建用户自定义函数(UDF)的支持。语法:
CREATE FUNCTION {function_name} as ({parameters}) -> {function core}。示例:CREATE FUNCTION plus_one as (a) -> a + 1。作者 @Realist007。#27796 (Maksim Kita) #23978 (Realist007). - 新增
Executable存储引擎和executable表函数。它支持以流式方式使用外部脚本进行数据处理。#28102 (Maksim Kita) (ruct). - 新增
ExecutablePool存储引擎。类似于Executable,但使用的是一个长时间运行的进程池。#28518 (Maksim Kita). - 新增
ALTER TABLE ... MATERIALIZE COLUMN查询。#27038 (Vladimir Chebotarev). - 为
s3表函数增加分区写入支持。#23051 (Vladimir Chebotarev). - 为数据导入 / 导出增加对
lz4压缩格式的支持(在已有的gz、bz2、xz、zstd之外)。#25310 (Bharat Nallan). - 在启用设置项
enable_positional_arguments时允许使用位置参数。关闭 #2592。#27530 (Kseniia Sumarokova). - 在
s3表的CREATE查询中,允许在SETTINGS子句中指定与文件格式相关的用户设置。修复 #27580。#28037 (Nikita Mikhaylov). - 允许
RabbitMQ引擎使用 SSL 连接。#28365 (Kseniia Sumarokova). - 新增
getServerPort函数,用于获取服务器端口。如果该端口未被服务器使用,则抛出异常。#27900 (Amos Bird). - 新增在 “snowflake id” 与
DateTime、DateTime64之间的转换函数。参见 #27058。#27704 (jasine). - 新增
SHA512函数。#27830 (zhanglistar). - 新增
log_queries_probability设置,允许用户仅将按采样概率选取的一部分查询写入query_log。修复 #16609。#27527 (Nikolay Degterinsky).
实验性功能
web类型的磁盘,用于在 Web 服务器上以静态文件形式存储只读表。参见 #23982、#25251(Kseniia Sumarokova)。主要用于便于测试共享存储上的操作以及轻松导入数据集。不推荐在 21.11 版本发布前使用。- 新增命令
BACKUP和RESTORE。#21945(Vitaly Baranov)。该功能仍在开发中,不打算在当前版本中实际使用。
性能改进
- 加速
sumIf和countIf聚合函数。#28272(Raúl Marín)。 - 为
minmax索引创建虚拟 projection。现在,当启用allow_experimental_projection_optimization时,在可能的情况下,查询将使用 minmax 索引而不是读取数据。#26286(Amos Bird)。 - 在
sequenceMatch和sequenceCount中引入两个检查,当序列模式中某些确定性部分在事件列表中缺失时,可以提前退出。此更改解锁了许多之前会因为达到操作上限而失败的查询,并且整体加快了处理流程。#27729(Jakub Kuklis)。 - 利用二元函数(尤其是非零常量除法)的“始终单调”信息增强主键分析。#28302(Amos Bird)。
- 使
hasAll过滤条件能够利用 bloom filter 数据跳过索引。#27984(Braulio Valdivielso Martínez)。 - 通过延迟表启动过程来加速数据 part 的加载。#28313(Amos Bird)。
- 修复了可能从
WHERE移动到PREWHERE的条件数量过多的问题(该优化由设置optimize_move_to_prewhere控制)。#28139(lthaooo)。 - 默认启用
optimize_distributed_group_by_sharding_key。#28105(Azat Khuzhin)。
改进
- 在创建
Distributed表之前检查集群名称,禁止使用错误的集群名称创建表。修复了 #27832。 #27927(tavplubix)。 - 类似于其他 quantile...Weighted 函数,新增聚合函数
quantileBFloat16Weighted。此更改解决了 #27745。#27758(Ivan Novitskiy)。 - 允许创建空属性列表的字典。 #27905 (Maksim Kita).
- 在
clickhouse-client中添加有关如何重置密码的交互式说明文档。这在用户安装 ClickHouse、设置密码后马上就忘记密码的场景中非常有用。参见 #27750。#27903(alexey-milovidov)。 - 支持在
JSONAsString输入格式中处理被数组包裹的数据。关闭 #25517。#25633(Kruglov Pavel)。 - 向
system.replicas表添加新列last_queue_update_exception。 #26843 (nvartolomei)。 - 在故障切换时为
MaterializedPostgreSQL表提供重连支持。关闭 #28529。#28614(Kseniia Sumarokova)。 - 在服务器首次启动时生成唯一的服务器 UUID。#20089 (Bharat Nallan).
- 为
MySQL引擎新增connection_wait_timeout设置项(默认为 5 秒,0 表示不等待)。 #28474 (Azat Khuzhin). - 不再允许使用无效参数创建
MaterializedPostgreSQL。关闭 #28423。#28430(Kseniia Sumarokova)。 - 在垂直合并时使用实际的临时文件,而不是预定义的 "rows_sources"。这样可以避免在临时磁盘上生成无用目录。 #28299 (Amos Bird).
- 在服务器配置中新增了
libhdfs3_conf,而不再通过在 clickhouse-server.service 中导出环境变量LIBHDFS3_CONF的方式进行配置。该配置用于与 HDFS 的交互。#28268 (Zhichang Yu). - 修复删除处于 Temporary 状态的 part 时可能引发的非预期异常(
Part %name% doesn't exist)。修复了 #23661。#28221 #28221)(Azat Khuzhin)。 - 修复
zookeeper_log.address(在本 PR 的首个补丁之前,该地址始终为::),并减少该列中对getpeername(2)的调用次数(由于每次为zookeeper_log添加条目时都会调用getpeername(),因此在 ZooKeeper 客户端中缓存此地址以避免重复调用)。#28212 (Azat Khuzhin). - 支持在
[]运算符中使用的索引与Map类型键之间进行隐式转换(例如不同的Int类型、String和FixedString)。 #28096 (Anton Popov). - 在向 PostgreSQL 表引擎或表函数插入数据时支持使用
ON CONFLICT子句。修复 #27727。#28081 (Kseniia Sumarokova). - 放宽
Enum数据类型的限制,以允许附加兼容数据。关闭 #26672。#28028(Dmitry Novik)。 - 添加配置项
empty_result_for_aggregation_by_constant_keys_on_empty_set来控制在空集合上对常量键进行分组时的行为。用于恢复 #6842 中的旧行为。 #27932(Amos Bird)。 - 新增了
replication_wait_for_inactive_replica_timeout设置项。它允许指定在等待处于非活动状态的副本执行ALTER/OPTIMZE/TRUNCATE查询时的最长时间(默认 120 秒)。如果replication_alter_partitions_sync为 2,且某些副本非活动的时间超过replication_wait_for_inactive_replica_timeout秒,则会抛出UNFINISHED异常。#27931 (tavplubix)。 - 为
APPLY列转换器增加对 lambda 参数的支持,从而可以调用带有多个参数的函数。对应于 #27877。#27901(Amos Bird)。 - 将默认启用
tcp_keep_alive_timeout。#27882 (Azat Khuzhin). - 改进在远程服务器异常终止情况下的远程查询取消。#27881 (Azat Khuzhin).
- 对于大型 S3 对象,使用分段复制上传。 #27858 (ianton-ru)。
- 允许库字典路径跟随符号链接进行解析。 #27815 (Kseniia Sumarokova).
- 现在使用
ALTER MODIFY COLUM将T修改为Nullable(T)时不再需要执行 mutation。#27787 (victorgao)。 - 不要静默忽略错误,也不要在
ReadBufferFromS3中统计延迟。#27484(Vladimir Chebotarev)。 - 改进
ALTER ... MATERIALIZE TTL,使其仅重新计算元数据而不实际执行 TTL 操作。#27019 (lthaooo). - 允许在文件末尾(EOF)没有换行符的情况下读取自定义顶级域名列表。#28213 (Azat Khuzhin)。
错误修复
- 修复从
carbon-clickhouse读取压缩数据时出现 “attempt to read after end of file” 错误的问题。修复 #26149。#28150 (FArthur-cmd)。 - 修复了在执行包含
ON CLUSTER子句的GRANT WITH REPLACE语句时检查访问权限授予的问题。此 PR 在修复 #27001 的基础上作了改进。#27983 (Vitaly Baranov)。 - 允许在设置
extremes = 1时,从类型为LowCardinality(UUID)的列中进行查询。#27918 (Vitaly Baranov). - 修复在处理负数时的 PostgreSQL 风格类型转换(
::运算符)。 #27876 (Anton Popov). - 继 #26864 之后,修复了
NamedSessionStorage的关闭逻辑:现在会在销毁全局上下文之前销毁存储在NamedSessionStorage中的会话上下文。#27875(Vitaly Baranov)。 - 修复
windowFunnel"strict" 模式中的问题。解决了 #27469。#27563(achimbab)。 - 修复读取被截断的
bzip2压缩包时出现的无限循环问题。 #28543 (Azat Khuzhin). - 修复
MaterializedMySQL内部 DDL 在执行DROP TABLE时出现的 UUID 冲突问题。MaterializedMySQL 是一个实验性功能。#28533 (Azat Khuzhin)。 - 修复在对包含
Nested列,以及名称中带点且与Nested列具有相同前缀的标量列(例如n.id UInt32, n.arr1 Array(UInt64), n.arr2 Array(UInt64))的表执行查询时出现的There is no subcolumn错误。 #28531 (Anton Popov). - 修复一个问题,该问题可能在对
ReplicatedVersionedCollapsingMergeTree执行 ALTER 后导致错误Existing table metadata in ZooKeeper differs in sorting key expression.。修复了 #28515。#28528(alesapin)。 - 修复了在后台处理分布式 DDL 队列时可能出现的 ZooKeeper watch 泄漏问题(影响较小)。已关闭 #26036。#28446(tavplubix)。
- 修复
MaterializedPostgreSQL引擎中对表名缺少引号的问题。关闭问题 #28316。#28433(Kseniia Sumarokova)。 - 修复在可为空列上进行 JOIN 时未匹配行的错误行为。关闭 #27691。#28349 (vdimir)。
- 修复在未使用全部键列时的
NOT-IN索引优化问题。此更改修复了 #28120。#28315(Amos Bird)。 - 修复由于新 part 被替换为空 part 而导致 part 相互交叉的问题。#28310 (Azat Khuzhin).
- 修复在
Merge表上启用optimize_read_in_order设置后,带有ORDER BY的查询结果不一致的问题。#28266(Anton Popov)。 - 修复了在类型为
Nullable(LowCardinality)且将extremes设置为 1 的查询中,可能发生的未初始化内存读取问题。修复了 #28165。#28205(Nikolai Kochetov)。 - 针对 projections 的多个小修复。详情见 PR 说明。#28178 (Amos Bird)。
- 修复由于 context/config 重载器关闭顺序不正确而导致的,在关闭时极少发生的段错误。 #28088 (nvartolomei).
- 修复函数
JSONExtract在处理类型为Nullable(String)的 NULL 值时的行为。此修复解决了 #27929 和 #27930。该问题是在 https://github.com/ClickHouse/ClickHouse/pull/25452 中引入的。#27939(Amos Bird)。 - 针对新的
clickhouse-keeper工具进行了多项修复。修复了clickhouse-keeper中的一个罕见错误,即客户端可能在完整的请求-响应流程之前收到 watch 响应。#28197 (alesapin)。修复了clickhouse-keeper中的错误行为,即在对子节点执行set请求时会触发列表 watch(getChildren)。#28190 (alesapin)。修复了一个罕见问题,即更改clickhouse-keeper设置可能导致日志丢失和服务器挂起。#28360 (alesapin)。修复了clickhouse-keeper中的一个错误,在减小rotate_logs_interval时可能导致日志持续输出。#28152 (alesapin)。
构建/测试/打包改进
- 在压力测试中启用 Thread Fuzzer。Thread Fuzzer 是 ClickHouse 的一项功能,可以测试更多线程调度的组合,从而发现更多潜在问题。此更改关闭了 #9813、#9814、#9515 和 #9516。#27538(alexey-milovidov)。
- 为测试环境新增日志级别
test,其详细程度甚至高于默认的trace。#28559(alesapin)。 - 在 CMake 配置阶段输出 git 状态信息。#28047(Braulio Valdivielso Martínez)。
- 临时将 Ubuntu APT 软件仓库切换为镜像 ru.archive.ubuntu.com,因为默认仓库(archive.ubuntu.com)在我们的 CI 中没有响应。#28016(Ilya Yatsishin)。
ClickHouse 发布 v21.9,2021-09-09
不向后兼容的变更
- 在文本表示
Decimal类型时不再输出末尾的零。例:对于 scale 为 6 的 decimal,将打印1.23而不是1.230000。这修复了 #15794。如果你的应用以某种方式依赖这些末尾零,这可能会引入轻微的不兼容性。输出格式中的序列化行为可以通过设置output_format_decimal_trailing_zeros控制。toString的实现以及到 String 的类型转换在所有情况下都已更改。#27680 (alexey-milovidov). - 不再允许将带有
-Merge组合器的参数化聚合函数应用于由不同参数的聚合函数生成的聚合状态。例如,fooState(42)(x)的状态不能通过fooMerge(s)或fooMerge(123)(s)完成,必须显式指定参数,例如fooMerge(42)(s),并且参数必须相同。这不会影响某些特殊的聚合函数,如quantile和sequence*,它们只在最终计算时使用参数。#26847 (tavplubix). - 在 clickhouse-local 下,总是将带端口的本地地址视为远程地址。#26736 (Raúl Marín).
- 修复在某些复杂查询中,当列别名与表达式名称相同的情况下,可能发生错误类型转换的问题。修复了 #25447。修复了 #26914。此修复可能引入向后不兼容性:如果存在名称相同但表达式不同的情况,将抛出异常。如果设置了
enable_optimize_predicate_expression,这可能会在一些罕见场景中导致问题。#26639 (alexey-milovidov). - 现在,如果标量子查询的类型可以是
Nullable,它总是返回Nullable结果。这是必要的,因为在子查询结果为空的情况下,其结果应为Null。此前,有可能出现类型不兼容错误(类型推导不会执行标量子查询,并且可能使用非 Nullable 类型)。对结果为空且无法转换为Nullable(例如Array或Tuple)的标量子查询,现在会抛出错误。修复了 #25411。#26423 (Nikolai Kochetov). - 引入 here document 语法。例如:
SELECT $doc$ VALUE $doc$。#26671 (Maksim Kita)。如果查询中存在包含$的标识符,此变更将导致向后不兼容。#28768。 - 现在索引可以处理 Nullable 类型,包括
isNull和isNotNull。#12433 和 #12455 (Amos Bird) 以及 #27250 (Azat Khuzhin)。但这是通过更改磁盘上的格式实现的,即使新服务器可以读取旧数据,旧服务器则无法读取新数据。另外,如果你有MINMAX数据跳过索引,你可能会遇到Data after mutation/merge is not byte-identical错误,因为新索引将使用.idx2扩展名,而之前为.idx。这意味着在这种情况下你不应拖延更新所有现有副本,否则,如果旧副本 (<21.9) 从 21.9+ 的新副本下载数据,将无法对下载的那一部分应用索引。
新特性
- 实现函数的短路求值,解决 #12587。新增设置
short_circuit_function_evaluation用于配置函数短路求值。#23367 (Kruglov Pavel)。 - 为
INTERSECT、EXCEPT、ANY、ALL运算符添加支持。 #24757 (Kirill Ershov). (Kseniia Sumarokova). - 在虚拟文件系统层面添加对静态数据加密的支持,使用 AES-CTR 算法。#24206(Latysheva Alexandra)。(Vitaly Baranov)#26733 #26377 #26465。
- 在同义词扩展中新增了用于分词、词干提取、词形还原和搜索的自然语言处理(NLP)函数。#24997(Nikolay Degterinsky)。
- 增加了对 S2 几何库的集成。#24980 (Andr0901). (Nikita Mikhaylov).
- 新增 SQLite 表引擎、表函数和数据库引擎。 #24194 (Arslan Gumerov). (Kseniia Sumarokova).
- 为
MySQL、PostgreSQL、ClickHouse、JDBC、Cassandra字典源添加了对自定义查询的支持。关闭 #1270。#26995(Maksim Kita)。 - 通过 ZooKeeper 为用户、角色、行策略、配额和设置配置文件添加共享(副本)存储。#27426 (Kevin Michel)。
- 为
INTO OUTFILE新增可自动选择压缩算法的压缩功能。关闭 #3473。#27134(Filatenkov Artur)。 - 新增
INSERT ... FROM INFILE,用法类似于SELECT ... INTO OUTFILE。#27655 (Filatenkov Artur)。 - 添加了
complex_key_range_hashed字典。修复了 #22029。#27629(Maksim Kita)。 - 在 JOIN 的 ON 子句中支持使用表达式。关闭 #21868。#24420(Vladimir C)。
- 当客户端连接到服务器时,它会接收服务器已收集的所有警告信息。(可以通过选项
--no-warnings禁用此行为)。新增system.warnings表,用于收集关于服务器配置的警告。#26246 (Filatenkov Artur). #26282 (Filatenkov Artur). - 允许在聚合函数参数中使用来自 WITH 子句和 SELECT 子句的常量表达式。关闭 #10945。#27531(abel-cheng)。
- 新增函数
tupleToNameValuePairs,用于将具名元组转换为键值对数组。 #27505 (Braulio Valdivielso Martínez). - 为导入/导出添加对
bzip2压缩方法的支持。修复了 #22428。#27377(Nikolay Degterinsky)。 - 新增
bitmapSubsetOffsetLimit(bitmap, offset, cardinality_limit)函数。它会基于offset的偏移创建一个 bitmap 的子集,并将结果的基数限制为cardinality_limit。 #27234 (DHBin)。 - 在
system.users中添加default_database列。 #27054 (kevin wan). - 在表函数 'cluster' 和 'clusterAllReplicas' 中增加对
cluster宏的支持。#26913 (polyprogrammist). - 新增函数
currentRoles(),enabledRoles(),defaultRoles(). #26780 (Vitaly Baranov). - 新增函数
currentProfiles(),enabledProfiles(),defaultProfiles(). #26714 (Vitaly Baranov). - 新增用于返回当前查询 (initial_)query_id 的函数。此更改关闭了 #23682。#26410(Alexey Boykov)。
- 新增
REPLACE GRANT功能。 #26384 (Caspian). EXPLAIN查询现在新增了EXPLAIN ESTIMATE ...模式,可显示从 MergeTree 表中读取的行数、marks 和 parts 等信息。修复了 #23941。#26131(fastio)。- 添加了
system.zookeeper_log表,用于记录 ZooKeeper 客户端的所有操作。实现了 #25449。#26129(tavplubix)。 - 为基于
HDFS存储的ReplicatedMergeTree引入零拷贝复制。#25918 (Zhichang Yu)。 - 允许在
Arrow、ORC和Parquet输入格式中将 Nested 类型以结构体数组的形式插入。#25902 (Kruglov Pavel)。 - 新增数据类型
Date32(以 Int32 存储数据),支持与DateTime64相同的日期范围,支持将 Parquet 的date32加载到 ClickHouse 的Date32。新增函数toDate32,用法类似toDate。#25774 (LiuNeng)。 - 允许为用户设置默认数据库。 #25268。 #25687 (kevin wan).
- 为
MongoDB引擎添加了一个可选参数,用于接收连接字符串选项并支持 SSL 连接。修复了 #21189。修复了 #21041。#22045(Omar Bazaraa)。
实验功能
- 新增压缩编解码器
AES_128_GCM_SIV,它会对列进行加密而不是压缩。#19896(PHO)。该功能将被重写,请不要使用。 - 将
MaterializeMySQL重命名为MaterializedMySQL。#26822(tavplubix)。
性能改进
- 通过减少
clock_gettime系统调用的次数,在max_execution_time = 0时提升快速查询的性能。#27325(filimonov)。 - 对与日期时间相关的比较做专门优化,以获得更好的性能。这修复了 #27083。#27122(Amos Bird)。
- 在对相同文件进行并发读取时共享文件描述符。在 Linux 上没有明显的性能差异,但在典型服务器上,打开文件的数量将显著(10 到 100 倍)减少,从而简化运维。参见 #26214。#26768(alexey-milovidov)。
- 降低需要从包含大量列的表中读取数据的短查询的延迟。#26371(Anton Popov)。
- 在分析查询时不再为索引构建集合。#26365(Raúl Marín)。
- 对具有原生表示的 Nullable 整数类型的 SUM 聚合进行向量化处理(David Manzanares,Raúl Marín)。#26248(Raúl Marín)。
- 编译涉及
Enum类型列的表达式。#26237(Maksim Kita)。 - 编译聚合函数
groupBitOr、groupBitAnd、groupBitXor。#26161(Maksim Kita)。 - 在读取空 DEFAULT 列时,通过更准确的块大小预测来优化内存使用。修复了 #17317。#25917(Vladimir Chebotarev)。
- 在包含
ORDER BY primary_key的查询中减少内存使用和读取行数。#25721(Anton Popov)。 - 默认启用
distributed_push_down_limit。#27104(Azat Khuzhin)。 - 当 timeZone 是常量值时,使
toTimeZone保持单调性,以在使用如下 SQL 时支持分区裁剪。#26261(huangzhaowei)。
改进
- 将窗口函数标记为正式可用。移除
allow_experimental_window_functions设置。#27184 (Alexander Kuzmenkov). - 改进对非整分钟时区偏移量的兼容性。#27080(Raúl Marín)。
- 如果
File表中的文件描述符是普通文件,则允许从中多次读取。这样,如果 stdin 是一个普通文件,例如clickhouse-local --query "SELECT * FROM table UNION ALL SELECT * FROM table" ... < file,就允许clickhouse-local多次从 stdin 读取(通过多个 SELECT 查询或子查询)。这关闭了 #11124。与 (alexey-milovidov) 共同完成。#25960 (BoloniniD)。 - 删除重复的索引分析,并在投影分析过程中避免潜在的无效
LIMIT检查。 #27742 (Amos Bird). - 启用在 HTTP 请求正文中传递查询参数。#27706(Hermano Lustosa)。
- 禁止在分区表达式中使用
arrayJoin。#27648(Raúl Marín)。 - 当身份验证失败时,记录客户端 IP 地址。 #27514 (Misko Lee).
- 在 GRPC 协议中对二进制数据使用 bytes 类型而非字符串。#27431 (Vitaly Baranov)。
- 如果未设置 HTTP 端口,而用户却尝试向 TCP 端口发送 HTTP 请求,则返回包含错误信息的响应。#27385 (Braulio Valdivielso Martínez).
- 为内部使用添加
_CAST函数,该函数不会保留类型的可空属性,而非内部的 cast 将会根据设置cast_keep_nullable来保留可空属性。关闭了 #12636。#27382(Kseniia Sumarokova)。 - 添加
log_formatted_queries设置,以将额外的格式化查询记录到system.query_log中。由于normalizeQuery和normalizeQueryKeepNames等函数为了提高性能,不会对查询进行解析或格式化,因此这对于标准化查询分析非常有用。 #27380 (Amos Bird)。 - 添加两个设置
max_hyperscan_regexp_length和max_hyperscan_regexp_total_length,用于防止在与 Hyperscan 相关的函数(例如multiMatchAny)中使用超大的正则表达式。#27378 (Amos Bird)。 - 位图聚合函数所消耗的内存现在会被计入内存限制中。这修复了 #26555。#27252(alexey-milovidov)。
- 为 S3 代理解析器添加 10 秒的缓存。#27216 (ianton-ru)。
- 将全局互斥锁拆分为针对每个正则表达式构造的独立锁。这有助于避免耗时的正则表达式构造阻塞其他相关线程。#27211 (Amos Bird).
- 为 PostgreSQL 数据库引擎添加 schema 支持。关闭 #27166。#27198(Kseniia Sumarokova)。
- 在 clickhouse-client 中监控内存使用情况。 #27191 (Filatenkov Artur).
- 尝试即使在查询未能启动时也在
system.query_log中记录query_kind。#27182 (Amos Bird)。 - 在表
system.replicas中新增了列replica_is_active,用于将副本名称映射到该副本是否处于活动状态。解决了 #27138 问题。#27180(Maksim Kita)。 - 支持在 Web UI 中通过服务器 URI 传递查询设置。 #27177 (kolsys).
- 新增一个名为
MaxPushedDDLEntryID的指标,表示当前节点已推送到 ZooKeeper 的最大 DDL 条目 ID。#27174(Fuwang Hu)。 - 改进了
clickhouse-keeper在创建 znode 时对存在条件和空字符串节点的判断逻辑。#27125 (小路)。 - Merge JOIN 现在可以正确处理右侧的空集合。#27078 (Vladimir C)。
- 现在,这些函数可以作为分片级常量使用,这意味着如果在某个分布式表的上下文中执行,它会生成一个普通列;否则,则只会产生一个常量值。典型函数包括:
hostName(),tcpPort(),version(),buildId(),uptime()等。#27020(Amos Bird)。 - 更新了
extractAllGroupsHorizontal—— 现在可以通过可选的第三个参数为每行匹配结果的数量设置上限。#26961(Vasily Nemkov)。 - 通过
system.rocksdb表暴露RocksDB统计信息。从 ClickHouse 配置中读取 RocksDB 相关选项(rocksdb...键)。注意:ClickHouse 并不依赖 RocksDB,它只是众多可选的集成存储引擎之一。#26821 (Azat Khuzhin)。 - 更简洁的内部 RocksDB 日志。注意:ClickHouse 并不依赖 RocksDB,它只是众多额外集成的存储引擎之一。此更改解决了 #26252。#26789(alexey-milovidov)。
- 更改默认角色只会影响新的会话。#26759(Vitaly Baranov)。
- 在 Docker 中默认禁用 Watchdog。修复了未处理 Ctrl+C 信号的问题。#26757 (Mikhail f. Shiryaev).
SET PROFILE现在也会应用传入 profile 上设置的约束。#26730 (Vitaly Baranov)。- 改进对
KILL QUERY请求的处理。 #26675 (Raúl Marín). mapPopulatesSeries函数现已支持Map类型。#26663(Ildus Kurbangaliev)。- 修复了在使用
skip_unavailable_shards时出现的连接尝试次数过多(翻倍)的问题。 #26658 (Azat Khuzhin). - 避免
clickhouse-benchmark在连接失败时挂起(例如出现 EMFILE 错误)。#26656 (Azat Khuzhin)。 - 允许 Kafka 引擎使用更多线程。#26642 (feihengye).
- 为
clickhouse-benchmark增加轮询(round-robin)支持(除统计报告外,其与常规的多主机/端口运行没有区别)。#26607 (Azat Khuzhin)。 - 可执行字典(
executable、executable_pool)现已支持使用clickhouse-local通过 DDL 查询创建。关闭了 #22355。#26510(Maksim Kita)。 - 为
mysql和postgresql兼容性协议处理程序设置客户端查询类型。 #26498 (anneji-dev). - 在分片上对类似
SELECT * FROM dist ORDER BY key LIMIT 10的查询下推并应用LIMIT,需设置distributed_push_down_limit=1。避免对类似SELECT DISTINCT shading_key FROM dist ORDER BY key的查询执行Distinct/LIMIT BY阶段。现在,在optimize_distributed_group_by_sharding_key优化中也会正确遵循distributed_push_down_limit。#26466(Azat Khuzhin)。 - 将 Protobuf 更新到 3.17.3。变更日志可在 https://github.com/protocolbuffers/protobuf/releases 查看。#26424(Ilya Yatsishin)。
- 启用
use_hedged_requests设置,以降低大型集群的尾延迟。 #26380 (alexey-milovidov)。 - 改进当用户允许的主机列表中不存在该主机时的系统行为。#26368 (ianton-ru).
- 支持通过
CREATE TABLE设置Distributed目录监控参数(例如CREATE TABLE dist (key Int) Engine=Distributed(cluster, db, table) SETTINGS monitor_batch_inserts=1等)。 #26336 (Azat Khuzhin). - 如果服务器地址与 Web UI 的来源地址不同,则在 Web UI 的历史记录 URL 中保存该服务器地址。修复了 #26044。#26322(alexey-milovidov)。
- 为
sleep/sleepEachRow的 profile 调用添加事件。#26320 (Raúl Marín)。 - 允许在不同集群之间重用分片连接,这也避免了在使用
cluster表函数时创建新连接。#26318 (Amos Bird). - 通过一个带默认值的参数控制清理旧临时目录的执行周期。#26212。#26313 (fastio)。
- 添加设置项
function_range_max_elements_in_block,用于调节函数range生成数据量的安全阈值。此更改关闭了 #26303。#26305(alexey-milovidov)。 - 在创建表时检查哈希函数,而不是在采样时检查。为 MergeTree 添加相关设置:如果有人创建了一个具有错误采样列的表但从未使用采样,则可以禁用该设置,从而在启动服务器时不抛出异常。 #26256 (zhaoyu).
- 添加了
output_format_avro_string_column_pattern设置,用于将指定的 String 列在 Avro 中作为字符串输出,而不是默认的字节。实现了 #22414。#26245(Ilya Golshtein)。 - 在
system.columns表中新增关于Log和TinyLog表列大小的信息。此更改解决了 #9001。#26241(Nikolay Degterinsky)。 - 在查询
system.detached_parts表时,如果存在自定义磁盘配置,并且某些磁盘上不存在detached目录,则不再抛出异常。修复了 #26078。#26236(alexey-milovidov)。 - 检查键中是否使用了非确定性函数,包括
now()、today()等常量表达式。已关闭 #25875。已关闭 #11333。#26235(alexey-milovidov)。 - 在 PostgreSQL 表引擎中将
timestamp和timestamptz数据类型转换为DateTime64。#26234 (jasine). - 对 projection 应用更激进的 IN 索引分析,以便能选出更优的 projection 候选。 #26218 (Amos Bird).
- 当对
IN传入标量函数时,移除GLOBAL关键字。在之前的版本中,如果用户写GLOBAL IN f(x)会抛出异常。#26217(Amos Bird)。 - 将错误 ID(例如
BAD_ARGUMENTS)添加到异常消息中。这一改动关闭了 #25862。#26172(alexey-milovidov)。 - 修复了在使用 --progress 选项运行 clickhouse-local 时输出不正确的问题。进度条在达到 100% 后将被清除,与 clickhouse-client 的行为相同。解决了 #17484。#26128 (Kseniia Sumarokova)。
- 添加
merge_selecting_sleep_ms设置。 #26120 (lthaooo). - 移除带有单块预读的复杂 Linux AIO 用法,并改为使用基于 O_DIRECT 的简单同步 IO。在之前的版本中,如果
max_threads大于 1,min_bytes_to_use_direct_io设置可能无法正常生效。使用 direct IO 进行读取(对查询默认禁用、对大型合并默认启用)将以效率较低的方式工作。修复了 #25997。#26003(alexey-milovidov)。 - 在执行
REPLACE TABLE查询时刷新Distributed表。解决 #24566 —— 如果在[CREATE OR] REPLACE TABLE ... AS SELECT查询中向新表插入数据失败,则不要替换(或创建)该表。解决 #23175。#25895 (tavplubix)。 - 在
system.query_log中添加views列,用于记录查询执行的(物化或实时)视图名称。新增日志表(system.query_views_log),用于记录查询执行期间每个被执行视图的信息。修改视图执行行为:在执行视图时抛出异常的情况下,任何已经开始执行的视图都会继续运行直到完成。此前只有在parallel_view_processing=true时才是这种行为,现在在所有情况下都一致。依赖视图现在会向上下文报告读取进度。#25714(Raúl Marín)。 - 在执行完分布式查询后,将异步进行连接清理。新增服务端设置
max_threads_for_connection_collector,用于指定在后台回收连接的工作线程数量。如果连接池已满,则连接将同步清理,但行为与之前略有不同:清理操作会在向客户端发送 EOS 之后进行,查询在收到足够数据后会立即成功返回,且任何异常都会被记录到日志中,而不会再抛给客户端。新增设置drain_timeout(默认 3 秒)。连接清理在超时后会断开连接。#25674(Amos Bird)。 - 在配置中支持使用多个 include。现在可以从多个来源引入用户配置和远程服务器配置。只需放置带有
from_zk、from_env或incl属性的<include />元素,它就会被相应的替代内容所替换。#24404 (nvartolomei)。 - 修复在
insert_distributed_one_random_shard = 1时向分布式表进行多块数据插入的问题。这是一个边缘特性。标记为改进。#23140 (Amos Bird)。 - 为
Map类型的键/值提供对LowCardinality和FixedString的支持。#21543 (hexiaoting)。 - 支持重新加载本地磁盘配置。#19526 (taiyang-li)。
缺陷修复
- 修复了几个可能导致副本不一致的 bug。#27808 (tavplubix).
- 修复了
DROP PART中的一个罕见 bug,该问题可能会导致出现错误Unexpected merged part intersects drop range。 #27807 (alesapin). - 修复当来自 Kafka 的 NULL(“tombstone”)消息到来时导致某些格式崩溃的问题。修复了 #19255。#27794(filimonov)。
- 修复在子查询中使用
UNION DISTINCT时的列过滤问题。关闭了 #27578。#27689(Kseniia Sumarokova)。 - 修复在对由不同非数值类型(例如
DateTime和DateTime64)组成的 LowCardinality Nullable 数组应用arrayHas等函数时出现的不正确类型转换问题。在之前的版本中会发生错误的类型转换,在新版本中将改为抛出异常。修复了 #26330。#27682(alexey-milovidov)。 - 修复 postgresql 表函数导致连接无法被关闭的问题。关闭 #26088。#27662(Kseniia Sumarokova)。
- 修复了另一处会触发
Unexpected merged part ... intersecting drop range ...错误的问题。#27656(tavplubix)。 - 修复
Distributed表中带有别名的列相关的错误。#27652 (Vladimir C)。 - 在将
max_memory_usage*设置为非零值之后,无法将其重置为 0(表示无限制)。此问题已修复。#27638 (tavplubix)。 - 修复了在从各个组件构造时间值时发生的下溢问题。关闭 #27193。#27605(Vasily Nemkov)。
- 修复在投影物化期间由于某些数据部分缺少列而导致的崩溃问题。此修复解决了 #27512。#27528(Amos Bird)。
- 修复度量指标
BackgroundMessageBrokerSchedulePoolTask,之前可能存在拼写错误。#27452(Ben)。 - 修复在分片数为零且包含聚合时的分布式查询。 #27427 (Azat Khuzhin)。
- 在
/proc/meminfo不包含 KB 后缀时提供兼容处理。#27361 (Mike Kot)。 - 修复在启用行级安全且使用 PREWHERE 和 LowCardinality 过滤条件的查询中返回错误结果的问题。修复 #27179。#27329(Nikolai Kochetov)。
- 修复了对使用旧语法创建的 MergeTree 表的分区 ID 的错误校验。#27328 (tavplubix).
- 修复在使用并行格式(CSV/TSV)时的 MySQL 协议问题。 #27326 (Raúl Marín).
- 修复在包含采样的查询中出现
Cannot find column错误的问题。该问题是在 #24574 中引入的。此修复解决了 #26522。#27301(Nikolai Kochetov)。 - 修复在
PREWHERE中使用LowCardinality的某些查询出现的错误,例如Expected ColumnLowCardinality, gotUInt8或Bad cast from type DB::ColumnVector<char8_t> to DB::ColumnLowCardinality。更重要的是,修复错误消息中缺少空格的问题。修复了 #23515。#27298(Nikolai Kochetov)。 - 修复
distributed_group_by_no_merge = 2搭配distributed_push_down_limit = 1,或optimize_distributed_group_by_sharding_key = 1搭配LIMIT BY和LIMIT OFFSET时的问题。#27249(Azat Khuzhin)。这些是几乎没有人使用的冷门配置组合。 - 修复在非复制 MergeTree 表中因无效分区导致变更任务卡住的问题。 #27248 (Azat Khuzhin).
- 在存在歧义的情况下,lambda 函数会优先将名称解析为其参数,而不是其他别名或标识符。#27235(Raúl Marín)。
- 修复合并 JOIN 中的列结构,关闭 #27091。#27217(Vladimir C)。
- 在极少数情况下,
system.detached_parts表中可能会包含某些部分的错误信息,此问题已修复。修复了 #27114。#27183(tavplubix)。 - 修复
multiSearch*函数在处理空数组时的未初始化内存问题,关闭 #27169。#27181(Vladimir C)。 - 修复 GRPCServer 中的同步问题。此 PR 修复了 #27024。#27064(Vitaly Baranov)。
- 修复了
cache、complex_key_cache、ssd_cache、complex_key_ssd_cache的配置解析。选项allow_read_expired_keys、max_update_queue_size、update_queue_push_timeout_milliseconds、query_wait_timeout_milliseconds之前不会为非cache类型的字典进行解析。#27032(Maksim Kita)。 - 修复由于与 DROP_RANGE 发生竞态而可能导致的 mutation 堆积问题。 #27002 (Azat Khuzhin).
- 现在,在类似
ALTER TABLE ... PARTITION ID xxx的查询中,会对分区 ID 进行正确性校验。修复了 #25718。#26963(alesapin)。 - 在某些情况下,修复在使用多个 JOIN 时出现的 "Unknown column name" 错误,并关闭 #26899。#26957(Vladimir C)。
- 修复自定义 TLD 读取问题(在缓冲区较小或文件较大时会停止处理)。#26948 (Azat Khuzhin).
- 修复当
DEFAULT列引用其他没有DEFAULT表达式的非物化列时出现的Missing columns: 'xxx'错误。修复 #26591。#26900(alesapin)。 - 修复在
library-bridge中从library字典源加载字典键的逻辑。 #26834 (Kseniia Sumarokova). - 在应用某些 combinator 时,聚合函数参数可能会丢失,从而导致如下异常:
Conversion from AggregateFunction(topKArray, Array(String)) to AggregateFunction(topKArray(10), Array(String)) is not supported。该问题已修复。修复了 #26196 和 #26433。#26814(tavplubix)。 - 在
system.part_log中为REMOVE_PART添加event_time_microseconds值。在之前的版本中未设置该值。 #26720 (Azat Khuzhin). - 在关闭 ReplicatedMergeTree 表时,请不要删除数据,以避免导致数据与元数据不一致的情况。#26716 (nvartolomei).
- 有时
SET ROLE可能运行不正确,此 PR 对其进行了修复。#26707 (Vitaly Baranov). - 针对并行格式化的一些修复(https://github.com/ClickHouse/ClickHouse/issues/26694)。#26703(Raúl Marín)。
- 修复了窗口函数中可能出现的
nullptr解引用。修复了 #25276。#26668(Alexander Kuzmenkov)。 - 修复在从 3 年前版本的 clickhouse-client 升级时,当 clickhouse-client 历史记录文件为空时的历史文件转换问题。 #26589 (Azat Khuzhin).
- 修复了 groupBitmapAnd/Or/Xor 在某些情况下显示错误函数名的问题。 #26557 (Amos Bird).
- 更新 clickhouse-server Docker entrypoint 中对
chown命令的检查逻辑。此修复解决了在 Kubernetes 上集群 pod(容器组)重启失败(或超时)的问题。#26545 (Ky Li)。 - 修复在尚未启动
RabbitMQ时执行RabbitMQ关闭操作会导致崩溃的问题,关闭了 #26504。#26529(Kseniia Sumarokova)。 - 修复在
CREATE DICTIONARY查询中使用带引号的字典名称或数据库名称时出现的问题。修复 #26491。#26508(Maksim Kita)。 - 修复在重写列别名后出现的列名解析问题。此更改修复了 #26432。#26475(Amos Bird)。
- 修复了一些由模糊测试触发的 msan 崩溃。修复了 #22517。#26428(Nikolai Kochetov)。
- 修复在
partial_merge_join关闭时出现的未连接数据块无限流问题 #26325。#26374(Vladimir C)。 - 修复以已删除用户身份登录时可能发生的崩溃。此 PR 修复了 #26073。#26363(Vitaly Baranov)。
- 修复
optimize_distributed_group_by_sharding_key在多列表达式分片键场景下的问题(当optimize_skip_unused_shards=1/allow_nondeterministic_optimize_skip_unused_shards=1且分片键表达式包含多列时,会产生错误结果)。#26353(Azat Khuzhin)。 - 修复了在丢失副本恢复过程中可能导致副本数据出现不一致的罕见错误。#26321 (tavplubix).
- 修复了在内部缓冲区末尾存在转义序列时的 zstd 解压缩问题(用于导入/导出采用 zstd 帧格式且与表数据无关的数据)。关闭 #26013。 #26314(Kseniia Sumarokova)。
- 修复在包含
totals的JOIN中的逻辑错误,关闭 #26017。#26250(Vladimir C)。 - 移除
system.stack_trace表中thread_name列中多余的换行符。此更改修复了 #24124。#26210(alexey-milovidov)。 - 修复在同时使用多个
untuple表达式时可能发生的崩溃问题。#26179(alexey-milovidov)。 - 当 Enum 未为 0 定义对应值时,不要在 Nullable Enum 的
toString中抛出异常,关闭 #25806。#26123(Vladimir C)。 - 修复了 ClickHouse 在查询执行期间发生异常时,通过 MySQL 协议发送的数据包中错误的
sequence_id。该问题可能会导致 MySQL 客户端重置与 ClickHouse 服务器的连接。修复了 #21184。#26051(tavplubix)。 - 修复
cutToFirstSignificantSubdomainCustom()/cutToFirstSignificantSubdomainCustomWithWWW()/firstSignificantSubdomainCustom()对常量返回错误类型、从而导致optimize_skip_unused_shards不生效的情况。#26041 (Azat Khuzhin)。 - 修复在将普通投影与 prewhere 联合使用时可能出现的 header 不匹配问题。此更改修复了 #26020。#26038(Amos Bird)。
- 修复了 remote() 在使用未经过函数处理的列作为 sharding_key 时的问题(此前
select * from remote('127.1', system.one, dummy)会导致Unknown column: dummy, there are only columns .错误)。#25824 (Azat Khuzhin)。 - 修复了从
MaterializeMySQL进行查询时出现的Not found column ...和Missing column ...错误。修复了 #23708、#24830、#25794。#25822(tavplubix)。 - 修复
optimize_skip_unused_shards_rewrite_in在处理非 UInt64 类型时的问题(否则最终可能会选择错误的分片,或抛出Cannot infer type of an empty tuple或Function tuple requires at least one argument)。 #25798 (Azat Khuzhin).
构建/测试/打包改进
- 现在我们会在随机时区下运行有状态和无状态测试。修复了 #12439。在 Protobuf 格式中,将 String 读取为 DateTime 和将 DateTime 写为 String 时,现在会考虑时区。在 Arrow 和 Parquet 格式中,将 UInt16 读取为 DateTime 时,现在会先将其视为 Date,然后再根据 DateTime 的时区转换为 DateTime,因为在 Arrow 和 Parquet 中,Date 是以 UInt16 进行序列化的。GraphiteMergeTree 现在在时间取整时会考虑时区。修复了 #5098。作者:@alexey-milovidov。#15408(alesapin)。
clickhouse-test支持带有 Jinja2 模板的 SQL 测试。#26579(Vladimir C)。- 增加了对使用
clang-13进行构建的支持。关闭 #27705。#27714(alexey-milovidov)。#27777(Sergei Semin) - 添加了 CMake 选项,以便在构建时启用或禁用特定 CPU 指令集。这与 #17469 和 #27509 相关。#27508(alexey-milovidov)。
- 修复了在使用动态库时辅助程序的链接问题。#26958(Raúl Marín)。
- 将 RocksDB 更新到
2021-07-16的 master 版本。#26411(alexey-milovidov)。
ClickHouse 发布 v21.8,2021-08-12
升级说明
- 新版本在系统日志表(
system.query_log、system.query_thread_log、system.processes、system.opentelemetry_span_log)中使用Map数据类型。这些表将会自动以新的数据类型创建。为支持旧查询,会创建虚拟列。关闭 #18698。#23934、#25773(hexiaoting、sundy-li、Maksim Kita)。如果希望从 21.8 版本降级到更早的版本,需要手动清理系统日志表。请查看/var/lib/clickhouse/data/system/*_log。
新功能
- 新增对 SQL/JSON 标准部分特性的支持。#24148 (l1tsolaiki, Kseniia Sumarokova)。
- 在
system.asynchronous_metrics和system.asynchronous_metric_log中收集常见系统指标,包括 CPU 使用率、磁盘使用率、内存使用率、IO、网络、文件、平均负载、CPU 频率、温度传感器、EDAC 计数器、系统正常运行时间;同时新增有关调度抖动以及收集这些指标所耗时间的指标。其工作方式类似于 ClickHouse 中的atop,即使未安装额外工具,也可以访问监控数据。关闭 #9430。#24416 (alexey-milovidov, Yegor Levankov)。 - 新增 MaterializedPostgreSQL 表引擎和数据库引擎。该数据库引擎允许复制整个数据库或数据库表的任意子集。#20470 (Kseniia Sumarokova)。
- 新增函数
leftPad(),rightPad(),leftPadUTF8(),rightPadUTF8()。#26075 (Vitaly Baranov)。 - 为
ADD INDEX命令添加FIRST关键字,以便可以将索引添加到索引列表的开头。#25904 (xjewer)。 - 引入
system.data_skipping_indices表,用于存储现有数据跳过索引的信息。关闭 #7659。#25693 (Dmitry Novik)。 - 新增
bin/unbin函数。#25609 (zhaoyu)。 - 在
mapAdd和mapSubtract函数中支持使用Map以及UInt128,Int128,UInt256,Int256类型。#25596 (Ildus Kurbangaliev)。 - 支持
DISTINCT ON (columns)表达式,关闭 #25404。#25589 (Zijie Lu)。 - 新增功能,可将自定义设置重置为默认值并从表的元数据中移除。这样可以在不了解系统/配置默认值的情况下回滚更改。关闭 #14449。#17769 (xjewer)。
- 当提交
EXPLAIN PIPELINE graph = 1查询时,在 Web UI 中以图形方式渲染管道。#26067 (alexey-milovidov)。
性能改进
- 对聚合函数进行编译。可通过
compile_aggregate_expressions选项启用。#24789 (Maksim Kita)。 - 降低在需要从包含大量列的表中读取数据时短查询的延迟。#26371 (Anton Popov)。
改进
- 对系统日志表(
system.query_log、system.query_thread_log、system.processes、system.opentelemetry_span_log)采用Map数据类型。这些表将会使用新的数据类型自动创建。会创建虚拟列以兼容旧查询。关闭了 #18698。#23934、#25773(hexiaoting、sundy-li、Maksim Kita)。 - 对于具有复杂键且仅包含一个属性的字典,在使用
dictGet、dictHas函数时,允许不将键表达式封装为 tuple。 #26130 (Maksim Kita)。 - 基于
AggregateFunction状态实现bin/hex函数。#26094(zhaoyu)。 - 为
empty和notEmpty函数添加对UUID类型参数的支持。当UUID全为零(nil UUID)时,视为空。修复 #3446。#25974(zhaoyu)。 - 在 MySQL 协议中增加对
SET SQL_SELECT_LIMIT的支持。解决了 #17115 中的问题。#25972(Kseniia Sumarokova)。 - 为网络交互增加更多监控指标:为接收/发送字节添加计数器;为接收/发送添加仪表(gauge)。补充缺失的文档。关闭 issue #5897。#25962(alexey-milovidov)。
- 新增设置
optimize_move_to_prewhere_if_final。如果查询包含FINAL,则只有在optimize_move_to_prewhere和optimize_move_to_prewhere_if_final同时启用的情况下,才会启用move_to_prewhere优化。修复 #8684。#25940(Kseniia Sumarokova)。 - 允许对 JOIN 的表使用复杂的带引号的标识符。关闭了 #17861。#25924(alexey-milovidov)。
- 在
Nested数据类型中添加对 Unicode 组件(如中文、西里尔文)的支持。关闭 #25594。#25923(alexey-milovidov)。 - 使
quantiles*函数可与aggregate_functions_null_for_empty一起使用。修复 #25892。#25919(alexey-milovidov)。 - 允许参数化聚合函数的参数为任意常量表达式(例如
1 + 2),而不仅仅是字面量常量。还允许在参数化聚合函数内部使用查询参数(例如在{param:UInt8}这样的参数化查询中)。修复 #11607。 #25910 (alexey-milovidov)。 - 在尝试解析无效的
Date时正确抛出异常。关闭了 #6481。#25909(alexey-milovidov)。 - 在配置中支持多个 include。现在可以从多个来源引入
users配置和remote_servers配置。只需放置带有from_zk、from_env或incl属性的<include />元素,ClickHouse 会将其替换为相应的内容。#24404 (nvartolomei)。 - 支持在查询中使用名为
"null"的列(该列名必须用反引号或双引号括起来)以及ON CLUSTER。修复了 #24035。#25907(alexey-milovidov)。 - 为
JSONExtract增加对LowCardinality、Decimal和UUID的支持。解决 #24606。#25900(Kseniia Sumarokova)。 - 将历史记录文件从
readline格式转换为replxx格式。#25888 (Azat Khuzhin)。 - 修复一个问题,该问题可能在执行
DROP PART或后台删除空 part 后导致部分之间发生交叠。 #25884 (alesapin). - 改进了对
ReplicatedMergeTree表中丢失数据部件的处理。修复了ReplicationQueue中罕见的不一致问题。修复 #10368。#25820(alesapin)。 - 允许在工作目录不可读时启动 clickhouse-client。#25817 (ianton-ru).
- 修复
Merge存储引擎中的 “No available columns” 错误。#25801 (Azat Khuzhin). - MySQL 引擎现在支持在 MySQL 与 ClickHouse 之间互相传递列注释。#25795 (Storozhuk Kostiantyn)。
- 修复在空结果集上对常量执行
GROUP BY时行为不一致的问题。关闭 #6842。#25786(Kseniia Sumarokova)。 - 在对
ReplicatedMergeTree执行DROP PARTITION和TRUNCATE时,取消当前分区中正在运行的合并操作。修复了 #17151。#25684(tavplubix)。 - 为 MaterializeMySQL 增加对
ENUM数据类型的支持。 #25676 (Storozhuk Kostiantyn). - 支持在 JOIN 中使用物化列和别名列,修复 #13274。#25634(Vladimir C)。
- 修复
ALTER TABLE ... DETACH与后台合并之间可能存在的逻辑竞态条件。#25605 (Azat Khuzhin). - 使
NetworkReceiveElapsedMicroseconds指标能正确包含从客户端等待用于INSERT的数据的耗时。关闭 #9958。#25602(alexey-milovidov)。 - 为 S3 和 HDFS 添加对
TRUNCATE TABLE的支持。关闭 #25530。#25550(Kseniia Sumarokova)。 - 支持通过动态重新加载配置来更改用于执行后台作业(合并、变更、抓取)的线程池线程数。 #25548 (Nikita Mikhaylov).
- 允许使用
JSONExtract将非字符串类型的元素以字符串形式提取。对应 #25414。#25452(Amos Bird)。 - 在
StorageMerge的Database参数中增加对正则表达式的支持。关闭 #776。#25064(flynn)。 - Web UI:如果该值看起来像 URL,则自动生成链接。 #25965 (alexey-milovidov)。
- 使
sudo service clickhouse-server start命令能在诸如 CentOS 8 这类使用systemd的系统上正常工作。关闭 #14298。关闭 #17799。#25921(alexey-milovidov)。
缺陷修复
- 修复在某些情况下不正确的
SET ROLE。 #26707 (Vitaly Baranov). - 修复窗口函数中潜在的
nullptr解引用问题。修复 #25276。#26668(Alexander Kuzmenkov)。 - 修正
groupBitmapAnd/Or/Xor的函数命名错误。修复 #26557(Amos Bird)。 - 修复在关闭 RabbitMQ 时,如果 RabbitMQ 尚未启动会发生的崩溃问题。修复 #26504。#26529(Kseniia Sumarokova)。
- 修复在字典名称或数据库名称被加上引号时,
CREATE DICTIONARY查询出现的问题。关闭了 #26491。#26508(Maksim Kita)。 - 修复重写列别名后出现的名称解析问题。修复 #26432。#26475(Amos Bird)。
- 修复在关闭
partial_merge_join时出现的无限未连接块流问题 #26325。#26374(Vladimir C)。 - 修复以已被删除用户身份登录时可能发生的崩溃。修复 #26073。#26363(Vitaly Baranov)。
- 修复
optimize_distributed_group_by_sharding_key在分片键为多列表达式时的问题(当分片键表达式包含多列并配合optimize_skip_unused_shards=1/allow_nondeterministic_optimize_skip_unused_shards=1使用时,会导致结果不正确)。 #26353 (Azat Khuzhin). CAST从Date到DateTime(或DateTime64)时,没有使用DateTime类型的时区。这也会影响Date和DateTime之间的比较。在为Date和DateTime推断通用类型时,同样没有使用相应的时区。这影响了函数if和数组构造表达式的结果。修复了 #24128。#24129(Maksim Kita)。- 修复了在丢失副本恢复过程中出现的罕见 bug,可能导致副本数据不一致。 #26321 (tavplubix).
- 修复在内部缓冲区末尾存在转义序列时的 zstd 解压缩问题。关闭 #26013。#26314(Kseniia Sumarokova)。
- 修复在带 totals 的 JOIN 中的逻辑错误,关闭 #26017。#26250(Vladimir C)。
- 移除
system.stack_trace表中thread_name列里多余的换行符。修复 #24124。#26210 (alexey-milovidov)。 - 修复在
LowCardinality列上使用joinGet时的问题,关闭 #25993。#26118(Vladimir C)。 - 修复在关闭
validate_polygons设置时pointInPolygon可能发生的崩溃问题。#26113 (alexey-milovidov). - 修复在遍历不存在的远程目录时抛出异常的问题。 #26087 (ianton-ru).
- 修复由于 ZooKeeper 客户端中的
abort导致的罕见服务器崩溃问题。解决了 #25813。#26079(alesapin)。 - 修复在某些情况下对右侧子查询 JOIN 的线程数估计错误。关闭 #24075。#26052(Vladimir C)。
- 修复了 ClickHouse 在查询执行期间引发异常时,通过 MySQL 协议发送的数据包中使用的错误
sequence_id。该问题可能导致 MySQL 客户端重置与 ClickHouse 服务器的连接。修复了 #21184。#26051(tavplubix)。 - 修复在使用普通投影和
PREWHERE时可能出现的头信息不匹配问题。修复 #26020。#26038(Amos Bird)。 - 修复将具有整数键的
Map类型格式化为JSON时的问题。#25982 (Anton Popov)。 - 修复在查询分析器堆栈展开过程中可能发生的死锁。修复 #25968。#25970(Maksim Kita)。
- 修复在使用错误参数调用
dictGet()时发生的崩溃。#25913 (Vitaly Baranov)。 - 修复了 PostgreSQL 引擎中的
scram-sha-256身份验证。关闭了 #24516。#25906(Kseniia Sumarokova)。 - 修复在后台线程池已满时后台任务退避时间过长的问题。修复了 #25836。#25893(alesapin)。
- 修复在非默认页面大小情况下的 ARM 异常处理,并修复了 #25512、#25044、#24901、#23183、#20221、#19703、#19028、#18391、#18121、#17994、#12483。#25854(Maksim Kita)。
- 修复
remote()在使用不带函数的列作为 sharding_key 时的行为(此前select * from remote('127.1', system.one, dummy)会导致Unknown column: dummy, there are only columns .错误)。 #25824 (Azat Khuzhin). - 修复了从
MaterializeMySQL查询时出现的Not found column ...和Missing column ...错误。修复了 #23708、#24830、#25794。#25822(tavplubix)。 - 修复在非 UInt64 类型上使用
optimize_skip_unused_shards_rewrite_in时的问题(可能最终会选择错误的分片,或抛出Cannot infer type of an empty tuple或Function tuple requires at least one argument)。#25798 (Azat Khuzhin). - 修复在
ReplicatedMergeTree表上执行DROP PART查询时出现的一个罕见错误,该错误可能会导致出现Unexpected merged part intersecting drop range错误信息。 #25783 (alesapin). - 修复在使用
GROUP BY表达式时的TTL问题:在某个数据分片中首次执行后会拒绝再次执行TTL。#25743 (alesapin). - 允许 StorageMerge 访问带别名的表。修复了 #6051 问题。#25694(Kseniia Sumarokova)。
- 在某些情况下修复了字典连接(dict join)过慢的问题,关闭 #24209。#25618(Vladimir C)。
- 修复在对参与 TTL 表达式的列执行
ALTER MODIFY COLUMN时出现的问题。 #25554 (Anton Popov). - 修复在
PREWHERE中使用非 UInt8 类型时的断言错误,关闭 #19589。#25484(Vladimir C)。 - 修复了一些由模糊测试触发的 msan 崩溃。修复了 #22517。#26428(Nikolai Kochetov)。
- 更新
clickhouse-serverDocker 入口点中的chown命令检查逻辑。修复了在 Kubernetes 上出现的“集群 pod(容器组)重启失败(或超时)”错误。#26545 (Ky Li)。
ClickHouse 版本 v21.7,2021-07-09
向后不兼容变更
- 提高了对显式定义大型集合的查询的性能。新增兼容性设置
legacy_column_name_of_tuple_literal。在将集群从低于 21.7 的版本滚动升级到任意更高版本时,建议将其设置为true。否则,在升级期间,IN子句中显式定义集合的分布式查询可能会失败。#25371(Anton Popov)。 - 在 clickhouse-keeper(ZooKeeper 的实验性替代方案)中更改了最大缓冲区大小,此更改在向前/向后兼容性上均不兼容。最好现在(在生产环境之前)完成这项变更,而不是以后。#25421(alesapin)。
新特性
- 支持使用 YAML 格式进行配置,作为 XML 的替代方案。此改动关闭了 #3607。#21858(BoloniniD)。
- 提供了一种在数据(可能)仍然存在但 ZooKeeper 元数据丢失时恢复复制表的方法。解决了 #13458。#13652(Mike Kot)。
- 在 Arrow/Parquet/ORC 中支持
struct和map,并在 Arrow 输入/输出格式中支持字典。新增设置output_format_arrow_low_cardinality_as_dictionary。#24341(Kruglov Pavel)。 - 在字典中新增对
Array类型的支持。#25119(Maksim Kita)。 - 新增函数
bitPositionsToArray。关闭 #23792。作者 [Kevin Wan] (@MaxWk)。#25394(Maksim Kita)。 - 新增函数
dateName,用于返回类似 'Friday' 或 'April' 的名称。作者 [Daniil Kondratyev] (@dankondr)。#25372(Maksim Kita)。 - 新增
toJSONString函数,用于将列序列化为其 JSON 表示形式。#25164(Amos Bird)。 - 现在
query_log新增了两列:initial_query_start_time、initial_query_start_time_microsecond,用于记录分布式查询(如果有)的起始时间。#25022(Amos Bird)。 - 新增聚合函数
segmentLengthSum。#24250(flynn)。 - 新增布尔设置
prefer_global_in_and_join,默认将所有 IN/JOIN 作为 GLOBAL IN/JOIN 执行。#23434(Amos Bird)。 - 为
Join表引擎新增对ALTER DELETE查询的支持。#23260(foolchi)。 - 新增聚合函数
quantileBFloat16,以及对应的quantilesBFloat16和medianBFloat16。这是一个非常简单且快速的分位数估计器,相对误差不超过 0.390625%。此改动关闭了 #16641。#23204(Ivan Novitskiy)。 - 实现了在流程分析(
flow analysis)中非常有用的sequenceNextNode()函数。#19766(achimbab)。
实验特性
- 新增对基于 HDFS 的虚拟文件系统的支持。#11058(overshov)(Kseniia Sumarokova)。
- 现在 clickhouse-keeper(ZooKeeper 的实验性替代方案)支持类似 ZooKeeper 的
digest类型 ACL。#24448(alesapin)。
性能改进
- 添加了一项优化,将某些函数重写为读取子列,以减少读取数据量。例如,语句
col IS NULL会被转换为读取子列col.null。可以通过设置optimize_functions_to_subcolumns来启用该优化,目前默认关闭。#24406 (Anton Popov). - 将更多列尽可能重写为别名表达式。这可以启用更好的优化,例如投影(projections)。#24405 (Amos Bird).
- 类型为
bloom_filter的索引可以用于带有常量数组的hasAny函数表达式。修复了问题:#24291。#24900 (Vasily Nemkov). - 在 RabbitMQ 队列为空时,为重新调度读取重试添加了指数退避机制。(ClickHouse 支持从 RabbitMQ 导入数据。)修复了问题 #24340。#24415 (Kseniia Sumarokova).
改进
- 允许限制复制时的网络带宽。添加了两个 Replicated*MergeTree 设置:
max_replicated_fetches_network_bandwidth和max_replicated_sends_network_bandwidth,用于限制表的复制拉取/发送的最大速度。添加了两个服务器级别的设置(在default用户配置中):max_replicated_fetches_network_bandwidth_for_server和max_replicated_sends_network_bandwidth_for_server,用于限制所有表的整体复制最大速度。这些设置不会被严格精确地执行。默认禁用。修复了 #1821。#24573(alesapin)。 - 为 ODBC 和 Library bridge 设置资源限制和隔离。为 bridge 进程使用单独的
clickhouse-bridge组和用户。设置 oom_score_adj,使这些 bridge 在发生 OOM 时优先成为 OOM killer 的回收目标。将最大 RSS 限制设置为 1 GiB。修复 #23861。#25280 (Kseniia Sumarokova)。 - 为主
clickhouse二进制文件新增独立的clickhouse-keeper符号链接。现在可以在不启动主 ClickHouse 服务器的情况下运行协调组件。#24059 (alesapin). - 对
VIEW的查询使用全局设置。修复了当对VIEW的查询使用本地设置时的行为,此前如果在CREATE VIEW和SELECT语句中的设置不同,就会导致错误。现在,VIEW不会再使用这些被修改的本地设置,但你仍然可以在CREATE VIEW查询的SETTINGS部分传递额外的设置。关闭 #20551。#24095(Vladimir)。 - 在服务器启动时,具有错误分区 ID 的数据分片不会被删除,而是始终被标记为分离(detached)。#25070。#25166 (Nikolai Kochetov)。
- 将后台调度线程池大小增加到 128(
background_schedule_pool_size设置)。这样可以避免在 ZooKeeper 连接较慢时复制队列发生阻塞。 #25072 (alesapin)。 - 新增 MergeTree 设置项
max_parts_to_merge_at_once,用于限制后台单次可合并的 part 数量。该设置不影响OPTIMIZE FINAL查询。修复了 #1820。#24496(alesapin)。 - 允许在分区剪枝中使用
NOT IN运算符。#24894 (Amos Bird)。 - 将类似
127.0.1.1的 IPv4 地址识别为本地地址。这一改动具有争议性,并据此关闭了 #23504。Michael Filimonov 将测试此功能。#24316 (alexey-milovidov)。 - 通过实验性功能 MaterializeMySQL 创建的 ClickHouse 数据库,现在包含了来自对应已物化 MySQL 数据库的所有列注释。 #25199 (Storozhuk Kostiantyn).
- 为 MySQL 存储引擎添加设置(
connection_auto_close/connection_max_tries/connection_pool_size)。#24146 (Azat Khuzhin). - 提升 Distributed 引擎的启动速度。 #25663 (Azat Khuzhin).
- 对 Distributed 表进行了改进:在设置
internal_replication=true时,从dirname中去除副本标识(这使得在带有cluster的 Distributed 表上可以从任意数量的副本执行INSERT操作;此前仅支持最多 15 个副本,更多副本时在为异步数据块创建目录时会因目录名过长(ENAMETOOLONG)而失败)。 #25513 (Azat Khuzhin). - 为
LowCardinality添加了对Interval类型的支持。它用于某些表达式的中间结果值。修复了 #21730。 #25410(Vladimir)。 - 在
sequenceMatch和sequenceCount函数的时间条件中支持使用==运算符。例如:sequenceMatch('(?1)(?t==1)(?2)')(time, data = 1, data = 2)。 #25299 (Christophe Kalenzaga)。 - 新增设置项
http_max_fields、http_max_field_name_size、http_max_field_value_size。#25296(Ivan)。 - 为函数
if的分支添加对Decimal和Int类型的支持。关闭了 #20549。关闭了 #10142。#25283(alexey-milovidov)。 - 在
clickhouse-client中更新提示符,并在重新连接时显示一条消息。此更改修复了 #10577。#25281(alexey-milovidov)。 - 修复聚合函数
topK中的内存跟踪问题,从而关闭了 #25259。#25260(alexey-milovidov)。 - 修复 IDN 主机(例如
example.рф)的topLevelDomain,此前此类主机会返回空字符串。#25103 (Azat Khuzhin)。 - 在运行时检测 Linux 内核版本(用于判断嵌套 epoll 是否可正常工作,这对于
async_socket_for_remote/use_hedged_requests是必需的,否则远程查询可能会卡住)。#25067 (Azat Khuzhin)。 - 对于分布式查询,当
optimize_skip_unused_shards=1时,允许在条件类似(sharding key) IN (one-element-tuple)的情况下跳过分片。(已支持包含多个元素的 tuple。单元素的 tuple 之前不起作用,因为它会被解析为字面量)。#24930 (Amos Bird)。 - 改进了 S3 错误的日志信息,当 key 或 bucket 为空时不再出现双空格。 #24897 (Vladimir Chebotarev).
- 某些查询需要进行多轮语义分析。在这种情况下,请尝试重用为
IN已构建的集合。#24874 (Amos Bird)。 - 在使用
insert_distributed_sync时应遵循max_distributed_connections(否则在大型集群上进行同步插入时,可能会耗尽max_thread_pool_size)。#24754 (Azat Khuzhin)。 - 避免对标量子查询隐藏类似
Limit for rows or bytes to read exceeded的错误。 #24545 (nvartolomei). - 使 String-to-Int 解析器更加严格,从而让
toInt64('+')抛出异常。#24475 (Amos Bird)。 - 如果通过 DDL 查询创建
SSD_CACHE,则必须在user_files目录下创建。 #24466 (Maksim Kita)。 - 添加对在 PostgreSQL 插入查询中指定非默认 schema 的支持。关闭 #24149。#24413 (Kseniia Sumarokova).
- 修复 IPv6 地址解析(例如修复
select * from remote('[::1]', system.one))。#24319 (Azat Khuzhin)。 - 在多行模式下修复带有子查询的 FROM 子句中的行尾空白,并对查询输出进行轻微调整,使其更易于阅读。#24151(Azat Khuzhin)。
- 对 Distributed 表的改进。增加在失败时拆分分布式批处理的功能(例如由于内存限制或数据损坏),通过
distributed_directory_monitor_split_batch_on_failure控制(默认关闭)。#23864 (Azat Khuzhin)。 - 修复
Join表引擎中的列名冲突问题,并关闭 #20309。#23769 (Vladimir)。 - 在通过 stdin 向
clickhouse-local的File表引擎以及clickhouse-client中的 INSERT 查询传递数据时显示进度。关闭 #18209。#23656(Kseniia Sumarokova)。 - 对
clickhouse-copier进行缺陷修复和功能改进。允许复制具有不同(但兼容)schema 的表。关闭 #9159。新增用于复制 ReplacingMergeTree 的测试。关闭 #22711。支持列级 TTL 和 Data Skipping Indices。在创建内部 Distributed 表时会简单地移除这些设置(底层表仍然保留 TTL 和 skipping indices)。关闭 #19384。允许复制 MATERIALIZED 和 ALIAS 列。在某些场景下这会很有用(例如该列在 PRIMARY KEY 中)。现在可以在任务配置中将allow_to_copy_alias_and_materialized_columns属性设置为 true 来启用。关闭 #9177。关闭 [#11007] (https://github.com/ClickHouse/ClickHouse/issues/11007)。关闭 #9514。在任务配置中新增属性allow_to_drop_target_partitions,用于在移动辅助表之前删除原始表中的分区。关闭 #20957。移除OPTIMIZE DEDUPLICATE查询。此前之所以需要这一临时方案,是因为ALTER TABLE MOVE PARTITION会被重试多次,而普通 MergeTree 表不支持去重。关闭 #17966。以 JSON 格式将进度写入 ZooKeeper 上task_path + /status路径对应的节点。关闭 #20955。支持无参数的 ReplicatedTables。关闭 #24834。#23518 (Nikita Mikhaylov)。 - 在从 S3 读取时的重试之间增加了带退避策略的休眠。 #23461 (Vladimir Chebotarev)。
- 在对
Distributed表执行 INSERT 时,遵循insert_allow_materialized_columns设置(允许物化列)。#23349 (Azat Khuzhin)。 - 为分布式查询新增对 LIMIT 下推的支持。 #23027 (Azat Khuzhin).
- 修复多个 S3 卷下的零拷贝复制问题(修复了 #22679)。#22864(ianton-ru)。
- 当用户向操作系统请求任意可用端口时,解析出实际绑定的端口号,并在日志消息中显示该端口号。#25569 (bnaecker).
- 修复了在某些情况下 PostgreSQL 数组转换结果为
String数据类型而不是 n 维数组的问题,原因是attndims在部分场景下工作不正确。关闭了 #24804。#25538(Kseniia Sumarokova)。 - 修复了 MySQL、PostgreSQL 和 ODBC 中带时区的
DateTime转换问题。关闭了 #5057。#25528(Kseniia Sumarokova)。 - 针对不同的表区分执行 KILL MUTATION(修复意外出现的
Cancelled mutating parts错误)。 #25025 (Azat Khuzhin). - 允许在 bucket 根目录下声明 S3 磁盘(S3 虚拟文件系统是一个正在开发中的实验性功能)。#24898 (Vladimir Chebotarev).
- 为分布式表支持读取子列(例如 Tuple 的各个组件)。#24472(Anton Popov)。
- MySQL 兼容协议的一项功能:使
user函数返回正确的输出。解决 #25697。#25697(sundyli)。
缺陷修复
- 改进了向后兼容性。在用作分区键时,采用旧版本的取模函数。解决了 #23508。#24157(Kseniia Sumarokova)。
- 修复了在低内存服务器上极其罕见出现的 Bug,它可能会导致除非重启否则无法执行合并操作。可能修复了 #24603。#24872 (alesapin)。
- 修复在并发执行
alter move/replace partition时,复制队列中出现的极为罕见错误Tagging already tagged part。可能修复了 #22142。#24961(alesapin)。 - 修复在通过对其他聚合函数状态进行再次聚合来计算聚合函数状态时可能发生的崩溃问题(这并不是实际的使用场景)。参见 #24523。#25015(alexey-milovidov)。
- 修复了在内存极少的服务器上执行查询
SYSTEM RESTART REPLICA或SYSTEM SYNC REPLICA无法完成时的处理逻辑。#24457(Nikita Mikhaylov)。 - 修复可能导致 ZooKeeper 客户端在 clickhouse-server 中挂起的缺陷。#24721 (alesapin)。
- 如果 ZooKeeper 连接丢失,并且在恢复连接后克隆了副本,那么其复制队列中可能会包含过时的条目。修复了当复制队列包含相交虚拟分片时触发的断言失败问题。这种情况在某些数据分片丢失时可能会极少发生。现在改为在日志中打印错误,而不是直接终止进程。#24777 (tavplubix)。
- 修复在查询计划的表达式下推优化中丢失
WHERE条件的问题(默认将query_plan_filter_push_down设置为 1)。修复 #25368。#25370(Nikolai Kochetov)。 - 修复了一个在带 TTL 的合并操作后可能导致数据片段相互重叠的缺陷:
Part all_40_40_0 is covered by all_40_40_1 but should be merged into all_40_41_1. This shouldn't happen often.。 #25549 (alesapin)。 - 在 ZooKeeper 连接丢失时,
ReplicatedMergeTree表在尝试重新连接之前可能会等待后台操作完成。此问题已修复,现在会强制终止后台操作。#25306 (tavplubix). - 修复了在主键中使用数组时,包含
ARRAY JOIN的查询出现错误Key expression contains comparison between inconvertible types的问题。修复了 #8247。#25546(Anton Popov)。 - 修复了使用
WITH TOTALS和WITH FILL的查询中错误的总计结果。修复了 #20872。#25539(Anton Popov)。 - 修复了在重新加载集群配置的同时查询
system.clusters时出现的数据竞争问题。 #25737 (Amos Bird)。 - 解决了在数据库之间移动
Distributed表时出现的No such file or directory错误。修复 #24971。#25667(tavplubix)。 - 在极少数情况下,如果源分区为空,
REPLACE PARTITION操作可能会被忽略。该问题现已修复。修复了 #24869。#25665(tavplubix)。 - 修复了
Replicated数据库引擎中的一个错误,该错误在极少数情况下可能导致某个副本跳过排队的 DDL 查询。 #24805 (tavplubix). - 修复在未提供查询时
EXPLAIN AST的空指针解引用问题。#25631 (Nikolai Kochetov). - 修复自动删除空 part 时的等待逻辑。该问题可能导致后台任务池被完全占满并使复制卡死。 #23315 (Anton Popov).
- 修复存储在 S3 虚拟文件系统中的表的还原功能(该功能为实验性特性,尚未准备好用于生产环境)。 #25601 (ianton-ru).
- 修复在使用
Decimal256时Arrow格式中的空指针(nullptr)解引用问题。为Arrow格式增加对Decimal256的支持。#25531(Kruglov Pavel)。 - 修复预处理后配置文件名称中多余的下划线。#25431(Vitaly Baranov)。
- 对
clickhouse-copier工具的修复:当 copier 的任务配置中缺少sharding_key时,修复段错误(segfault)。#25419 (Nikita Mikhaylov)。 - 通过对格式化后的查询进行正确引用,修复了在 DDL 中使用时的
REPLACE列转换器问题。此更改修复了 #23925。#25391(Amos Bird)。 - 修复
quantileDeterministic函数及类似函数中可能出现的非确定性行为问题。关闭了 #20480。#25313(alexey-milovidov)。 - 为
SummingMergeTree支持SimpleAggregateFunction(LowCardinality)。修复 #25134。#25300(Nikolai Kochetov)。 - 修复导致异常消息 "Cannot sum Array/Tuple in min/maxMap" 的逻辑错误。#25298 (Kruglov Pavel)。
- 修复在 IN 子句中使用
LowCardinality参数的查询时出现的错误Bad cast from type DB::ColumnLowCardinality to DB::ColumnVector<char8_t>(该缺陷出现在 21.6 版本)。修复了 #25187。#25290(Nikolai Kochetov)。 - 修复
joinGetOrNull在非 Nullable 列上的错误行为。修复了 #24261。#25288(Amos Bird)。 - 修复大整数中的错误行为和 UBSan 报告。在之前的版本中,
CAST(1e19 AS UInt128)会返回零。#25279 (alexey-milovidov)。 - 修复了在使用 CSVWithNames 格式插入部分列时出现的错误。修复了 #25129。#25169(Nikita Mikhaylov)。
- 不要在带有
FINAL的SELECT查询中使用表的投影。目前尚不支持该用法。#25163 (Amos Bird)。 - 修复在升级到 21.5 后,如果表在分区键中使用了
UUID时可能出现的数据片段(parts)丢失问题。(不建议在分区键中使用UUID)。修复了 #25070。#25127(Nikolai Kochetov)。 - 修复在包含 cross join 且
joined_subquery_requires_alias = 0的查询中发生的崩溃问题。修复了 #24011。#25082(Nikolai Kochetov)。 - 修复
mapContains函数中常量 map 的问题,该问题会导致错误empty column was returned by function mapContains。关闭 #25077。#25080(Kruglov Pavel)。 - 不再允许创建包含自引用列(例如
a UInt32 ALIAS a + 1或b UInt32 MATERIALIZED b)的表。修复 #24910、#24292。#25059(alesapin)。 - 修复在使用带有「非空」
GROUP BY键的聚合投影来执行按「空」键进行GROUP BY的查询时得到错误的结果的问题。 #25055 (Amos Bird)。 - 修复 Protobuf 格式中被拆分的嵌套消息的序列化。此 PR 修复了 #24647。#25000(Vitaly Baranov)。
- 修复分布式查询的 limit/offset 设置处理方式(在远程节点上忽略)。#24940 (Azat Khuzhin)。
- 修复
Arrow格式中可能出现的堆缓冲区溢出问题。#24922 (Kruglov Pavel)。 - 修复了从 DiskS3 读取文件时可能出现的错误 'Cannot read from istream at offset 0'(S3 虚拟文件系统是尚在开发中的实验性特性,不应在生产环境中使用)。 #24885 (Pavel Kovalenko).
- 修复在对分布式物化视图执行 JOIN 时出现的“Missing columns”异常。#24870 (Azat Khuzhin)。
- 在 PostgreSQL 兼容协议中允许使用
NULL值。解决了 #22622 中的问题。#24857(Kseniia Sumarokova)。 - 修复一个错误:在等待变更时,若变更尚未加载到内存中,可能会向客户端抛出
Mutation was killed异常。 #24809 (alesapin). - 修复了随机生成器状态反序列化中的一个错误,该错误可能导致
AggregateFunction(groupArraySample(N), T))等某些数据类型表现出不确定性行为。 #24538 (tavplubix)。 - 禁用基于其他聚合状态构建 uniqXXXXStates 的操作。 #24523 (Raúl Marín)。随后在真正消除相关问题的根本原因后,重新放开这一限制。 (alexey-milovidov)。
- 修复
CREATE .. AS SELECT查询中元组的用法。#24464(Anton Popov)。 - 修复
Buffer表中总字节数的计算。在当前 ClickHouse 版本中,total_writes.bytes计数器在缓冲刷新期间减少得过多,这会导致计数器溢出,并在刷新后一段时间内使totalBytes返回约 17.44 EB 的值。#24450(DimasKovas)。 - 修正关于
toWeek函数单调性的错误说明。此更改修复了 #24422。该缺陷最初在 https://github.com/ClickHouse/ClickHouse/pull/5212 中引入,之后被更智能的分区裁剪器暴露出来。#24446(Amos Bird)。 - 在使用 LDAP 管理用户身份验证时,修复了在 LDAP 角色映射/重新映射期间可能发生的潜在死锁问题:当某个 LDAP 组被映射到一个不存在的本地角色时,可能会导致死锁。#24431 (Denis Glazachev)。
- 在 "multipart/form-data" 消息中,将紧接在 boundary 之前的 CRLF 视为 boundary 的一部分。修复了 #23905。#24399(Ivan)。
- 修复在存在相交伪数据片段时执行 DROP PARTITION 的问题。在极少数情况下,可能会存在变更版本号大于当前块号的数据片段。#24321 (Amos Bird)。
- 修复了在使用
RENAME TABLE查询将物化视图从 Ordinary 数据库移动到 Atomic 数据库时的一个错误。现在内部表会与物化视图一同移动到新数据库。修复了 #23926。#24309(tavplubix)。 - 允许空的 HTTP 头字段。修复 #23901。#24285(Ivan)。
- 修复 Memory 表中变更操作(ALTER UPDATE/DELETE)处理不正确的问题。关闭 #24274。#24275(flynn)。
- 使 JOIN 输出中的列的 LowCardinality 属性与输入保持一致,关闭 #23351,关闭 #20315。#24061(Vladimir)。
- 针对 Kafka 表的修复。修复了故障切换行为中的一个 bug:当 Engine = Kafka 时,如果同一消费者之前的分配为空,则无法启动消费。关闭 #21118。#21267(filimonov)。
构建 / 测试 / 打包改进
- 在 CI 中添加
darwin-aarch64(Mac M1 / Apple Silicon)构建 #25560(Ivan),并在文档和网站中加入相关链接(alexey-milovidov)。 - 添加将二进制资源嵌入可执行文件的跨平台支持。在 Illumos 上也可用。#25146(bnaecker)。
- 为压力测试添加与 JOIN 相关的选项,以改进 fuzzing。#25200(Vladimir)。
- 在 OS X 上启用包含 S3 模块的构建 #25217。#25218(kevin wan)。
- 添加集成测试用例以覆盖 JDBC bridge。#25047(Zhichun Wu)。
- 集成测试配置对字典进行了特殊处理,移除了剩余的字典手动配置步骤。#24728(Ilya Yatsishin)。
- 为 YAMLParser 类添加 libfuzzer 测试。#24480(BoloniniD)。
- 现在使用 Ubuntu 20.04 来运行集成测试,用于运行集成测试的 docker-compose 版本更新为 1.28.2。环境变量现在会对 docker-compose 生效。重构 test_dictionaries_all_layouts_separate_sources 以允许并行运行。#20393(Ilya Yatsishin)。
- 修复安装脚本中的 TOCTOU 错误。#25277(alexey-milovidov)。
ClickHouse 21.6 版本,2021-06-05
不向后兼容的变更
uniqState/uniqHLL12State/uniqCombinedState/uniqCombined64State在UUID类型上会生成不兼容的状态。#33607。
升级说明
zstd压缩库已更新到 v1.5.0。复制过程中可能会看到 “checksum does not match” 的消息。这些消息是由于压缩算法更新而预期会出现的,可以忽略。它们仅为提示信息,并不表示存在任何异常行为。compile_expressions设置现在默认开启。尽管已经在各种场景下进行了大量测试,如果在服务器上发现任何异常行为,可以尝试关闭该设置。UUID类型的值不能与整数进行比较。例如,不要写uuid != 0,而应写成uuid != '00000000-0000-0000-0000-000000000000'。
新特性
- 添加类似 Postgres 的强制类型转换运算符(
::)。例如:[1, 2]::Array(UInt8)、0.1::Decimal(4, 4)、number::UInt16。#23871(Anton Popov)。 - 使大整数功能达到生产可用水平。增加对
UInt128数据类型的支持。修复Decimal256数据类型的已知问题。在字典中支持大整数。为大整数提供gcd/lcm函数支持。在数组搜索和条件函数中支持大整数。支持LowCardinality(UUID)。在generateRandom表函数和clickhouse-obfuscator中支持大整数。修复从标量子查询返回UUID时的错误。修复 #7834。修复 #23936。修复 #4176。修复 #24018。向后不兼容变更:UUID类型的值不能再与整数进行比较。例如,不要写uuid != 0,而应写为uuid != '00000000-0000-0000-0000-000000000000'。 #23631 (alexey-milovidov)。 - 在
Arrow、Parquet和ORC格式中支持使用Array数据类型进行数据插入和查询。 #21770 (taylor12805). - 实现表注释功能。关闭了 #23225。#23548 (flynn)。
- 支持在
clickhouse-local中使用 DDL 查询创建字典。修复并关闭了 #22354。新增对DETACH DICTIONARY PERMANENTLY的支持。为Atomic数据库引擎新增对EXCHANGE DICTIONARIES的支持。新增通过RENAME DICTIONARY在数据库之间迁移字典的支持。#23436 (Maksim Kita)。 - 为 ClickHouse 添加聚合函数
uniqTheta,以支持 Theta Sketch。#23894。#22609(Ping Yu)。 - 新增函数
splitByRegexp。 #24077 (abel-cheng). - 新增函数
arrayProduct,该函数接收一个数组作为参数,并返回该数组中所有元素的乘积。关闭 #21613。#23782(Maksim Kita)。 - 在
system.stack_trace中新增thread_name列。修复了 #23256。#24124(abel-cheng)。 - 当
insert_null_as_default= 1 时,在INSERT ... SELECT和INSERT ... SELECT ... UNION ALL ...查询中插入默认值而不是 NULL。修复了 #22832。#23524(Kseniia Sumarokova)。 - 为
clickhouse-local添加--progress选项以支持进度显示。#23196(Egor Savin)。 - 在
http字典源中添加对 HTTP 压缩的支持(由Content-EncodingHTTP 头部确定)。修复了 #8912。#23946(FArthur-cmd)。 - 新增了
SYSTEM QUERY RELOAD MODEL、SYSTEM QUERY RELOAD MODELS。修复了 #18722 问题。#23182(Maksim Kita)。 - 为
EXPLAIN PLAN查询新增json设置项(布尔值,默认 0)。启用后,查询输出将是一行JSON结果。建议使用TSVRaw格式以避免不必要的转义。 #23082 (Nikolai Kochetov). - 为
EXPLAIN PIPELINE查询新增设置项indexes(布尔类型,默认禁用)。启用后,会显示已使用的索引,以及每个已应用索引对应被过滤的数据片段和粒度数量。支持MergeTree*表。#22352 (Nikolai Kochetov)。 - LDAP:实现了用户 DN 检测功能,用于在将 Active Directory 组映射到 ClickHouse 角色时使用。#22228 (Denis Glazachev).
- 新增聚合函数
deltaSumTimestamp,通过存储时间戳在合并时保持顺序,用于对相邻行之间的差值求和。#21888(Russ Frank)。 - 为 S3 新增了安全性较低但在 Docker 环境下能正常工作的 IMDS 凭证提供程序。#21852 (Vladimir Chebotarev)。
- 恢复
indexHint函数。此更改针对 #21238。该更改回退了 #9542,并修复了 #9540。#21304(Amos Bird)。
实验性功能
性能改进
- 默认启用
compile_expressions设置。启用该设置后,简单函数和运算符的组合将在运行时使用 LLVM 编译为本机代码。#8482(Maksim Kita、alexey-milovidov)。注意:如果遇到问题,可以关闭此选项。 - 更新
re2库。提升了正则表达式匹配的性能。同时该 PR 增加了对 gcc-11 的兼容性。#24196(Raúl Marín)。 - ORC 输入格式改为按 stripe 读取,而不是一次性将整个表读入内存,在文件非常大的情况下可以减少内存占用。#23102(Chao Ma)。
- 在查询中将聚合函数
sum、count和avg合并为单个聚合函数。该优化通过optimize_fuse_sum_count_avg设置进行控制。通过新的聚合函数sumCount实现。该函数返回包含两个字段的元组:sum和count。#21337(hexiaoting)。 - 将
zstd更新到 v1.5.0。压缩性能提升了个位数百分比。#24135(Raúl Marín)。注意:在复制中可能会看到 "checksum does not match" 的消息。这些消息是由于压缩算法更新导致的预期行为,可以忽略。 - 提升
Buffer表的性能:对Buffer引擎不再为 total_bytes/total_rows 获取锁。#24066(Azat Khuzhin)。 - 恢复对 hashed/sparse_hashed 字典的预分配支持。#23979(Azat Khuzhin)。
- 默认启用
async_socket_for_remote(在查询扇出很大的 Distributed 表时减少线程数量)。#23683(Nikolai Kochetov)。
功能改进
- 为 MergeTree 表族添加
_partition_value虚拟列。它可用于以确定性方式对分区进行剪枝,这是为变更操作实现分区匹配器所必需的。#23673 (Amos Bird)。 - 为 S3 存储和磁盘新增了
region参数。#23846 (Vladimir Chebotarev). - 允许为不同的日志通道配置不同的日志级别。解决了 #19569。#23857(filimonov)。
- 在执行
DateTime运算且未显式提供时区时,保持其默认(无时区)状态不变。例如,如果对一个无时区的DateTime类型值加一秒,结果仍然是无时区的DateTime。在之前的版本中,默认时区的值会被显式写入返回的数据类型中,因此结果会变为 DateTime('something')。此更改关闭了 #4854。#23392(alexey-milovidov)。 - 允许用户在
MySQL存储引擎中将数据库名指定为空字符串,此时查询将使用默认数据库。在之前的版本中,这只适用于 SELECT 查询;现在也支持 INSERT。此更改关闭了 #19281。这在使用Sphinx或其他兼容 MySQL 的外部数据库时会很有用。#23319(alexey-milovidov)。 - 修复了
quantile(s)TDigest。根据 tdunning/t-digest 3.2+ 添加了对单个质心的特殊处理。同时修复了在较早版本算法实现中质心过度压缩的问题。#23314 (Vladimir Chebotarev)。 - 函数
now64现在支持可选的时区参数。#24091 (Vasily Nemkov)。 - 修复在
clickhouse-client交互模式下,当进度条出现在输出数据中间时,可能会覆盖终端中部分可见数据的问题。关闭了 #19283。#23050(alexey-milovidov)。 - 修复 simdjson 在内存分配失败时发生的崩溃。https://github.com/simdjson/simdjson/pull/1567。由于这是一个极其罕见的 bug,将其标记为改进。#24147(Amos Bird)。
- 在存储关闭前一直保留字典(可避免服务器关闭时在对
Buffer引擎进行最终刷新期间出现可能的external dictionary 'DICT' not found错误)。 #24068 (Azat Khuzhin). - 在关闭同一数据库中的表之前,先刷新
Buffer表,以避免由于底层表已被分离而导致数据块被丢弃(以及日志中出现Destination table default.a_data_01870 doesn't exist. Block of data is discarded错误)。 #24067 (Azat Khuzhin). - 现在,
prefer_column_name_to_alias = 1也会在group by、having和order by中优先使用列名。这解决了 #23882。#24022(Amos Bird)。 ORDER BY WITH FILL现已支持DateTime64。 #24016 (kevin wan).- 支持在
ReplacingMergeTree中将DateTime64作为版本列使用。 #23992 (kevin wan). - 在服务器启动时将操作系统名称、内核版本和 CPU 架构等信息记录到日志中。 #23988 (Azat Khuzhin).
- 支持为
postgresql字典源指定表结构。关闭 #23958。#23980(Kseniia Sumarokova)。 - 为
Enum元素的名称添加提示(在存在拼写错误时给出名称建议)。关闭 #17112。#23919(flynn)。 - 支持统计字典的命中率(找到值的百分比)(参见
system.dictionaries中的found_rate)。 #23916 (Azat Khuzhin). - 允许通过表设置
rabbitmq_queue_settings_list添加特定队列配置。(关闭 #23737 和 #23918)。允许用户完全控制 RabbitMQ 的全部初始化:如果表设置rabbitmq_queue_consume设为1,则 RabbitMQ 表引擎将只连接到指定队列,不会执行任何 RabbitMQ 消费端的初始化操作,例如声明 exchange、队列以及绑定关系。(关闭 #21757)。在删除 RabbitMQ 表时增加正确的清理逻辑——删除该表声明的队列以及所有已绑定的 exchange(如果是由该表创建的)。#23887(Kseniia Sumarokova)。 - 将
broken_data_files/broken_data_compressed_bytes添加到system.distribution_queue。添加指标BrokenDistributedFilesToInsert,用于统计已标记为损坏的、异步插入到 Distributed 表的文件数量。 #23885 (Azat Khuzhin). - 查询
system.tables时不再访问 ZooKeeper。#23793 (Fuwang Hu)。 OPTIMIZE查询现在会遵守lock_acquire_timeout_for_background_operations设置。#23623 (Azat Khuzhin).- 可以通过新的
SYSTEM RESTART DISKSQL 命令在运行时更改S3磁盘设置。#23429(Pavel Kovalenko)。 - 如果用户错误地将
max_distributed_connections设置为零,每次对Distributed表的查询都会抛出一个异常,其消息中包含 "logical error"。但这实际上是预期行为,而不是逻辑错误,因此该异常消息并不准确。它还在我们的 CI 环境中触发了用于确保不会发生任何逻辑错误的检查。现在,如果max_distributed_connections被错误配置为零,我们会将其视作最小可能值(一)。 #23348 (Azat Khuzhin)。 - 默认禁用
min_bytes_to_use_mmap_io。#23322 (Azat Khuzhin). - 通过
join_use_nulls支持LowCardinality的可空性,并关闭 #15101。#23237(vdimir)。 - 新增了将
MergeTree数据分片恢复到S3磁盘的detached目录中的功能。 #23112 (Pavel Kovalenko). - 在 S3 上的 HTTP 连接中断时进行重试。 #22988 (Vladimir Chebotarev).
- 为 MySQL 表引擎、字典源以及 MaterializeMySQL 的小批量数据读取新增
external_storage_max_read_rows和external_storage_max_read_rows设置。#22697(TCeason)。 MaterializeMySQL(实验性功能):此前由于 SQL 语法不兼容,不支持 MySQL 5.7.9 版本。现在将 MySQL 参数校验交给 MaterializeMySQL 处理。#23413 (TCeason)。- 支持在分布式表中读取子列。 #24472 (Anton Popov).
- 修复在
CREATE .. AS SELECT查询中对元组(tuple)的使用。#24464 (Anton Popov)。 - 为
Kafka表新增对Parquet格式的支持。#23412(Chao Ma)。
缺陷修复
- 在分区键和主键中使用时沿用旧版本的取模函数。修复了 #23508。#24157(Kseniia Sumarokova)。这是之前版本中造成向后不兼容的原因。
- 修复了执行查询
SYSTEM RESTART REPLICA或SYSTEM SYNC REPLICA时可能陷入无限处理状态的问题。该问题是在内存极少的服务器上被发现的。#24457 (Nikita Mikhaylov). - 修复
toWeek函数单调性错误。此修复解决了 #24422。该缺陷最初在 #5212 中被引入,后来被更智能的分区裁剪逻辑暴露出来。#24446(Amos Bird)。 - 修复在存在相交的伪分片时执行 drop partition 的问题。在极少数情况下,可能会出现其变更版本号大于当前块号的分片。 #24321 (Amos Bird).
- 修复了在通过
RENAME TABLE查询将物化视图从 Ordinary 数据库移动到 Atomic 数据库时的一个错误。现在内部表会随物化视图一起移动到新的数据库。修复了 #23926。#24309(tavplubix)。 - 允许客户端请求中包含空的 HTTP 头部。修复了 #23901。#24285(Ivan)。
- 将
max_threads设置为 1,以修复Memory表的 mutation 失败问题。关闭了 #24274。#24275(flynn)。 - 修复了
Memory表实现中的拼写错误,该缺陷是在 #15127 中引入的。修复了 #24192。#24193(张中南)。 - 修复在查询执行期间
HDFS无法访问时导致的服务器异常终止问题。关闭 #24117。#24191(Kseniia Sumarokova)。 - 修复在使用常量条件更新
Nested列时发生的崩溃。#24183 (hexiaoting). - 修复在高负载下 RBAC 中可能出现的竞争条件问题。此 PR 修复了 #24090、#24134、#24176(Vitaly Baranov)。
- 修复了一个罕见的错误,该错误可能导致表只被部分初始化却仍然可以处理写入请求(insert/alter 等)。现在此类表将处于只读模式。#24122 (alesapin)。
- 修复了一个问题:在使用
SELECT xxx FINAL时,EXPLAIN PIPELINE显示了错误的管线。(hexiaoting) - 修复了在
WHERE子句中使用常量DateTime值而不是DateTime64列的问题。 #24100 (Vasily Nemkov). - 修复 merge JOIN 中的崩溃,关闭 #24010。#24013(vdimir)。
- 某些
ALTER PARTITION查询可能会在复制队列中导致Part A intersects previous part B和Unexpected merged part C intersecting drop range D错误。该问题已修复,修复了 #23296。#23997 (tavplubix)。 - 修复外部 GROUP BY 与溢出行情况下产生的 SIGSEGV 段错误(即类似
SELECT FROM GROUP BY WITH TOTALS SETTINGS max_bytes_before_external_group_by>0, max_rows_to_group_by>0, group_by_overflow_mode='any', totals_mode='before_having'的查询)。#23962 (Azat Khuzhin)。 - 修复在源数据存在重复键时
CACHE字典键相关指标的统计问题(会导致DictCacheKeysRequestedMiss溢出)。#23929(Azat Khuzhin)。 - 修复
PostgreSQL引擎的连接池实现。解决 #23897。#23909(Kseniia Sumarokova)。 - 修复在
GROUP BY中以及聚合函数被包裹在普通函数中时使用distributed_group_by_no_merge = 2的问题(此前在 #23546 中被破坏)。当尝试将distributed_group_by_no_merge = 2与窗口函数一起使用时抛出异常。对包含窗口函数的查询禁用optimize_distributed_group_by_sharding_key。#23906(Azat Khuzhin)。 - 对
s3表函数的修复:改进对 HTTP 错误的处理。此前会忽略 HTTP 错误的响应正文。 #23844 (Vladimir Chebotarev)。 - 对
s3表函数的修复:改进了对 URI 的处理方式。修复了包含+符号的 URL 的不兼容问题,此前无法读取具有此类键的数据。#23822 (Vladimir Chebotarev)。 - 修复在使用
GLOBAL IN/JOIN且启用了use_hedged_requests的查询中出现的错误Can't initialize pipeline with empty pipe。修复了 #23431。#23805(Nikolai Kochetov)。 - 修复
CLEAR COLUMN在被物化视图引用时不起作用的问题。关闭 #23764。#23781(flynn)。 - 修复在使用
Values格式从 HDFS 读取数据时出现的堆内存 use-after-free 问题。 #23761 (Kseniia Sumarokova). - 避免在向 Distributed 执行 INSERT 时,如果发生异常,可能出现的 "Cannot schedule a task" 错误。#23744 (Azat Khuzhin).
- 修复了在恢复过期的
ReplicatedMergeTree副本时的一个缺陷。如果在副本宕机期间执行了ALTER查询,该过期副本可能会忽略部分元数据更新。 #23742 (tavplubix)。 - 修复
Join与WITH TOTALS的一个错误,关闭 #17718。#23549(vdimir)。 - 修复在进行了 filter-pushdown 优化后,使用
UNION的查询可能出现的Block structure mismatch错误。修复了 #23029。#23359(Nikolai Kochetov)。 - 在启用
optimize_skip_unused_shards_rewrite_in设置时添加类型转换。这修复了 MSan 报错。#23219 (Azat Khuzhin)。 - 在更新嵌套子列时补充缺失的检查,关闭 issue #22353。#22503(hexiaoting)。
构建/测试/打包改进
- 支持在 Illumos 上进行构建。#24144。增加对基于 Solaris 的操作系统进行构建的支持。#23746 (bnaecker).
- 为哈希表添加更多基准测试,包括来自 Google 的 Swiss Table(在我们的特定使用场景中,其性能反而比 ClickHouse 哈希映射更慢)。#24111 (Maksim Kita).
- 将 librdkafka 从 1.6.0-RC3 更新到 1.6.1。#23874 (filimonov).
- 始终显式启用
asynchronous-unwind-tables。这可能会修复 AArch64 上的查询分析器。#23602 (alexey-milovidov). - 避免在构建过程中可能对 locale 和文件系统顺序产生依赖,从而实现可重现构建。#23600 (alexey-milovidov).
- 移除构建过程中的一个不确定性来源。现在在不同时间点进行的构建将生成字节级完全一致的二进制文件。部分解决了 #22113。#23559 (alexey-milovidov).
- 添加用于对 (Zoo)Keeper 进行基准测试的简单工具。#23038 (alesapin).
ClickHouse 发行版 21.5,2021-05-20
向后不兼容的变更
- 更改整数与浮点数之间的比较逻辑:当整数无法在浮点数据类型中被精确表示时,比较行为会发生变化。在新版本中,由于会出现舍入误差,比较将返回
false。示例:9223372036854775808.0 != 9223372036854775808,因为数值9223372036854775808无法被精确表示为浮点数(并且9223372036854775808.0被舍入为9223372036854776000.0)。但在之前的版本中,该比较会返回数字相等,因为如果将浮点数9223372036854776000.0转换回 UInt64,将得到9223372036854775808。作为对比,Python 编程语言也会将这些数字视为相等。但这种行为取决于 CPU 型号(某些超出范围的数字在 AMD64 和 AArch64 上会得到不同结果),因此我们使比较更加精确。只有在整数可以在浮点类型中被精确表示时,才会将 int 和 float 视为相等。#22595 (alexey-milovidov)。 - 移除了对单个
Tuple参数使用argMin和argMax的支持。该实现无法保证内存安全。该特性是误加的,并且会让用户产生困惑。这些函数未来可以以不同的名称重新引入。此变更修复了 #22384 并回滚了 #17359。#23393 (alexey-milovidov)。
新特性
- 新增函数
dictGetChildren(dictionary, key)、dictGetDescendants(dictionary, key, level)。函数dictGetChildren返回所有子节点的索引数组,是dictGetHierarchy的逆变换。函数dictGetDescendants返回在递归应用dictGetChildrenlevel次后得到的所有后代节点。level为 0 等价于无限层级。并提升了dictGetHierarchy、dictIsIn函数的性能。修复 #14656。#22096 (Maksim Kita)。 - 新增函数
dictGetOrNull。其行为类似于dictGet,但在字典中找不到 key 时返回Null。修复 #22375。#22413 (Maksim Kita)。 - 新增表函数
s3Cluster,允许在指定集群的每个节点上并行处理来自s3的文件。#22012 (Nikita Mikhaylov)。 - 在 MySQL/PostgreSQL 表引擎 / 表函数中新增对副本和分片的支持。可以编写
SELECT * FROM mysql('host{1,2}-{1|2}', ...)。修复 #20969。#22217 (Kseniia Sumarokova)。 - 新增
ALTER TABLE ... FETCH PART ...查询。它类似于FETCH PARTITION,但只获取一个 part。#22706 (turbo jason)。 - 新增设置项
max_distributed_depth,用于限制针对Distributed表的递归查询深度。修复 #20229。#21942 (flynn)。
性能改进
- 通过对 AVX2 使用动态派发,提高了
intDiv的性能。修复了 #22314。#23000(alexey-milovidov)。 - 提高了从本地文件以外的数据源(例如 URL)读取
ArrowStream输入格式时的性能。#22673(nvartolomei)。 - 通过原生协议与 localhost 交互时(使用 clickhouse-client 或在分布式查询中服务器之间通信),默认禁用压缩。这可以提升某些导入/导出操作的性能。修复了 #22234。#22237(alexey-milovidov)。
- 在分布式查询中,从 IN 子句右侧排除不属于当前分片的值(受
optimize_skip_unused_shards_rewrite_in控制,默认启用,同时仍然需要开启optimize_skip_unused_shards)。#21511(Azat Khuzhin)。 - 改进了在使用 File-like 表引擎以及 Parquet、Arrow 或 ORC 等列式格式时读取列子集的性能。修复了 #issue:20129。#21302(keenwolf)。
- 允许像 21.1 版本之前那样将更多条件下推到
PREWHERE(通过调整内部启发式规则实现)。如果下推的条件数量不足,可能导致性能变差。#23397(Anton Popov)。 - 提高了 ODBC 连接的性能,并修复了积压列表中的所有遗留问题。使用
nanodbc库替代Poco::ODBC。修复了 #9678。为 ODBC 表引擎添加了对 DateTime64 和 Decimal* 的支持。修复了 #21961。修复了西里尔文文本被截断的问题。修复了 #16246。为 odbc bridge 添加了连接池。#21972(Kseniia Sumarokova)。
改进
- 将
max_uri_size(HTTP 接口中 URL 的最大大小)默认提高到 1 MiB。此更改解决了 #21197。#22997(alexey-milovidov)。 - 将
background_fetches_pool_size设置为8,对于存在频繁小批量插入或 ZooKeeper 集群较慢的生产环境来说更合适。 #22945 (alexey-milovidov). - FlatDictionary 新增了
initial_array_size、max_array_size选项。#22521 (Maksim Kita)。 - 新增设置
non_replicated_deduplication_window,用于非复制 MergeTree 插入去重。 #22514 (alesapin)。 - 在配置重新加载时更新
CatBoost模型配置的路径。#22434(Kruglov Pavel)。 - 在字典中新增了对
Decimal256类型的支持。Decimal256为实验性功能。修复了 #20979。#22960(Maksim Kita)。 - 默认启用
async_socket_for_remote(对分布式查询使用更少的 OS 线程)。#23683(Nikolai Kochetov)。 - 修复了
quantile(s)TDigest。根据 tdunning/t-digest 3.2+ 对仅包含单个点的质心添加了特殊处理。同时修复了此前算法实现中质心过度压缩的一个错误。 #23314 (Vladimir Chebotarev). - 将函数名
unhex调整为不区分大小写,以提升与 MySQL 的兼容性。 #23229 (alexey-milovidov)。 - 为数组元素类型不同时的泛型场景实现函数
arrayHasAny、arrayHasAll、has、indexOf、countEqual。在之前的版本中,函数arrayHasAny、arrayHasAll会返回 false,而has、indexOf、countEqual会抛出异常。同时在has及类似函数中增加了对Decimal和大整数类型的支持。此改动修复了 #20272。#23044 (alexey-milovidov)。 - 将函数
extractAllGroupsHorizontal返回结果中的最大匹配数上限提高了。#23036 (Vasily Nemkov)。 - 对于仅包含单个节点的集群,不要执行
optimize_skip_unused_shards。 #22999 (Azat Khuzhin). - 新增支持以 SSL 方式运行 clickhouse-keeper(ZooKeeper 的实验性即插即用替代方案)。配置项
keeper_server.tcp_port_secure可用于在客户端与 keeper-server 之间进行安全交互,keeper_server.raft_configuration.secure可用于启用节点之间的内部安全通信。#22992 (alesapin)。 - 为
Buffer表新增仅在后台刷新缓冲区的功能。#22986(Azat Khuzhin)。 - 从包含 NULL 的 MergeTree 表中进行带
WHERE条件的查询时,在少数情况下会抛出异常。此更改修复了该问题并关闭了 #20019。#22978(alexey-milovidov)。 - 修复 Poco HTTP 客户端在 AWS 上的错误处理。#22973 (kreuzerkrieg)。
- 使
ReplicatedMergeTree遵循max_part_removal_threads。 #22971 (Azat Khuzhin). - 修复当 MergeTree 设置 inactive_parts_to_throw_insert = 0 且 inactive_parts_to_delay_insert > 0 时的一个隐蔽边缘情况。 #22947 (Azat Khuzhin).
dateDiff现在也适用于DateTime64参数(即使参数值超出DateTime范围)#22931(Vasily Nemkov)。- MaterializeMySQL(实验性特性):新增了在不报错的情况下复制包含视图的 MySQL 数据库的支持,这是通过忽略这些视图来实现的。#22760(Christian)。
- 通过 PostgreSQL 协议允许 RBAC 行策略。已关闭 #22658。PostgreSQL 协议在配置中默认启用。#22755(Kseniia Sumarokova)。
- 添加指标,用于跟踪等待 Buffer 层锁所花费的时间。 #22725 (Azat Khuzhin).
- 允许在 VIEW 定义中使用 CTE。此更改解决了 #22491 问题。#22657(Amos Bird)。
- 如果先前的程序在终端中留下了垃圾输出,则在
clickhouse-client中清除屏幕剩余内容并重新显示光标。此更改关闭了 #16518。#22634(alexey-milovidov)。 - 使
round函数在非 x86_64 平台上的行为保持一致。采用将 0.5 舍入到最接近的偶数(银行家舍入)规则。 #22582 (alexey-milovidov). - 正确校验由 Distributed 表发送的数据块的结构。#22325 (Azat Khuzhin).
- 允许将 Kafka 错误写入 Kafka 引擎的虚拟列,并通过
kafka_handle_error_mode设置进行控制。 #21850 (fastio). - 为
visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String}添加别名simpleJSONExtract/simpleJSONHas。解决了 #21383。#21519(fastio)。 - 为库字典源新增
clickhouse-library-bridge。关闭问题 #9502。#21509 (Kseniia Sumarokova)。 - 当某列被物化视图引用时,禁止删除该列。修复 #21164。#21303(flynn)。
- 支持动态更新服务器间凭证(可在不停机的情况下轮换凭证)。 #14113 (johnskopis)。
- 为 Kafka 存储添加
Arrow和ArrowStream消息格式的支持。 #23415 (Chao Ma). - 修复了异常信息中缺失的分号。该异常信息可能会让用户觉得不够友好。 #23208 (alexey-milovidov).
- 修复了部分关于
LowCardinality类型的异常信息中缺失的空格。#23207 (alexey-milovidov)。 - 之前在
Markdown表格单元格中,某些值被设置为居中对齐。现在不再如此。#23096 (alexey-milovidov). - 从 clickhouse-client 的建议提示中移除非必要细节。关闭 #22158。#23040(alexey-milovidov)。
- 修正了 system.dictionaries 中 sparse_hashed 字典的
bytes_allocated字段的计算。#22867(Azat Khuzhin)。 - 修复了从 MergeTree 反向读取时近似总行数统计不准确的问题。#22726 (Azat Khuzhin)。
- 修复了允许将字典配置为使用指向自身的 ClickHouse 源,从而导致无限循环的问题。关闭 #14314。#22479(Maksim Kita)。
缺陷修复
- 针对对冲请求进行了多项修复。修复了在启用
use_hedged_requests设置且查询中使用GLOBAL IN/JOIN时出现的错误Can't initialize pipeline with empty pipe,对应 #23431。#23805(Nikolai Kochetov)。修复了对冲连接中的竞态条件问题,该问题会导致崩溃,对应 #22161。#22443(Kruglov Pavel)。修复了在启用async_socket_for_remote时,如果从远程查询接收到unknown packet可能导致的崩溃问题,对应 #21167。#23309(Nikolai Kochetov)。 - 修复了在禁用
input_format_with_names_use_header设置时会导致丢弃所有 CSVWithNames 格式输入数据的问题。此更改修复了 #22406。#23202(Nikita Mikhaylov)。 - 修复了远程 JDBC bridge 连接超时的问题。关闭了 #9609。#23771(Maksim Kita、alexey-milovidov)。
- 修正在指定
update_field时complex_key_hashed的初始加载逻辑。关闭 #23800。#23824(Maksim Kita)。 - 修复了在同时启用
PREWHERE和行级策略过滤且结果为空时发生的崩溃。 #23763 (Amos Bird). - 在向 Distributed 表执行 INSERT 时,如果发生异常,避免可能出现 “Cannot schedule a task” 错误。 #23744 (Azat Khuzhin).
- 在聚合函数
mannWhitneyUTest中,当两个样本的取值完全相同时,现在会抛出异常。这修复了 #23646。#23654(Nikita Mikhaylov)。 - 修复了通过 HTTP 插入数据时会触发异常的服务器故障。此修复解决了 #23512 中的问题。#23643(Nikita Mikhaylov)。
- 修复了对某些包含转义序列的
LIKE表达式的错误解析。#23610 (alexey-milovidov)。 - 修复了
restart/stop命令会挂起的问题。修复了 #20214。#23552(filimonov)。 - 修复了在包含多个 JOIN 的 SELECT 查询中
COLUMNS匹配器的行为。关闭 #22736。#23501(Maksim Kita)。 - 修复了当某列本身被用作
ReplacingMergeTree的参数时,修改该列的默认值会导致崩溃的问题。 #23483 (hexiaoting). - 修复了
ReplacingMergeTree在垂直合并时的一些边缘情况。在极少数情况下,这些问题可能会导致合并失败,并抛出类似Incomplete granules are not allowed while blocks are granules size的异常。 #23459 (Anton Popov). - 修复了一个错误:此前不允许将空数组字面量转换为维度大于 1 的数组,例如
CAST([] AS Array(Array(String)))。修复了 #14476。#23456(Maksim Kita)。 - 修复了一个错误:在重置计数器之后,
deltaSum聚合函数会产生错误的结果。#23437(Russ Frank)。 - 修复了在使用多磁盘配置创建 ReplicatedMergeTree 表失败时出现的
Cannot unlink file错误。此修复关闭了 #21755。#23433(tavplubix)。 - 修复了在基于虚拟列进行分区裁剪时生成不兼容常量表达式的问题。该修复对应于 https://github.com/ClickHouse/ClickHouse/pull/21401#discussion_r611888913。#23366(Amos Bird)。
- 修复了在将 join_algorithm 设置为 'auto' 并与 Dictionary 执行 Join 时发生的崩溃。关闭 #23002。#23312 (Vladimir)。
- 在进行分区裁剪时,不要放宽 NOT 条件。这修复了 #23305 和 #21539。#23310(Amos Bird)。
- 修复了在旧数据块后台清理过程中出现的极其罕见的竞态条件。如果某个数据块距离去重窗口结束过近,可能会导致该数据块未被去重。#23301 (tavplubix)。
- 修复了在创建和删除 ReplicatedMergeTree 表之间出现的极其罕见的(分布式)竞态条件。该问题可能在尝试创建复制表时导致类似
node doesn't exist的异常。修复了 #21419。#23294(tavplubix)。 - 修复了通过 DDL 创建简单键字典时,当主键不是第一个字段时的错误。修复了 #23236。 #23262(Maksim Kita)。
- 修复了当表中存在许多较长列名时通过 ODBC 读取数据的问题。关闭了 #8853。#23215(Kseniia Sumarokova)。
- MaterializeMySQL(实验性功能):修复了在对键列设置条件时,从
MaterializeMySQL查询出现的Not found column错误。修复 #22432。#23200(tavplubix)。 - 修正当子查询被优化为常量时的别名处理问题。修复 #22924。修复 #10401。#23191(Maksim Kita)。
- 如果在默认 profile 中启用了
data_type_default_nullable设置,服务器可能无法启动,现已修复。修复了 #22573。#23185 (tavplubix)。 - 修复了在关闭时由于当前连接数统计错误而导致的崩溃。#23154(Vitaly Baranov)。
- 修复了在将
物化视图从 Atomic 数据库分离并重新附加后,从该视图查询时出现的Table .inner_id... doesn't exist错误。#23047 (tavplubix)。 - 修复当子查询使用
untuple时可能发生的错误Cannot find column in ActionsDAG result。修复 #22290。#22991(Nikolai Kochetov)。 - 修复对包含可空值的
Map类型常量列的处理。#22939 (Anton Popov)。 - 修复了
DateTime64上的formatDateTime()和 "%C" 格式说明符的问题,并修复了toDateTime64()在处理大值和非零 scale 时的行为。 #22937 (Vasily Nemkov). - 修复了在将
mannWhitneyUTest和rankCorr与窗口函数一起使用时发生的崩溃问题。此修复解决了 #22728。#22876(Nikita Mikhaylov)。 - LIVE VIEW(实验性功能):修复了在
TemporaryLiveViewCleaner中并发执行 DROP/CREATE TEMPORARY LIVE VIEW 操作时可能出现的挂起问题,参见。#22858(Vitaly Baranov)。 - 修复了在过滤列参与聚合时
HAVING子句下推的问题。#22763 (Anton Popov). - 修复了在发生 OOM 异常时可能导致 ZooKeeper 请求挂起的问题。修复了 #22438。#22684(Nikolai Kochetov)。
- 修复了 ReplicatedMergeTree 表引擎在多个副本上等待 mutation 的机制。此前,mutation/alter 查询可能会在变更实际在其他副本上执行之前就结束。 #22669 (alesapin).
- 修复了在
SELECT子句未包含列时,带有嵌套类型的 Log 表抛出异常的问题。#22654 (Azat Khuzhin). - 修复辅助 AWS 请求无限期等待的问题。#22594 (Vladimir Chebotarev)。
- 修复了在客户端过早关闭连接时发生的崩溃 #22579。 #22591 (nvartolomei)。
Map数据类型(实验性功能):修复了在分布式查询中函数map的不正确格式化方式问题。 #22588 (foolchi).- 修复了在 TSV 格式中反序列化末尾没有换行符的空字符串的问题。此更改关闭了 #20244。在不升级版本的前提下,可采用的变通方案是将
input_format_null_as_default设为 0。在旧版本中该值默认为 0。#22527(alexey-milovidov)。 - 修复了 Merge Join 算法中对
LowCardinality类型列的错误类型转换问题。关闭 #22386,关闭 #22388。#22510(Vladimir)。 - 在读取时,
tokenbf_v1全文索引中可能发生缓冲区溢出。多余的字节不会被使用,但读取操作在极少数情况下可能导致崩溃。已修复该问题,关闭了 #19233。#22421(alexey-milovidov)。 - 不再限制 HTTP 分块大小。修复 #21907。#22322(Ivan)。
- 修复了一个错误:在启用
optimize_aggregation_in_order且表中存在大量数据片段时,会导致数据聚合不充分。在启用optimize_aggregation_in_order时略微提升了聚合性能。#21889(Anton Popov)。 - 检查是否将表函数视图当作列来使用。这补充了 #20350。#21465 (Amos Bird)。
- 修复在包含
JOIN和聚合的查询中,使用Merge引擎的表出现的 “unknown column” 错误。修复 #18368,#22226。#21370(Vladimir)。 - 修复了下推优化中的名称冲突问题。该问题会导致 FULL JOIN 之后的
WHERE过滤不正确。关闭 #20497。#20622(Vladimir)。 - 修复了一个极少出现的 bug:在使用
quorum_parallel=1进行 quorum 插入操作时,由于去重导致其实际上并不真正满足「quorum」语义。#18215(filimonov - 报告,alesapin - 修复)。
构建 / 测试 / 打包改进
- 在 CI 中并行运行无状态测试。#22300 (alesapin).
- 简化 Debian 软件包。这修复了 #21698。#22976 (alexey-milovidov).
- 新增对在 Apple M1 上构建 ClickHouse 的支持。#21639 (changvvb).
- 修复了在 macOS 上构建 ClickHouse Keeper 的问题。#22860 (alesapin).
- 修复了在 AArch64 平台上的一些测试。#22596 (alexey-milovidov).
- 添加了函数对齐以获得潜在的性能提升。#21431 (Danila Kutenin).
- 调整了一些测试,以便在 amd64 和 aarch64(qemu)上输出完全相同的结果。结果之前依赖于具体实现相关的 CPU 行为。#22590 (alexey-milovidov).
- 仅在 x86_64 上允许查询分析(profiling)。参见 #15174 和 #15638,从而关闭 #15638。#22580 (alexey-milovidov).
- 允许使用
USE_INTERNAL_XZ_LIBRARY=OFFCMake 选项,以非内置的 xz(lzma)库进行构建。#22571 (Kfir Itzhak). - 在
ppc64le上启用内置的openldap。#22487 (Kfir Itzhak). - 在
ppc64le上禁用不兼容的库(通常为特定平台相关)。#22475 (Kfir Itzhak). - 在 CI 中为 ClickHouse Keeper 添加 Jepsen 测试。#22373 (alesapin).
- 构建带有堆分析支持的
jemalloc。#22834 (nvartolomei). - 避免在
*Log引擎中由于从另一个线程进行 rwlock 解锁而导致的未定义行为(UB)。#22583 (Azat Khuzhin). - 通过在同一线程中解锁 TinyLog 的 rwlock 修复了未定义行为(UB)。#22560 (Azat Khuzhin).
ClickHouse 版本 21.4
ClickHouse 版本 21.4.1 2021-04-12
不兼容变更
- 函数
toStartOfIntervalFunction现在会将小时区间对齐到午夜(在之前的版本中,它们是对齐到 Unix 纪元起点)。例如,toStartOfInterval(x, INTERVAL 11 HOUR)会把每一天分成三个区间:00:00:00..10:59:59、11:00:00..21:59:59和22:00:00..23:59:59。这种行为更符合实际需求。此变更关闭了 #9510。#22060(alexey-milovidov)。 - graphite 汇总配置中的
Age和Precision应当随保留周期逐级递增。现在会对此进行检查,错误的配置会抛出异常。#21496(Mikhail f. Shiryaev)。 - 修复
cutToFirstSignificantSubdomainCustom()/firstSignificantSubdomainCustom()针对存在于自定义顶级域列表中的 3 级及以上域名返回错误结果的问题。对于匹配这些自定义顶级域的输入域名,此前会错误地将三级域名视为第一个有效子域名。现在已修复。如果该函数被用于例如分片键,此变更可能会引入不兼容。#21946(Azat Khuzhin)。 - 表
system.dictionaries中的列keys被替换为列key.names和key.types。现在,从system.dictionaries表中读取key.names、key.types、attribute.names、attribute.types列不再需要先加载字典。#21884(Maksim Kita)。 - 现在,正在处理
ALTER TABLE ATTACH PART[ITION]命令的副本会先在它们自己的detached/目录中查找数据,然后才从其他副本获取。作为实现细节,在复制日志中引入了一个新的命令ATTACH_PART。数据分片(parts)通过校验和进行查找和比较。#18978(Mike Kot)。注意:- 在集群升级期间,
ATTACH PART[ITION]查询可能无法工作。 - 在新版本中执行
ALTER ... ATTACH查询之后,将无法回滚到较旧的 ClickHouse 版本,因为旧服务器无法处理复制日志中的ATTACH_PART记录。
- 在集群升级期间,
- 在此版本中,空的
<remote_url_allow_hosts></remote_url_allow_hosts>将会阻止对所有远程主机的访问,而在之前版本中它不起任何作用。如果你希望保留旧行为并且在配置文件中包含空的remote_url_allow_hosts元素,请将其删除。#20058(Vladimir Chebotarev)。
新功能
- 将
DateTime64的取值范围扩展为支持从 1925 年到 2283 年的日期。改进了在纪元起始日期(1970-01-01)附近对DateTime的支持。#9404 (alexey-milovidov, Vasily Nemkov)。并非所有日期和时间函数都适用于扩展后的日期范围。 - 为预先配置的用户和 HTTP 请求(GSS-SPNEGO)添加了 Kerberos 认证支持。#14995 (Denis Glazachev)。
- 添加
prefer_column_name_to_alias设置,以便使用原列名而不是别名。这可以更好地兼容常用数据库的别名规则。对应 #9715 和 #9887。#22044(Amos Bird)。 - 新增函数
dictGetChildren(dictionary, key)和dictGetDescendants(dictionary, key, level)。函数dictGetChildren返回所有子节点索引组成的数组,是dictGetHierarchy的逆变换。函数dictGetDescendants返回在将dictGetChildren递归应用level次后得到的所有后代节点。level为 0 时等价于无限层级。关闭 #14656。#22096(Maksim Kita)。 - 新增
executable_pool字典源。关闭 #14528。#21321(Maksim Kita)。 - 新增了
dictionary表函数,其工作方式与Dictionary引擎相同。修复了 #21560。 #21910 (Maksim Kita). - 支持将
Nullable类型用于PolygonDictionary属性。#21890 (Maksim Kita)。 - 函数
dictGet、dictHas对于使用 DDL 创建的字典,在未显式指定数据库名时会使用当前数据库名。修复了 #21632。#21859(Maksim Kita)。 - 新增函数
dictGetOrNull。其工作方式与dictGet相同,但在字典中未找到键时返回Null。修复了问题 #22375。#22413(Maksim Kita)。 - 在
ComplexKeyCache、SSDCache、SSDComplexKeyCache字典中新增了异步更新功能。在Cache、ComplexKeyCache、SSDCache、SSDComplexKeyCache字典中新增了对Nullable类型的支持。为dictGet、dictGetOrDefault函数新增了一次获取多个属性的支持。修复了 #21517。#20595(Maksim Kita)。 - 为
RangeHashedDictionary增加对dictHas函数的支持。修复 #6680。#19816(Maksim Kita)。 - 添加函数
timezoneOf,用于返回DateTime或DateTime64数据类型的时区名称。此更改并未关闭 #9959。修复函数命名中的不一致问题:添加别名timezone和timeZone,以及toTimezone和toTimeZone、timezoneOf和timeZoneOf。#22001(alexey-milovidov)。 - 为
CREATE/ALTER USER命令新增了可选子句GRANTEES。该子句用于指定哪些用户或角色可以从此用户处接收授权,前提是此用户自身也已被授予所有所需的访问权限且带有 grant 选项。默认使用GRANTEES ANY,这意味着具有 grant 选项的用户可以向任意对象授予权限。语法:CREATE USER ... GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]。 #21641 (Vitaly Baranov)。 - 在
system.clusters中新增列slowdowns_count。在使用对冲请求时,该列表示由于某个副本响应过慢而切换到其他副本的次数。同时在system.clusters中显示errors_count的实际值。#21480(Kruglov Pavel)。 - 为
MergeTree*引擎添加_partition_id虚拟列,允许通过_partition_id对分区进行剪枝。添加partitionID()函数用于计算分区 ID 字符串。#21401 (Amos Bird). - 添加函数
isIPAddressInRange,用于判断某个 IPv4 或 IPv6 地址是否位于给定的 CIDR 网络前缀范围内。 #21329 (PHO). - 新增了 SQL 命令
ALTER TABLE 'table_name' UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'。该命令用于正确地从所有磁盘上删除已“冻结”的分区。#21142 (Pavel Kovalenko). - 支持 JOIN 中键类型的隐式转换。 #19885 (Vladimir)。
实验特性
- 为浮点类型的窗口函数支持
RANGE OFFSET窗口帧。实现lagInFrame/leadInFrame窗口函数,它们与lag/lead类似,但会遵循窗口帧设置。当窗口帧为between unbounded preceding and unbounded following时,它们是等价的。修复了 #5485。#21895(Alexander Kuzmenkov)。 - 针对基于 S3 存储的
ReplicatedMergeTree支持零拷贝复制。#16240(ianton-ru)。 - 增加了将已有 S3 磁盘迁移到具备备份/恢复能力的 schema 的功能。#22070(Pavel Kovalenko)。
性能改进
- 在
clickhouse-local以及其他所有场景中支持并行格式化。#21630(Nikita Mikhaylov)。 - 支持对
CSVWithNames和TSVWithNames格式进行并行解析。修复了 #21085。#21149(Nikita Mikhaylov)。 - 为从 64 MiB 起的文件区间启用基于 mmap 的读取 I/O(设置项
min_bytes_to_use_mmap_io)。这可能带来中等程度的性能提升。#22326(alexey-milovidov)。 - 为通过
min_bytes_to_use_mmap_io设置进行读取的文件添加缓存。当该设置值较小时,这可以通过避免频繁的 mmap/munmap 调用以及随之产生的缺页异常,带来显著(2 倍及以上)的性能提升。请注意,mmap I/O 存在一些主要缺点,使其在生产环境中的可靠性较差(例如在磁盘故障时可能出现挂起或 SIGBUS;内存使用更难控制)。尽管如此,在基准测试中它表现良好。#22206(alexey-milovidov)。 - 在使用 codec
NONE时避免不必要的数据拷贝。请注意,codecNONE基本上没什么用——推荐始终使用压缩(默认是LZ4)。与常见看法相反,禁用压缩未必会提升性能(甚至可能产生相反效果)。NONEcodec 在某些场景中有用:- 当数据不可压缩时;- 用于合成基准测试。#22145(alexey-milovidov)。 - 当
max_rows_to_group_by较小且group_by_overflow_mode='any'时加速GROUP BY。#21856(Nikolai Kochetov)。 - 优化类似
SELECT ... FINAL ... WHERE的查询性能。现在在包含FINAL的查询中,允许将排序键中的列下推到PREWHERE。#21830(foolchi)。 - 通过将
memcpy替换为另一种实现提升性能。修复了 #18583。#21520(alexey-milovidov)。 - 提升按排序键顺序进行聚合时的性能(启用设置
optimize_aggregation_in_order时)。#19401(Anton Popov)。
改进
- 为 PostgreSQL 表/数据库引擎和字典源添加连接池,从而修复 #21444。#21839(Kseniia Sumarokova)。
- 为
postgres存储 / 表函数添加对非默认表结构的支持。修复了 #21701。#21711(Kseniia Sumarokova)。 - 为 Postgres 字典源增加副本优先级支持。 #21710 (Kseniia Sumarokova).
- 引入一个新的 MergeTree 设置
min_bytes_to_rebalance_partition_over_jbod,用于以均衡的方式将新的 part 分配到 JBOD 卷上的不同磁盘。#16481(Amos Bird)。 - 为
system.query_log中对应的查询在query_kind列中新增了Grant、Revoke和System取值。#21102 (Vasily Nemkov). - 允许单独自定义用于复制的 HTTP 连接的超时时间,使其独立于其他 HTTP 超时时间。 #20088 (nvartolomei).
- 在服务器写入数据块时发生异常的情况下,为客户端提供了更清晰的异常信息。在先前版本中,客户端可能会收到具有误导性的消息,例如
Data compressed with different methods。#22427 (alexey-milovidov)。 - 修复在获取分片失败后可能出现的错误
Directory tmp_fetch_XXX already exists。如果临时拉取目录已存在则将其删除。修复了 #14197。#22411(nvartolomei)。 - 修复
range函数在使用UInt256参数时的 MSan 报告(对大整数的支持仍为实验性特性)。关闭 #22157。#22387(alexey-milovidov)。 - 在
system.processes表中添加current_database列。该列表示查询当前所在的数据库。#22365(Alexander Kuzmenkov)。 - 为
clickhouse-client增加不区分大小写的历史记录搜索/导航和子词级移动功能。#22105 (Amos Bird)。 - 如果由
NULL组成的元组(例如(NULL, NULL))位于IN运算符左侧,而右侧是由非NULL元组组成的集合,例如SELECT (NULL, NULL) IN ((0, 0), (3, 1)),则返回 0,而不是抛出类型不兼容的异常。该表达式也可能由于对如下语句进行优化而出现:SELECT (NULL, NULL) = (8, 0) OR (NULL, NULL) = (3, 2) OR (NULL, NULL) = (0, 0) OR (NULL, NULL) = (3, 1)。此更改修复了 #22017。#22063(alexey-milovidov)。 - 将使用的 simdjson 版本更新为 0.9.1。此更新修复了 #21984。见 #22057(Vitaly Baranov)。
- 为
CONNECTION_ID()和VERSION()函数添加了不区分大小写的别名,从而修复了 #22028。#22042(Eugene Klimov)。 - 为
windowFunnel函数新增strict_increase选项,从而让每个事件只被计算一次(解决 #21835)。 #22025(Vladimir)。 - 如果
MergeTree表的分区键不包含Date或DateTime列,但恰好包含一列DateTime64列,则在system.parts和system.parts_columns表中的min_time和max_time列中公开其取值。向system.parts_columns表添加min_time和max_time列(此前与system.parts表存在不一致)。解决了 #18244。#22011(alexey-milovidov)。 - 在
clickhouse-copier中新增对replication_alter_partitions_sync=1设置的支持,以便将分区从辅助表移动到目标表。缩短了默认超时时间。修复 #21911。#21912(turbo jason)。 - 在 system 表中显示
EmbeddedRocksDB表的数据目录路径。#21903(tavplubix)。 - 添加 profile 事件
HedgedRequestsChangeReplica,将读取数据的超时单位从秒改为毫秒。 #21886 (Kruglov Pavel)。 - DiskS3(正在开发中的实验性特性)。修复了在目标目录非空且使用缓存磁盘的情况下无法移动目录的错误。#21837(Pavel Kovalenko)。
- 在 Web UI 中改进了对
Array和Map数据类型的格式化显示。#21798 (alexey-milovidov). - 仅在其配置被更新时才更新集群。#21685 (Kruglov Pavel).
- 在分布式 DDL 查询中传播查询和会话设置。将
distributed_ddl_entry_format_version设置为 2 以启用此功能。新增distributed_ddl_output_mode设置。支持的模式:none、throw(默认)、null_status_on_timeout和never_throw。对Replicated数据库引擎进行了其他修复和改进。#21535(tavplubix)。 - 如果
PODArray在实例化时使用的元素大小既不是 16 的倍数,也不是 16 的分数,就有可能发生缓冲区溢出。当前发布版本中不存在这一缺陷。 #21533 (alexey-milovidov)。 - 向
system.errors表添加last_error_time/last_error_message/last_error_stacktrace/remote列。#21529 (Azat Khuzhin). - 为
visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String}添加别名simpleJSONExtract/simpleJSONHas。修复 #21383。#21519 (fastio)。 - 新增设置项
optimize_skip_unused_shards_limit,用于限制optimize_skip_unused_shards的分片键值数量。#21512 (Azat Khuzhin)。 - 改进
clickhouse-format,在最后一个查询后存在额外空格或注释时不再抛出异常,并在格式化带数据的ASTInsertQuery时尽早抛出包含可读错误信息的异常。 #21311 (flynn). - 改进对数据类型
Map中整数键的支持。#21157(Anton Popov)。 - MaterializeMySQL:在连接丢失时尝试重新连接到 MySQL。#20961 (Håvard Kvålen)。
- 支持在更多情况下将
CROSS JOIN重写为INNER JOIN。#20392 (Vladimir)。 - 在启用
optimize_on_insert设置时,不再在 INSERT 时创建空分片。修复了 #20304。#20387(Kruglov Pavel)。 MaterializeMySQL:为_version列添加 minmax 跳过索引。 #20382 (Stig Bakken).- 为
clickhouse-format新增选项--backslash,用于在格式化查询的每一行末尾添加反斜杠。 #21494 (flynn)。 - 现在在尝试对已覆盖部分执行变更操作时,ClickHouse 将不再抛出
LOGICAL_ERROR异常。修复了 #22013。#22291 (alesapin)。
缺陷修复
- 在
HedgedConnections中,在取消数据包接收器之前先从 epoll 中移除 socket,以防止潜在的竞态。修复了 #22161。#22443(Kruglov Pavel)。 - 在并行解析例程中补充缺失的内存统计逻辑。之前的版本中,当结果集包含非常大的数据块时,可能会导致 OOM。本变更关闭了 #22008。#22425(alexey-milovidov)。
- 修复在
SELECT语句使用常量WHERE条件且源表中存在列名为数字的列时可能引发的异常。 #22270 (LiuNeng). - 使用
use_hedged_requests=0和async_socket_for_remote=1修复查询取消问题。#22183 (Azat Khuzhin). - 修复
InterserverIOHTTPHandler中未捕获异常。 #22146 (Azat Khuzhin). - 在配置中未包含
http_port时修复 Docker entrypoint。 #22132 (Ewout)。 - 修复在
JOIN配合TOTALS和arrayJoin使用时出现的Invalid number of rows in Chunk错误。关闭 #19303。#22129(Vladimir)。 - 修复用于从 Kafka 轮询消息的后台线程池名称。使用线程池配置错误的 Kafka 引擎将不会从消息队列中消费消息。 #22122 (fastio)。
- 修复了
ReplicatedMergeTree表引擎中OPTIMIZE和ALTER查询在等待时的问题。现在即使表被分离或重启,查询也不会再挂起。#22118 (alesapin). - 针对存在缺陷的 Linux 内核禁用
async_socket_for_remote/use_hedged_requests。#22109 (Azat Khuzhin). - Docker entrypoint:当
LOG_PATH为空时避免对当前目录.执行 chown。修复 #22100。#22102(filimonov)。 - 函数
decrypt在AEAD模式下未对加密数据的最小长度进行检查。此更改关闭了 #21897。#22064(alexey-milovidov)。 - 在极少数情况下,
CollapsingMergeTree的合并可能会生成包含index_granularity + 1行的 granule。为此,在 #18928 中添加的内部检查(影响 21.2 和 21.3)可能会失败,并报错Incomplete granules are not allowed while blocks are granules size。该错误会阻止分片进行合并。#21976(Nikolai Kochetov)。 - 回滚了可能在加载哈希类型外部字典时导致内存使用量显著增加的更改 #15454,从而解决了 #21935。#21948(Maksim Kita)。
- 防止对冲连接出现重叠(
Unknown packet 9 from server错误)。#21941(Azat Khuzhin)。 - 修复了在某些情况下读取 Content-Type 为 "multipart/form-data" 的 HTTP POST 请求时出现的问题。 #21936 (Ivan).
- 修复在查询包含窗口函数且启用了按主键顺序读取优化时出现的错误
ORDER BY结果。修复了 #21828。#21915(Alexander Kuzmenkov)。 - 修复首次执行 catboost 模型时的死锁问题。关闭 #13832。#21844(Kruglov Pavel)。
- 修复了在将
WHERE或HAVING条件下推到GROUP BY之前时可能出现的查询结果不正确甚至崩溃的问题。修复了 #21773。#21841(Nikolai Kochetov)。 - 在
WriteBufferFromS3中改进错误处理和日志。 #21836 (Pavel Kovalenko). - 修复在使用两层聚合时,带有组合器
Distinct的聚合函数中可能出现的崩溃问题。这是对 #18365 的后续修复。该问题只能在生产环境中复现。#21818(Amos Bird)。 - 修复标量子查询的索引分析。该修复解决了在 #18896 中引入的 #21717 问题。#21766(Amos Bird)。
- 修复
ReplicatedMerge表引擎的一个错误:当Decimal列的大小(32 位或 64 位)未发生变化时,ALTER MODIFY COLUMN查询不会更改该列的类型。#21728(alesapin)。 - 修复在
ReplicatedMergeTree上并发执行OPTIMIZE和DROP时可能出现的无限期等待问题。 #21716 (Azat Khuzhin). - 修复
arrayElement函数在Map类型上处理常量整数参数时的问题。#21699 (Anton Popov)。 - 修复在使用
access_to_key_from_attributes从ip_trie访问不存在的属性时导致的 SIGSEGV。 #21692 (Azat Khuzhin). - 服务器现在会仅在
DDLWorker和字典初始化完成后才开始接受连接。 #21676 (Azat Khuzhin). - 为类型为
Join的表的键添加类型转换(此前可能会导致 SIGSEGV)。 #21646 (Azat Khuzhin). - 修复在启用
async_socket_for_remote=1时分布式请求无法正确取消的问题(例如对多个分片执行带有 limit 的简单查询,即select * from remote('127.{2,3}', system.numbers) limit 100)。#21643(Azat Khuzhin)。 - 修复
fsync_part_directory在水平合并中的问题。#21642 (Azat Khuzhin)。 - 在针对外部数据库引擎(MySQL、PostgreSQL)的查询中,从
WHERE子句中移除关联表中未知的列。关闭 #14614、关闭 #19288(重复)、关闭 #19645(重复)。#21640(Vladimir)。 - 如果在向 S3 写入数据时出现错误,会调用
std::terminate。 #21624 (Vladimir)。 - 修复在启用
optimize_skip_unused_shards且未使用任何分片时可能出现的错误Cannot find column。 #21579 (Azat Khuzhin). - 如果查询中包含常量
WHERE条件,并且启用了optimize_skip_unused_shards设置,则所有分片可能会被跳过,从而导致查询错误地返回空结果集。#21550 (Amos Bird)。 - 修复表函数
clusterAllReplicas返回错误_shard_num的问题。关闭 #21481。#21498(flynn)。 - 修复在配置更新后 S3 表仍然保留旧凭证的问题。 #21457 (Grigory Pervakov).
- 修复了 Poco 中
SecureSocket内部 SSL 对象上的竞争条件问题。#21456(Nikita Mikhaylov)。 - 修复
Kafka的Avro格式解析问题。修复了 #21437。#21438(Ilya Golshtein)。 - 修复 secure socket 中接收和发送超时以及非阻塞读取的问题。 #21429 (Kruglov Pavel).
- 已修复
force_drop_table标志位对MATERIALIZED VIEW不生效的问题。修复了 #18943。#20626(tavplubix)。 - 修复
PredicateRewriteVisitor中的名称冲突问题。该问题会在 FULL JOIN 之后导致WHERE过滤错误。关闭 #20497。#20622(Vladimir)。
构建/测试/打包改进
- 为 ClickHouse Keeper 添加 Jepsen 测试。#21677 (alesapin)。
- 在 CI 中并行执行无状态测试。依赖于 #22181。#22300 (alesapin)。
- 在 SQLancer 的 CI 运行中启用状态检查。#22015(Ilya Yatsishin)。
- 针对 PowerPC 构建进行了多项准备:在
ppc64le上启用内置的 openldap。#22487(Kfir Itzhak)。在ppc64le上启用使用 Clang 编译。#22476(Kfir Itzhak)。修复在ppc64le上编译 boost 的问题。#22474(Kfir Itzhak)。修复ppc64le上关于内部 CMake 变量CMAKE_ASM_COMPILE_OBJECT未设置的 CMake 错误。#22469(Kfir Itzhak)。修复 Fedora/RHEL/CentOS 在ppc64le上找不到libclang_rt.builtins的问题。#22458(Kfir Itzhak)。在ppc64le上启用使用jemalloc进行构建。#22447(Kfir Itzhak)。修复 ClickHouse 的配置内嵌以及 cctz 的时区内嵌在ppc64le上的问题。#22445(Kfir Itzhak)。修复在ppc64le上的编译问题,并改为在ppc64le上使用正确的指令指针寄存器。#22430(Kfir Itzhak)。 - 在
aarch64上重新启用 S3(AWS)库。#22484(Kfir Itzhak)。 - 在 Docker 容器中添加
tzdata,因为读取ORC格式数据时需要它。此更改修复了 #14156。#22000(alexey-milovidov)。 - 为
clickhouse-server镜像的 Dockerfile 新增 2 个参数:deb_location和single_binary_location。#21977(filimonov)。 - 通过在使用 clang-tidy 时启用断言,允许在 release 构建中使用 clang-tidy。 #21914 (alexey-milovidov).
- 在 CMake 脚本中添加对 llvm-12 可执行文件名称的搜索。对隐式常量转换进行处理以消除 clang 警告。更新子模块以使用 CMake 3.19 进行构建。在
readpassphrase库中屏蔽宏展开时的递归。将 clang 中已弃用的-fuse-ld替换为--ld-path。#21597 (Ilya Yatsishin). - 将
docker/test/testflows/runner/dockerd-entrypoint.sh更新为使用 Yandex dockerhub-proxy,因为 Docker Hub 启用了非常严格的镜像拉取频率限制 #21551 (vzakaznikov)。 - 修复 macOS 共享库的构建。#20184 (nvartolomei).
- 为
zookeeper-dump-tree添加ctime选项,该选项用于导出节点的创建时间。#21842 (Ilya).
ClickHouse 版本 21.3(LTS)
ClickHouse 发布 v21.3,2021-03-12
向后不兼容变更
- 现在不再允许使用旧语法在带有表级 TTL 的情况下创建 MergeTree 表,因为该 TTL 会被忽略。不过仍然可以附加(ATTACH)旧表。#20282 (alesapin).
- 现在所有不区分大小写的函数名都会被重写为其规范形式。这是投影查询路由(即将推出的特性)所必需的。#20174 (Amos Bird).
- 修复了在表达式为函数且与
ORDER BY键相同的情况下创建TTL的问题。现在允许在带有GROUP BY的TTL中为主键列设置自定义聚合方式。向后不兼容变更:对于那些不在GROUP BY中且未显式设置聚合方式的主键列,在 TTL 过期时现在会应用函数any,而不是此前的max。此外,如果你使用带有WHERE或GROUP BY的 TTL,在进行滚动升级时的合并阶段可能会遇到异常。#15450 (Anton Popov).
新特性
- 添加文件引擎设置:
engine_file_empty_if_not_exists和engine_file_truncate_on_insert。#20620 (M0r64n)。 - 添加聚合函数
deltaSum,用于对相邻行之间的差值求和。#20057 (Russ Frank)。 - 在
system.part_log表中新增event_time_microseconds列。#20027 (Bharat Nallan)。 - 新增
timezoneOffset(datetime)函数,该函数返回与 UTC 的偏移量(单位为秒)。此更改关闭了 #issue:19850。#19962 (keenwolf)。 - 添加设置
insert_shard_id,用于支持从分布式表向指定分片插入数据。#19961 (flynn)。 - 更新
reinterpretAs函数以支持大整数。修复 #19691。#19858 (Maksim Kita)。 - 在 S3 客户端中添加对服务端加密的客户密钥(Server Side Encryption Customer Keys,
x-amz-server-side-encryption-customer-(key/md5)头)的支持。参见该链接。关闭 #19428。#19748 (Vladimir Chebotarev)。 - 为
executable字典源添加implicit_key选项。如果记录到来的顺序与输入键的顺序相同,则可避免为每条记录输出键。实现 #14527。#19677 (Maksim Kita)。 - 添加配额类型
query_selects和query_inserts。#19603 (JackyWoo)。 - 添加函数
extractTextFromHTML。#19600 (zlx19950903), (alexey-milovidov)。 - 使用
MergeTree*引擎的表现在新增两个用于查询并发控制的表级设置。设置max_concurrent_queries用于限制与该表相关的并发执行查询的数量。设置min_marks_to_honor_max_concurrent_queries指示仅当查询读取的 mark 数量至少达到该值时才应用前一个设置。#19544 (Amos Bird)。 - 新增
file函数,用于从 user_files 目录中以 String 形式读取文件。这与file表函数不同。该功能实现了 #issue:18851。#19204 (keenwolf)。
实验性功能
- 添加实验性的
Replicated数据库引擎。它会在多个主机之间复制 DDL 查询。 #16193 (tavplubix). - 引入对窗口函数的实验性支持,可通过设置
allow_experimental_window_functions = 1启用。该实现目前处于早期的 alpha 质量阶段,尚不适合在生产环境中使用,并且在未来的版本中可能会发生向后不兼容的变更。有关支持的功能列表,请参阅文档。 #20337 (Alexander Kuzmenkov). - 为 DiskS3 添加备份/恢复元数据文件的功能。 #18377 (Pavel Kovalenko).
性能改进
- 为远程查询启用对冲请求。启用
use_hedged_requests(默认关闭)时,允许为一次查询与不同副本建立多个连接。如果现有与副本的连接在hedged_connection_timeout内未成功建立,或者在receive_data_timeout内未收到任何数据,则会启用新的连接。查询会使用第一个发送非空进度包的连接(或在allow_changing_replica_until_first_data_packet开启时,使用第一个发送数据包的连接);其他连接会被取消。支持max_parallel_replicas > 1的查询。#19291(Kruglov Pavel)。这可以在超大规模集群上显著降低尾部延迟。 - 当表定义了行级安全表达式时,现已支持
PREWHERE(并启用相应的优化)。 #19576 (Denis Glazachev). - 设置
distributed_aggregation_memory_efficient默认启用,可降低内存占用并提升分布式查询性能。#20599(alexey-milovidov)。 - 改进对多个定长键执行 GROUP BY 时的性能。 #20472 (alexey-milovidov).
- 通过采用更严格的别名规则提升聚合函数的性能。 #19946 (alexey-milovidov).
- 在极端场景下(读取速度约为 50 GB/秒),通过简化流水线,从而在流水线调度中减少锁竞争,加速从
Memory表中读取数据。#20468(alexey-milovidov)。 - 部分重写 HTTP 服务器,以减少对收发数据的拷贝次数。这在通过 HTTP 插入长记录时最高可带来约 1.5 倍的性能提升。 #19516 (Ivan).
- 为
Memory表新增compress设置。启用后,表将占用更少的 RAM。在某些机器和数据集上,它在执行 SELECT 时也可能更快,但并非总是如此。此更改关闭了 #20093。注意:Memory表可能比 MergeTree 更慢的原因包括:(1) 缺少压缩 (2) 块大小固定 (3) 缺少索引和 PREWHERE……#20168(alexey-milovidov)。 - 聚合代码略有改进。#20978 (alexey-milovidov)。
- 重新添加
intDiv/modulo的特化实现以提升性能。修复了 #21293。该回归问题是在 https://github.com/ClickHouse/ClickHouse/pull/18145 中引入的。#21307(Amos Bird)。 - 在对 Memory 表执行 INSERT SELECT 时不要过度合并数据块。在之前的版本中,执行 INSERT SELECT 后会在 Memory 表中产生低效的数据存储格式。本更改关闭了 #13052。#20169(alexey-milovidov)。
- 修复了至少一处
DataType解析器在某些情况下可能具有指数级复杂度的问题(由模糊测试发现)。从而关闭了 #20096。#20132(alexey-milovidov)。 - 当
do_not_merge_across_partitions_select_final设置为 1,且单个 part 的级别大于 0 时,对带 FINAL 的 SELECT 查询进行并行化处理。#19375 (Kruglov Pavel)。 - 在查询
system.parts和system.parts_columns时仅填充请求的列。关闭问题 #19570。#21035(Anmol Arora)。 - 对
avg聚合函数内部的算术表达式进行代数优化。关闭 #20092。#20183(flynn)。
改进
- 表函数的压缩方法现已支持不区分大小写。同时修复了此前仅检查大写形式的 LZMA 压缩方法。#21416(Vladimir Chebotarev)。
- 新增两个设置,用于在非活动 part 过多时延迟插入或在插入时报错。当服务器无法足够快地清理这些 part 时,这非常有用。 #20178 (Amos Bird)。
- 为 MySQL 客户端提供更好的兼容性:1. MySQL JDBC 2. mycli。 #21367 (Amos Bird)。
- 如果某列被物化视图引用,则禁止删除该列。修复了 #21164。#21303(flynn)。
- MySQL 字典数据源现在会在遇到意外的连接失败(在查询期间与 MySQL 服务器的连接丢失)时进行重试,这种情况有时会在 SSL/TLS 连接中发生。 #21237 (Alexander Kazakov).
- 可用性改进:
DateTime64解析更加一致:现在可以识别以缩放整数形式指定的、带子秒精度的 Unix 时间戳(例如使用1111111111222而不是1111111111.222)。这关闭了 #13194。#21053(alexey-milovidov)。 - 在使用 distributed_group_by_no_merge 时,仅在发起方对已排序的数据块执行合并。 #20882 (Azat Khuzhin).
- 在加载 mysql source 的配置时,ClickHouse 现在会对具有相同优先级的副本列表进行随机打乱,以确保在选择 mysql endpoint 时遵循轮询策略。此更改解决了 #20629。#20632(Alexander Kazakov)。
- 函数 'reinterpretAs(x, Type)' 重命名为 'reinterpret(x, Type)'。#20611 (Maksim Kita)。
- 为 RabbitMQ 引擎增加对 vhost 的支持 #20576。 #20596 (Kseniia Sumarokova)。
- 改进了由 Array 与 Tuple 组合的数据类型的序列化。改进了枚举数据类型到 protobuf 枚举类型的匹配。修复了
Map数据类型的序列化。现在会为被省略的值自动设置默认值。#20506(Vitaly Baranov)。 - 修复了分布式 DDL 任务执行与 DDL 队列清理之间的竞争条件。现在在存在活跃 worker 时,ZooKeeper 中的 DDL 任务不会被移除。修复了 #20016。#20448(tavplubix)。
- 使 FQDN 和其他与 DNS 相关的功能在 Alpine 镜像中能够正常工作。#20336 (filimonov).
- 不允许对被显式禁用的函数进行提前常量折叠。#20303 (Azat Khuzhin).
- 之前,即使整数值无法被 Decimal 类型容纳,从整数到 Decimal 类型的隐式转换也可能会成功。现在会抛出
ARGUMENT_OUT_OF_BOUND。 #20232 (tavplubix). - 无锁
SYSTEM FLUSH DISTRIBUTED。#20215(Azat Khuzhin)。 - 将 count(constant) 和 sum(1) 规范统一为 count()。这是进行投影查询路由所必需的。#20175 (Amos Bird)。
- 在 bitmap 函数中支持所有内置整数类型。 #20171 (Amos Bird)。
- 将
CacheDictionary、ComplexCacheDictionary、SSDCacheDictionary、SSDComplexKeyDictionary更新为改用 LRUHashMap 作为底层索引结构。#20164(Maksim Kita)。 - 现在可以在启动时通过提供
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT来配置access_management设置,默认值为禁用(0),与之前的默认值相同。#20139 (Marquitos)。 - 修复
toDateTime64(toDate()/toDateTime())在DateTime64类型上的行为 —— 实现DateTime64的范围钳制以与DateTime的行为保持一致。 #20131 (Azat Khuzhin). - 配额改进:
SHOW TABLES在配额统计中现在被视为一次查询,而不是两次查询。SYSTEM查询现在会消耗配额。修复在配额消耗中对区间结束时间的计算。#20106 (Vitaly Baranov)。 - 为
system.zookeeper表提供对path IN (set)表达式的支持。#20105 (小路). - 在
system.tables中显示MaterializeMySQL表的完整信息。 #20051 (Stig Bakken)。 - 修复了可执行字典中的数据竞态问题,该问题仅在被误用时才可能出现(例如脚本在返回数据时忽略其输入)。 #20045 (alexey-milovidov).
- 现在可以在 mysql replica 的 config 部分通过参数“opt_reconnect”来控制 MYSQL_OPT_RECONNECT 选项的值。#19998 (Alexander Kazakov)。
- 如果用户调用
JSONExtract函数并指定Float32类型,则允许向结果类型进行不精确的转换。例如,JSON 中的数字0.1是双精度的,在 Float32 中不可精确表示,但用户仍然希望得到这个值。之前的版本在非 Nullable 类型时返回 0,在 Nullable 类型时返回 NULL,用于表明转换是不精确的。该逻辑在语义上是 100% 正确的,但会让用户感到意外并引发疑问。此更改解决了 #13962。#19960(alexey-milovidov)。 - 如果块结构不匹配,则在向 Distributed 表执行 INSERT 时添加块结构转换。 #19947 (Azat Khuzhin).
- 对
system.distributed_ddl_queue表的改进。重启后将 MaxDDLEntryID 初始化为上一次的值。在此 PR 之前,MaxDDLEntryID 会一直保持为 0,直到处理新的 DDLTask。#19924 (Amos Bird)。 - 在
system.parts中显示MaterializeMySQL表。#19770(Stig Bakken)。 - 为
Bufferprofile 添加独立的配置指令。#19721 (Azat Khuzhin). - 将与 JOIN 无关的条件移到 WHERE 子句中。 #18720。 #19685 (hexiaoting)。
- 增加了根据异步发送时待处理字节数对写入 Distributed 的 INSERT 进行限流的功能(为
Distributed引擎新增了bytes_to_delay_insert/max_delay_to_insert和bytes_to_throw_insert设置)。#19673(Azat Khuzhin)。 - 修复了一些在析构函数中可能会忽略写入错误的罕见情况。#19451 (Azat Khuzhin).
- 在致命错误时的堆栈跟踪中打印内联帧。#19317 (Ivan).
Bug 修复
- 修复对 ZooKeeper 的重复重连问题,以及单个 ClickHouse 服务器可能出现两个活动会话的问题。这两个问题均由 #14678 引入。 #21264 (alesapin).
- 修复在向包含
LowCardinality列的表中以Values格式插入数据时出现的错误Bad cast from type ... to DB::ColumnLowCardinality。修复了问题 #21140 #21357(Nikolai Kochetov)。 - 修复在非复制的 MergeTree 表引擎中,当
ALTER DELETE变更操作的谓词中引用该表本身时产生的死锁问题。修复了 #20558。#21477(alesapin)。 - 修复分布式查询在故障情况下出现的 SIGSEGV 问题。#21434 (Azat Khuzhin).
- 现在,
ALTER MODIFY COLUMN查询将会正确地应用对分区键、跳过索引、TTL 等的更改。修复了 #13675。#21334(alesapin)。 - 修复在使用
join_use_nulls与从子查询中联接TOTALS时的错误。此更改关闭了 #19362 和 #21137。#21248(vdimir)。 - 修复在对包含
UNION的查询执行EXPLAIN时发生的崩溃问题。修复了 #20876、#21170。#21246(flynn)。 - 现在只有在支持变更操作的表引擎(MergeTree 系列、Memory、MaterializedView)上才允许执行 mutation。其他引擎将返回更清晰的错误信息。修复了 #21168。#21183(alesapin)。
- 修复了 #21112。修复了一个在执行 INSERT 查询时可能导致数据重复的问题(如果某个回调到达得稍有延迟)。#21138(Kseniia Sumarokova)。
- 修复
input_format_null_as_default在Nullable类型上不生效的问题。修复了 #21116。#21121(Amos Bird)。 - 修复了与将 Tuple 强制转换为 Map 相关的问题。关闭 #21029。#21120 (hexiaoting)。
- 修复在删除使用自定义(非默认)ZooKeeper 集群的 Replicated*MergeTree 表时出现的元数据泄漏问题。#21119 (fastio)。
- 修复在
joinGet中使用LowCardinality键时的类型不匹配问题,从而修复了 #21114。#21117(Amos Bird)。 - 修复:在需要为 Replicated(*)MergeTree 引擎指定其他参数时,
default_replica_path和default_replica_name配置项会失效的问题。#21060 (mxzlxy)。 - 在格式化特意构造的超出范围的
DateTime64类型值时,可能发生内存越界访问。修复了 #20494。修复了 #20543。#21023(alexey-milovidov)。 - 阻止对
storage join的并行写入。#21009 (vdimir). - 修复了在执行
ALTER MODIFY COLUMN时会创建注定失败的 mutation 的问题。 #21007 (Anton Popov). - 关闭了 #9969。修复了 Brotli HTTP 压缩错误,该错误会在数据量较大、结构稍复杂且使用 JSON 输出格式时复现。将 Brotli 更新到最新版本,以包含“修复环形缓冲区中对未初始化数据的罕见访问”的补丁。#20991(Kseniia Sumarokova)。
- 修复在取消查询时出现的 'Empty task was returned from async task queue' 错误。#20881 (Azat Khuzhin).
- 在使用 MySQL 5.7 客户端连接 ClickHouse 服务器时,
USE database;查询无法使用,此问题已修复。修复了 #18926。#20878(tavplubix)。 - 修复在聚合函数中同时使用
-Distinct与-State组合子时的用法问题。#20866 (Anton Popov). - 修复包含
UNION DISTINCT和LIMIT子句的子查询问题。关闭 #20597。#20610(flynn)。 - 修复了在查询中查找不存在的键时字典行为不一致的问题。 #20578 (Nikita Mikhaylov).
- 修正标量子查询和索引子查询所使用的线程数量(在 #19007 之后始终只使用单线程)。修复了 #20457、#20512。#20550(Nikolai Kochetov)。
- 修复从远程查询接收到未知数据包时可能发生的崩溃(该问题是在 #17868 中引入的)。#20547(Azat Khuzhin)。
- 在解析异步 INSERT 的目录名时添加适当的检查(修复 SIGSEGV)。 #20498 (Azat Khuzhin).
- 修复
transform函数在以浮点数为键时不能正常工作的问题。关闭 #20460。#20479(flynn)。 - 修复在将
WITH别名传播到子查询时导致的无限循环问题。修复了 #20388。#20476(Amos Bird)。 - 修复在 HTTP 客户端断开连接时服务器异常退出的问题。 #20464 (Azat Khuzhin).
- 修复在
JOIN子句包含来自SELECT的常量且join_use_nulls=1时出现的LOGICAL_ERROR。 #20461 (Azat Khuzhin). - 检查表达式列表中是否使用了表函数
view,如使用则抛出错误。此更改修复了 #20342。#20350(Amos Bird)。 - 避免在
RANGE_HASHED()字典中出现无效解引用。 #20345 (Azat Khuzhin). - 使用
join_use_nulls=1修复空指针解引用问题。 #20344 (Azat Khuzhin). - 修复了不同 scale 的两个 Decimal 常量之间二元运算结果不正确的问题。修复了 #20283。#20339(Maksim Kita)。
- 修复
ReplicatedMergeTree表引擎家族中失败后台任务重试过于频繁的问题。该问题可能导致日志过于冗长并增加 CPU 负载。修复 #20203。#20335(alesapin)。 - 将
*CollapsingMergeTree和ReplacingMergeTree表引擎的版本列操作限制为仅允许执行DROP或RENAME。 #20300 (alesapin). - 修复了在 JSON 数据损坏时尝试将整个文件读入内存、从而导致内存分配器抛出异常的行为。修复了 #19719。#20286(Nikita Mikhaylov)。
- 修复在对不支持垂直合并的
MergeTree表引擎族执行垂直合并时抛出的异常。修复了 #20259。#20279(alesapin)。 - 修复在关闭阶段重新加载配置时偶发的服务器崩溃。修复了 #19689。#20224(alesapin)。
- 修复在
INSERT SELECT中使用 CTE 时的问题。修复了 #20187 和 #20195。#20211(Amos Bird)。 - 已修复 #19314。详见 #20156(Ivan)。
- 修复 toMinute 函数,使其可以正确处理特殊时区。#20149 (keenwolf)。
- 修复在执行包含
if函数且 then/else 分支结果为Tuple类型(该Tuple类型中必须包含Array或其他复杂类型)的查询时出现的服务器崩溃问题。修复 #18356。#20133(alesapin)。 MongoDB表引擎现在只会在需要读取数据时才建立连接。ATTACH TABLE将不再尝试进行连接。#20110(Vitaly Baranov)。- 修复 StorageJoin 中的错误。 #20079 (vdimir)。
- 修复在对负数以较小除数进行取模运算时,由于结果数据类型不足以容纳负结果而导致的问题。此更改关闭了 #20052。#20067(alexey-milovidov)。
- MaterializeMySQL:修复对更新多个表的语句的复制问题。#20066 (Håvard Kvålen).
- 在初始化脚本执行期间,防止在 Docker 中出现 “Connection refused” 错误。 #20012 (filimonov).
EmbeddedRocksDB是一项实验性存储。修复了类型检查不完善的问题,并简化了代码。由此关闭 #19967。#19972(alexey-milovidov)。- 修复函数
fromModifiedJulianDay在参数类型为Nullable(T)且其底层整数类型为除 Int32 之外的任意类型时出现的段错误(segfault)。#19959 (PHO)。 - 修复 BloomFilter 索引崩溃问题。修复了 #19757。#19884(Maksim Kita)。
- 当启用 system.text_log 时,可能会出现死锁。已修复 #19874。#19875(alexey-milovidov)。
- 修复在存在包含
dictGet()默认表达式的表时服务器启动失败的问题。允许在不加载字典的情况下获取dictGet()的返回类型。#19805 (Vitaly Baranov). - 修复在仅执行
select查询时 clickhouse-client 异常中止的问题。 #19790 (taiyang-li). - 修复了在启动多个 clickhouse-copier 时,将分片移动到目标表可能会失败的问题。#19743 (madianjun).
- 执行
ON CLUSTER查询的后台线程可能会挂起,等待已被删除的复制表执行某些操作。该问题已修复。 #19684 (yiguolei).
构建 / 测试 / 打包改进
- 允许全局启用 AVX2 优化的 ClickHouse 构建。这在现代 CPU 上能带来轻微的性能收益。不推荐用于生产环境,目前也不会作为官方构建提供支持。#20180 (alexey-milovidov).
- 修复了一些由 Coverity 发现的问题。参见 #19964。#20010 (alexey-milovidov).
- 允许在 gdb 下使用已修改的二进制文件启动。在之前的版本中,如果在启动前在 gdb 中设置断点,服务器会因为完整性校验失败而拒绝启动。#21258 (alexey-milovidov).
- 为 Kafka 中不同压缩方法添加测试。#21111 (filimonov).
- 修复了
test_storage_kerberized_hdfs测试中的端口冲突问题。#19974 (Ilya Yatsishin). - 在集成测试中启动 Docker 失败时,将
stdout和stderr打印到日志中。在此 PR 之前,这种情况下只有一条非常简短的错误信息,不利于问题排查。#20631 (Vitaly Baranov).
ClickHouse 发行版 21.2
ClickHouse 发行版 v21.2.2.8-stable,2021-02-07
向后不兼容变更
- 禁止对浮点参数使用按位函数(
bitAnd、bitOr等)。现在必须先将其显式转换为整数类型。 #19853 (Azat Khuzhin). - 禁止对浮点数使用
lcm/gcd。 #19532 (Azat Khuzhin). - 修复
OPTIMIZE TABLE/合并操作的内存跟踪;在执行OPTIMIZE TABLE/合并操作时计入查询内存限制和采样。 #18772 (Azat Khuzhin). - 不允许使用浮点列作为分区键,参见 #18421。 #18464 (hexiaoting).
- 不再支持在类型定义中使用多余的括号,例如:
Array((UInt8))。
新特性
- 新增
PostgreSQL表引擎(支持 select/insert 操作并支持多维数组),并可作为表函数使用。新增PostgreSQL字典源。新增PostgreSQL数据库引擎。#18554 (Kseniia Sumarokova). - 数据类型
Nested现在支持任意层级的嵌套。新引入了复杂类型的子列,例如Array中的size0、Nullable中的null、Tuple元素的名称,这些子列可以在不读取整个列的情况下单独读取。#17310 (Anton Popov). - 为
FlatDictionary、HashedDictionary、ComplexKeyHashedDictionary、DirectDictionary、ComplexKeyDirectDictionary、RangeHashedDictionary添加了对Nullable的支持。#18236(Maksim Kita)。 - 添加了一个名为
system.distributed_ddl_queue的新表,用于显示 DDL worker 队列中的查询。 #17656 (Bharat Nallan)。 - 新增支持将来自 LDAP 用户目录的用户的 LDAP 组名称及通用属性值映射到本地角色。 #17211 (Denis Glazachev).
- 为
cluster表函数新增对 INSERT INTO 的支持,并且对于remote和cluster两个表函数,支持通过指定分片键在各节点间分发数据。关闭 #16752。#18264 (flynn)。 - 添加函数
decodeXMLComponent,用于解码 XML 转义字符。例如:SELECT decodeXMLComponent('Hello,"world"!')#17659。#18542(nauta)。 - 新增函数
parseDateTimeBestEffortUSOrZero、parseDateTimeBestEffortUSOrNull。 #19712 (Maksim Kita). - 新增
sign数学函数。#19527 (flynn)。 - 在 system.query_log 中添加有关查询中使用到的功能(函数、表引擎等)的信息。 #18495。 #19371 (Kseniia Sumarokova)。
- 函数
formatDateTime支持使用%Q修饰符将日期格式化为季度。 #19224 (Jianmei Zhang). - 在 Play UI 中增加对 MetaKey+Enter 快捷键绑定的支持。#19012 (sundyli)。
- 为 map 数据类型新增三个函数:1.
mapContains(map, key)用于检查 map 的键中是否包含第二个参数 key。2.mapKeys(map)以 Array 格式返回所有键。3.mapValues(map)以 Array 格式返回所有值。 #18788 (hexiaoting). - 新增与 #18494 相关的
log_comment设置项。 #18549 (Zijie Lu)。 - 为
argMin和argMax函数添加对元组参数的支持。 #17359 (Ildus Kurbangaliev). - 支持
EXISTS VIEW语法。#18552 (Du Chuan)。 - 添加
SELECT ALL语法,关闭 #18706。#18723 (flynn)。
性能改进
- 通过减少
stat系统调用次数来加快 part 删除。这恢复了之前的一项优化,并提供了更安全的IDisk接口,修复了 #19065。#19086(alexey-milovidov)。 - 在
WITH语句中声明的别名现在可以在索引分析中被正确使用。类似WITH column AS alias SELECT ... WHERE alias = ...的查询现在可以使用索引。#18896(Amos Bird)。 - 新增
optimize_alias_column_prediction(默认开启),它将:- 在分区剪枝和使用二级索引跳过数据时,正确考虑 WHERE 子句中的列别名;- 对于optimize_trivial_count的简单 count 查询,正确考虑 WHERE 子句中的列别名;- 对于optimize_aggregation_in_order/optimize_read_in_order,在 GROUP BY/ORDER BY 中正确考虑列别名。#16995(sundyli)。 - 提升聚合函数
sum的速度。改进仅在合成基准测试中可见,实际意义不大。#19216(alexey-milovidov)。 - 更新 libc++ 并使用另一种 ABI 以提供更好的性能。#18914(Danila Kutenin)。
- 在逻辑等价时,将
sumIf()和sum(if())函数重写为countIf()函数。#17041(flynn)。 - 对 S3 连接使用连接池,由
s3_max_connections设置控制。#13405(Vladimir Chebotarev)。 - 增加对 zstd long 选项的支持,以便对字符串列进行更高效的压缩,从而节省空间。#17184(ygrek)。
- 通过移除每次连接时对配置的访问,略微降低服务器延迟。#19863(alexey-milovidov)。
- 降低
Buffer引擎多层之间的锁竞争。#19379(Azat Khuzhin)。 - 支持将查询计划中的
Filter步骤拆分为Expression + Filter组合。配合Expression + Expression合并优化(#17458),可以将某些表达式的执行延后到Filter步骤之后。#19253(Nikolai Kochetov)。
改进
- 只要还能从
table中选择至少一列,现在就可以执行SELECT count() FROM table。此 PR 修复了 #10639。#18233(Vitaly Baranov)。 - 与远程 MySQL 服务器交互时,将字符集设置为
utf8mb4,以修复 #19795。#19800(alexey-milovidov)。 S3表函数现在支持auto压缩模式(自动检测)。这解决了 #18754。#19793(Vladimir Chebotarev)。- 为
formatReadableTimeDelta函数在处理无穷大参数时正确输出结果。在先前版本中,这些参数会被隐式转换为取决于具体实现的整数值。#19791 (alexey-milovidov)。 - 当无法精确确定区域时,表函数
S3将使用全局区域,从而解决了 #10998。#19750(Vladimir Chebotarev)。 - 在分布式查询中,如果启用了
async_socket_for_remote设置,当表中使用了嵌套层级非常深的数据类型(例如Array(Array(Array(...more...))))时,至少在调试构建配置下有可能导致栈溢出。此更改修复了 #19108。该更改引入了轻微的向后不兼容性:类型定义中的多余括号不再支持,例如:Array((UInt8))。#19736(alexey-milovidov)。 - 为消息代理(RabbitMQ 和 Kafka)添加单独的资源池。#19722 (Azat Khuzhin).
- 修复在非复制 MergeTree 中罕见出现的
max_number_of_merges_with_ttl_in_pool限制被突破的问题(可以分配更多带 TTL 的合并任务)。#19708 (alesapin). - Dictionary:改进了在解析属性时的错误消息。 #19678 (Maksim Kita).
- 新增一个选项,用于在读取时禁用校验和验证。绝不应在生产环境中使用。请不要指望通过禁用它获得任何好处。它仅可用于实验和基准测试。该设置仅适用于 MergeTree 系列表。对于其他表引擎以及通过网络接收数据时,始终会验证校验和。根据我的观察,性能差异要么不存在,要么低于 0.5%。 #19588 (alexey-milovidov)。
- 支持在函数
multiIf中使用常量结果。#19533 (Maksim Kita)。 - 为 Map 数据类型启用 length/empty/notEmpty 函数,其返回 Map 中键的数量。#19530 (taiyang-li)。
- 为
clickhouse-benchmark新增--reconnect选项。指定该选项后,将在每次请求前重新建立连接,用于测试场景。#19872 (alexey-milovidov)。 - 支持新的
.debug文件位置。这修复了问题 #19348。#19520(Amos Bird)。 toIPv6函数解析IPv4地址。 #19518 (Bharat Nallan).- 将
http_referer字段添加到system.query_log、system.processes等。由此解决了 #19389。#19390(alexey-milovidov)。 - 通过将更多函数改为大小写不敏感并添加别名来提升对 MySQL 的兼容性。#19387 (Daniil Kondratyev)。
- 为 MergeTree 部件(Wide/Compact/InMemory)类型添加指标。 #19381 (Azat Khuzhin)。
- 允许使用任意 UID 运行 Docker。 #19374 (filimonov).
- 修复
IPv4数据类型在 Pretty 格式中的数值对齐错误。此前这些数值被右对齐,而不是左对齐。此更改关闭了 #19184。#19339(alexey-milovidov)。 - 允许在无需重启的情况下更改
max_server_memory_usage。已关闭 #18154。#19186 (alexey-milovidov)。 - 在之前的版本中,当使用某些 NaN 参数调用函数
bar时抛出的异常可能稍有误导性。此更改修复了 #19088。#19107(alexey-milovidov)。 - 在 clickhouse-server 镜像中,将 clickhouse 用户及其用户组的 UID/GID 明确设置为固定值 101。#19096 (filimonov)。
- 修复了在插入包含超长字符串的数据时出现的
PeekableReadBuffer: Memory limit exceed错误,解决了 #18690。#18979(tavplubix)。 - Docker 镜像:对 clickhouse-server 入口脚本进行了多项改进。 #18954 (filimonov).
- 添加
normalizeQueryKeepNames和normalizedQueryHashKeepNames,使在规范化查询时不会将较长的名称替换为?。这有助于更好地分析复杂的查询日志。#18910 (Amos Bird)。 - 在发送之前,在发送端对分布式批次的每个数据块执行校验和检查(在读取文件时即可验证校验和,无需对文件进行二次读取),从而避免在接收端发生
INSERT操作卡住(例如当发送端的.bin文件被截断时)。同时,避免在批量INSERT时对.bin文件进行两次读取(此前为在压缩合并时计算行数/字节数所必需,现在这些信息已包含在头部,并保留了向后兼容性)。 #18853 (Azat Khuzhin). - 修复在包含聚合函数状态的表之间执行 RIGHT 和 FULL JOIN 时出现的问题。在之前的版本中会抛出与
cloneResized方法相关的异常。 #18818 (templarzq). - 添加了基于前缀的 S3 端点设置。#18812 (Vladimir Chebotarev)。
- 为 bitmapTransform、bitmapSubsetInRange、bitmapSubsetLimit、bitmapContains 函数新增对 [UInt8, UInt16, UInt32, UInt64] 参数类型的支持。此更改修复了 #18713。#18791(sundyli)。
- 允许对 CTE(Common Table Expressions,公用表表达式)进行进一步的别名定义。当
enable_global_with_statement = 1时,将 CSE(Common Subexpressions Elimination,公共子表达式消除)传播到同一层级的子查询。修复了 #17378。修复了 https://github.com/ClickHouse/ClickHouse/pull/16575#issuecomment-753416235。#18684(Amos Bird)。 - 将 librdkafka 更新到 v1.6.0-RC2。修复 #18668。#18671(filimonov)。
- 在出现意外异常时,自动重启负责执行分布式 DDL 查询的后台线程。修复 #17991。#18285 (徐炘)。
- 更新 AWS C++ SDK,以便在 S3 中使用全局区域。#17870 (Vladimir Chebotarev).
- 在创建
LIVE VIEW表时,新增支持WITH ... [AND] [PERIODIC] REFRESH [interval_in_sec]子句。#14822 (vzakaznikov)。 - 限制对使用旧语法创建的
MergeTree表执行MODIFY TTL查询。此前此类查询虽然会执行成功,但实际上并没有产生任何效果。#19064 (Anton Popov)。
Bug 修复
- 修复对带有常量参数的二元函数的索引分析问题,从而避免产生错误的查询结果。修复了 #18364。#18373(Amos Bird)。
- 修复在启动服务器时,当表包含带有
dictGet()默认表达式的列时出现的问题。允许在不加载字典的情况下获取dictGet()的返回类型。#19805 (Vitaly Baranov). - 修复执行使用
if函数且 then/else 分支结果为Tuple类型的查询时导致的服务器崩溃问题。Tuple类型必须包含Array或其他复杂类型。修复 #18356。#20133(alesapin)。 MaterializeMySQL(实验性功能):修复对多个表进行更新的语句的复制问题。#20066(Håvard Kvålen)。- 在执行初始化脚本期间,防止在 Docker 中出现“Connection refused”错误。#20012 (filimonov).
EmbeddedRocksDB是一种实验性存储引擎。修复了缺少适当类型检查的问题,并简化了代码。此更改关闭了 #19967。#19972(alexey-milovidov)。- 修复函数
fromModifiedJulianDay在参数类型为Nullable(T)(其中 T 为除 Int32 之外的任意整型)时发生的段错误。 #19959 (PHO)。 - 函数
greatCircleAngle在之前的版本中会返回不准确的结果。这修复了 #19769。#19789(alexey-milovidov)。 - 修复一个罕见的问题:在数据损坏后,某些复制操作(如 mutation)无法处理部分数据。修复了 #19593。#19702(alesapin)。
- 执行
ON CLUSTER查询的后台线程可能会在等待已删除的复制表执行某些操作时挂起。该问题已修复。#19684 (yiguolei). - 修复列描述的反序列化错误。该问题会导致无法对包含名为
\的列的表执行 INSERT 操作。#19479 (alexey-milovidov)。 - 在某个文件中出现空数据块时,将分布式批处理标记为损坏状态。#19449 (Azat Khuzhin)。
- 修复了一个极其罕见的问题,它可能会在执行
DROP/DETACH/REPLACE/MOVE PARTITION之后导致 mutation 挂起。该问题在大多数场景下已通过 #15537 得到部分修复。#19443(tavplubix)。 - 修复了可能出现的错误
Extremes transform was already added to pipeline。已修复 #14100。#19430(Nikolai Kochetov)。 - 修复在带有非零默认值(例如某些 Enum)的 JOIN 类型中的默认值处理。关闭 #18197。#19360(vdimir)。
- 在遇到 EOF 时,不要将用于分布式发送的文件标记为损坏。#19290 (Azat Khuzhin).
- 修复
async_socket_for_remote的管道文件描述符泄漏问题。 #19153 (Azat Khuzhin). - 修复以
ORC格式从文件进行无限循环读取的问题(在 #10580 中引入)。修复了 #19095。#19134(Nikolai Kochetov)。 - 修复了 MergeTree 数据写入器中的问题,该问题可能导致标记大小超过固定粒度大小。修复了 #18913。#19123(alesapin)。
- 修复启动 Bug:当 ClickHouse 无法从
LowCardinality(Nullable(...))读取压缩编解码器并抛出异常Attempt to read after EOF时会导致启动失败的问题。修复了 #18340。#19101(alesapin)。 - 简化
tupleHammingDistance的实现。支持任意长度相同的元组。修复 #19029。#19084(Nikolai Kochetov)。 - 确保
groupUniqArray在处理 Enum 类型参数时返回正确的类型。此更改修复了 #17875 中的问题。#19019(alexey-milovidov)。 - 修复在将
LowCardinality参数与函数ignore一起使用时可能出现的Expected single dictionary argument for function错误。修复 #14275。#19016(Nikolai Kochetov)。 - 修复向使用
TinyLog引擎的表中插入LowCardinality列时的问题。修复了 #18629。#19010(Nikolai Kochetov)。 - 修复 JOIN 中的一个小问题:JOIN 试图物化常量列,但我们的代码假定这些列会在其他地方再进行物化。#18982 (Nikita Mikhaylov)。
- 禁用
optimize_move_functions_out_of_any,因为此优化在所有情况下并不总是正确。此更改从而关闭了 #18051。此更改从而关闭了 #18973。#18981(alexey-milovidov)。 - 修复可能由于合并查询计划中的
Expression步骤而引发的异常QueryPipeline stream: different number of columns。修复了 #18190。#18980(Nikolai Kochetov)。 - 修复了在关闭时极少见的死锁问题。#18977 (tavplubix)。
- 修复了在服务器内存耗尽时出现的罕见崩溃问题。 #18976 (tavplubix).
- 修复在执行
ALTER TABLE ... DROP PART 'part_name'查询时会删除整个分区所有去重块的不正确行为。修复 #18874。#18969(alesapin)。 - 修复了问题 #18894:添加了检查,以避免当长列别名('table.column' 样式,通常由 Looker 等 BI 工具自动生成)与长表名相等时抛出异常。#18968 (Daniel Qin)。
- 修复错误
Task was not found in task queue(仅会在远程查询且async_socket_for_remote = 1时出现)。#18964 (Nikolai Kochetov). - 修复了包含某些转义文本的 mutation 语句(例如
ALTER ... UPDATE e = CAST('foo', 'Enum8(\'foo\' = 1'))被错误序列化的问题。修复了 #18878。#18944(alesapin)。 - ATTACH PARTITION 将重置所有 mutation。 #18804。 #18935 (fastio)。
- 修复
bitmapOrCardinality中可能导致 nullptr 解引用的问题。此更改关闭了 #18911。#18912(sundy-li)。 - 修复了在尝试将
NULL从Nullable(String)CAST为Nullable(Decimal(P, S))时出现的Attempt to read after eof错误。现在,当CAST函数无法从可为空字符串解析出十进制数时,会返回NULL。修复了 #7690。#18718(Winter Zhang)。 - 修复 MySQL 引擎中的数据类型转换问题。 #18124 (bo zeng).
- 修复在仅执行
select时 clickhouse-client 异常中止的问题。#19790(taiyang-li)。
构建/测试/打包改进
- 在 CI 中运行 SQLancer(逻辑 SQL fuzzer)。#19006(Ilya Yatsishin)。
- Query Fuzzer 将对新添加的测试进行更深入的模糊测试。这解决了 #18916。#19185(alexey-milovidov)。
- 集成 Big List of Naughty Strings,以提升模糊测试效果。#19480(alexey-milovidov)。
- 增加使用 MSan 运行的集成测试。#18974(alesapin)。
- 修复了 cyrus-sasl 和 musl 中的 MemorySanitizer 错误。#19821(Ilya Yatsishin)。
- 在
positionCaseInsensitiveUTF8函数中,对参数不足的检查会触发 address sanitizer 报错。#19720(alexey-milovidov)。 - 在集成测试中移除 docker-compose 的 --project-directory 参数。修复来自 docker 容器的日志格式。#19706(Ilya Yatsishin)。
- 简化了为集成测试生成 macros.xml 的过程。不再有来自 dicttoxml 的过度日志输出。dicttoxml 项目已超过 5 年未维护。#19697(Ilya Yatsishin)。
- 允许通过环境变量
CLICKHOUSE_WATCHDOG_ENABLE显式启用或禁用 watchdog。默认情况下,如果服务器未连接到终端,则默认启用。#19522(alexey-milovidov)。 - 允许在 arm64 上构建带有 Kafka 支持的 ClickHouse。#19369(filimonov)。
- 允许在构建 librdkafka 时不带 SSL 支持。#19337(filimonov)。
- 恢复 FreeBSD 构建中的 Kafka 输入。#18924(Alexandre Snarskii)。
- 修复了表函数
VALUES中潜在的空指针解引用问题。#19357(alexey-milovidov)。 - 避免在
arrayElement函数、substring和arraySum中产生 UBSan 报告。修复了 #19305。修复了 #19287。这解决了 #19336。#19347(alexey-milovidov)。
ClickHouse 发行版 21.1
ClickHouse 发行版 v21.1.3.32-stable,2021-02-03
Bug 修复
- 修复 BloomFilter 索引导致的崩溃。修复 #19757。#19884(Maksim Kita)。
- 修复了在将谓词下推到
UNION DISTINCT子查询时发生的崩溃问题。修复了 #19855。#19861(Amos Bird)。 - 修复按 UInt8 类型中大于 127 的值进行过滤的问题。#19799 (Anton Popov).
- 在之前的版本中,向函数 arrayEnumerateUniq 传入异常的参数可能会导致崩溃或陷入无限循环。此更改修复了 #19787。#19788(alexey-milovidov)。
- 修复在对算术类型与字符串类型进行精确比较时出现的栈溢出问题。#19773 (tavplubix).
- 修复在
WHERE或PREWHERE中使用嵌套列名时导致的崩溃。对应修复 #19755。#19763(Nikolai Kochetov)。 - 修复
bitmapAndnot函数中的段错误。解决了 #19668。#19713(Maksim Kita)。 - 某些使用大整数的函数可能会导致段错误。大整数功能仍处于实验阶段。本次更改关闭了 #19667。#19672(alexey-milovidov)。
- 修复函数
neighbor在处理LowCardinality参数时返回错误结果的问题。修复了 #10333。#19617(Nikolai Kochetov)。 - 修复在断开连接后 Connection 中 CompressedWriteBuffer 的 use-after-free 问题。#19599 (Azat Khuzhin).
DROP/DETACH TABLE table ON CLUSTER cluster SYNC查询可能会卡住,已修复。修复了 #19568。#19572 (tavplubix)。- 修复 CREATE DICTIONARY 查询中的 id 表达式。 #19571 (Maksim Kita).
- 修复在 merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read = 0/UINT64_MAX 时出现的 SIGSEGV。 #19528 (Azat Khuzhin).
- 如果以特定构造的参数调用
addMonth函数,则在读取内存时可能发生缓冲区溢出。本次修复了 #19441。同时修复了 #19413。#19472(alexey-milovidov)。 - 如果将空字符串作为 IV 传入,加解密函数中可能会发生未初始化内存读取。此修复关闭了 #19391。#19397(alexey-milovidov)。
- 修复 Uber H3 库中可能出现的缓冲区溢出问题。详见 https://github.com/uber/h3/issues/392。此更改关闭了 #19219。#19383(alexey-milovidov)。
- 修复 system.parts 表中的 _state 列(此前由于顺序不正确,查询该列时会触发 LOGICAL_ERROR)。 #19346 (Azat Khuzhin)。
- 修复了在物化视图与其目标表结构不同时进行聚合时可能出现的错误结果或段错误。修复了 #18063。#19322(tavplubix)。
- 修复错误
Cannot convert column now64() because it is constant but values of constants are different in source and result。作为对 #7156 的延续。#19316(Nikolai Kochetov)。 - 修复在处理 ReplicatedMergeTree 表时,并发执行
ALTER和DROP查询可能导致挂起的问题。#19237 (alesapin). - 修复了通过 HTTP 接口使用
Template或CustomSeparated格式插入数据时出现的There is no checkpoint错误。对应修复:#19021。 #19072 (tavplubix)。 - 在分析阶段,如果无法计算子查询的结果,则禁用对子查询的常量折叠。 #18446 (Azat Khuzhin).
- 在执行
MOVE或REPLACE PARTITION操作后,或者在少数情况下执行DETACH或DROP PARTITION后,Mutation 可能会因为等待某个不存在的 part 而挂起。该问题已修复。 #15537 (tavplubix)。
ClickHouse 发行版 v21.1.2.15-stable 2021-01-18
向后不兼容变更
- 设置
input_format_null_as_default现在默认启用。#17525 (alexey-milovidov). - 对来自配置文件的 profile 设置检查约束条件。如果
users.xml中包含不满足相应约束的设置,服务端将无法启动。#18486 (tavplubix). - 限制通过
ALTER MODIFY SETTING修改影响数据 part 的存储设置(write_final_mark和enable_mixed_granularity_parts)。#18306 (Amos Bird). - 将
insert_quorum_parallel默认设置为 1。与“顺序”仲裁写入相比,它要方便得多。但如果你依赖顺序一致性,则应将该设置改回 0。#17567 (alexey-milovidov). - 移除
sumburConsistentHash函数。关闭了 #18120。#18656 (alexey-milovidov). - 移除了聚合函数
timeSeriesGroupSum、timeSeriesGroupRateSum,因为我的一位朋友说它们从来没有正常工作过。这修复了 #16869。如果你曾经成功使用过这些函数,请发送邮件至 [email protected]。#17423 (alexey-milovidov). - 禁止
toUnixTimestamp(Date())(之前它只返回Date的UInt16表示)。#17376 (Azat Khuzhin). - 允许在
avg和avgWeighted函数中使用扩展整数类型(Int128、Int256、UInt256)。同时允许在avgWeighted函数中为值和权重使用不同类型(整数、十进制、小数点浮动类型)。这是一个向后不兼容的变更:现在avg和avgWeighted函数始终返回Float64(如文档所述)。在此变更之前,对Decimal参数的返回类型也是Decimal。#15419 (Mike). - 表达式
toUUID(N)不再可用。请替换为toUUID('00000000-0000-0000-0000-000000000000')。进行此变更的原因是在N非零时,toUUID(N)的结果并不直观。 - 具有不正确“密钥用法(key usage)”的 SSL 证书将被拒绝。在之前的版本中,这些证书仍然可以使用。参见 #19262。
- 从默认配置中移除了对替换文件(
/etc/metrika.xml)的incl引用(<remote_servers>、<zookeeper>、<macros>、<compression>、<networks>)。如果你使用了替换文件并依赖这些隐式引用,则在升级前应通过添加带有incl="..."属性的相应部分,将它们手动、显式地加回去。参见 #18740 (alexey-milovidov)。
新特性
- 在 ClickHouse 中实现 gRPC 协议。#15111(Vitaly Baranov)。
- 允许使用多个 ZooKeeper 集群。 #17070 (fastio).
- 实现了
REPLACE TABLE和CREATE OR REPLACE TABLE语句。#18521 (tavplubix)。 - 实现对
UNION DISTINCT的支持,并默认将普通的UNION子句视为UNION DISTINCT。新增设置union_default_mode,可将其视为UNION ALL,或要求显式指定模式。 #16338 (flynn)。 - 添加了函数
accurateCastOrNull。解决了 #10290。在x IN (subquery)表达式中添加了类型转换。解决了 #10266。#16724(Maksim Kita)。 - IP Dictionary 直接支持
IPv4/IPv6类型。#17571 (vdimir)。 - IP Dictionary 现已支持按键查询。解决了 #18241。#18480(vdimir)。
- 为数据导入和导出增加
*.zst压缩/解压缩支持。这样可以在file()函数中使用*.zst,并在 HTTP 客户端中使用Content-Encoding: zstd。此更新关闭了 #16791 。#17144 (Abi Palagashvili)。 - 新增了
mannWitneyUTest、studentTTest和welchTTest聚合函数。对rankCorr进行了部分重构。#16883(Nikita Mikhaylov)。 - 新增函数
countMatches/countMatchesCaseInsensitive。 #17459 (Azat Khuzhin). - 实现
countSubstrings()/countSubstringsCaseInsensitive()/countSubstringsCaseInsensitiveUTF8()(用于统计子串出现次数)。 #17347 (Azat Khuzhin). - 在 system.query_log 中添加有关使用到的数据库、表和列的信息。新增
query_kind和normalized_query_hash字段。#17726 (Amos Bird)。 - 添加了设置
optimize_on_insert。启用后,会对 INSERT 插入的数据块执行与对该数据块进行合并时(例如 Replacing、Collapsing、Aggregating 等)相同的转换。该设置默认启用。此设置可能会影响物化视图和 MaterializeMySQL 的行为(参见详细说明)。修复了 #10683。#16954(Kruglov Pavel)。 - 针对 HDFS 的 Kerberos 身份验证。 #16621 (Ilya Golshtein).
- 支持
SHOW SETTINGS语句来显示system.settings中的参数,同时也支持SHOW CHANGED SETTINGS以及LIKE/ILIKE子句。#18056 (Jianmei Zhang)。 - 函数
position现在支持POSITION(needle IN haystack)语法,以提升 SQL 兼容性。此更改解决了 #18701。... #18779(Jianmei Zhang)。 - 现在,我们为 MergeTree 系列的表新增了一个存储设置项
max_partitions_to_read,用于限制单个查询中可访问的最大分区数量。同时还添加了一个用户设置force_max_partition_limit,用于强制执行该限制。#18712(Amos Bird)。 - 为已插入的 part 在
system.part_log中添加query_id列。解决 #10097。#18644(flynn)。 - 允许在
CREATE TABLE AS SELECT语句中显式指定列。示例:CREATE TABLE t1 (x String) ENGINE = Memory AS SELECT 1;。#18060(Maksim Kita)。 - 新增了
arrayMin、arrayMax、arrayAvg聚合函数。#18032 (Maksim Kita). - 实现了
ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...查询。该查询会使用提供的表结构创建一个新表,并从user_files中指定的目录中附加表数据。#17903 (tavplubix)。 - 为 StorageMemory 添加对 mutation 的支持。关闭了 #9117。#15127(flynn)。
- 新增对语法
EXISTS DATABASE name的支持。#18458(Du Chuan)。 - 与 MySQL 类似,支持内置函数
isIPv4String和isIPv6String。#18349(Du Chuan)。 - 添加新设置
insert_distributed_one_random_shard = 1,以便在没有分布键的情况下向多分片的分布式表插入数据。#18294 (Amos Bird)。 - 将
min_compress_block_size和max_compress_block_size设置项添加到 MergeTreeSettings,这些设置项的优先级高于全局设置,并在配置后生效。关闭 13890。#17867 (flynn)。 - 新增对 64 位 Roaring 位图的支持。#17858 (Andy Yang).
- 扩展了
OPTIMIZE ... DEDUPLICATE语法,以允许显式指定(或使用星号/列转换函数隐式指定)用于检查重复数据的列列表。... #17846 (Vasily Nemkov). - 新增了函数
toModifiedJulianDay、fromModifiedJulianDay、toModifiedJulianDayOrNull和fromModifiedJulianDayOrNull。这些函数在前推公历日期与修正儒略日数之间进行转换。 #17750 (PHO)。 - 支持使用自定义 TLD 列表:新增函数
firstSignificantSubdomainCustom、cutToFirstSignificantSubdomainCustom。 #17748 (Azat Khuzhin). - 为原生 TCP 接口新增对
PROXYv1协议的支持。允许将配额键设为代理转发的 IP 地址(同时适用于PROXYv1提供的地址以及来自 HTTP 接口的X-Forwarded-For头)。当你仅通过可信代理(例如 Cloudflare)对外提供 ClickHouse 访问,但又希望按照用户的原始 IP 地址来统计其资源使用时,这将非常有用。修复了 #17268。#17707(alexey-milovidov)。 - 现在,clickhouse-client 支持打开
EDITOR来编辑命令。按Alt-Shift-E。#17665(Amos Bird)。 - 添加函数
encodeXMLComponent,用于对字符进行转义,以便将字符串放入 XML 文本节点或属性中。#17659 (nauta)。 - 引入
DETACH TABLE/VIEW ... PERMANENTLY语法,使得在重启后该表不会自动重新附加(只能通过显式请求)。该表仍然可以使用简写语法 ATTACH TABLE 重新附加。实现了 #5555。修复了 #13850。#17642(filimonov)。 - 在 MergeTree 表中添加总行数、总字节数和分片数量的异步指标。这修复了问题 #11714。#17639(flynn)。
- 为 SQL 之外的分页添加
limit和offset设置:#16176 它们对于构建 API 很有用。对于 SELECT 查询,这两个设置的效果等同于在外面再包一层:select * from (your_original_select_query) t limit xxx offset xxx;。#17633(hexiaoting)。 - 提供一个新的聚合组合子:
-SimpleState,用于在查询中构建SimpleAggregateFunction类型。它对于定义 AggregatingMergeTree 引擎的物化视图很有用,同时也将使投影受益。#16853 (Amos Bird)。 - 为
clickhouse-client和clickhouse-local新增了queries-file参数。#15930 (Maksim Kita)。 - 为
clickhouse-benchmark添加了query参数。#17832 (Maksim Kita)。 EXPLAIN AST现在支持SELECT以外的查询。#18136 (taiyang-li).
实验特性
- 增加了用于计算文本 n-gram 和 shingles 的 minHash 与 simHash 的函数,用于半重复数据查找。同时新增函数
bitHammingDistance和tupleHammingDistance。#7649 (flynn). - 新增数据类型
Map。参见 #1841。Map 的首个版本仅支持键和值为String类型。#15806 (hexiaoting). - 实现了一个基于 ANTLR4 runtime 并由 EBNF 语法生成的替代 SQL 解析器。#11298 (Ivan).
性能改进
- 新的 IP Dictionary 实现,具有更低的内存占用、在部分场景下更佳的性能,并修复了一些缺陷。#16804 (vdimir)。
- 数据导出的并行格式化功能。#11617 (Nikita Mikhaylov)。
- LDAP 集成:在 LDAP 服务器连接配置中新增
verification_cooldown参数,用于在可配置的时间段内缓存成功的 “bind” 尝试。#15988 (Denis Glazachev). - 为
clickhouse-local添加--no-system-table选项,以在不加载系统表的情况下运行。这样可以避免在启动时初始化DateLUT,该过程可能会耗费可观的时间(数十毫秒)。#18899 (alexey-milovidov)。 - 在
AggregateFunctionWindowFunnelData中将PODArray替换为PODArrayWithStackMemory,以提高windowFunnel函数的性能。 #18817 (flynn). - 在对 Distributed 表执行同步 INSERT 时,不再向分片发送空数据块。由此关闭了 #14571。#18775(alexey-milovidov)。
- 针对 StorageMemory 进行了读取优化。#18052 (Maksim Kita)。
- 使用 Dragonbox 算法替代 ryu 来将浮点数转换为字符串。这大幅提升了浮点数到字符串转换的性能。#17831 (Maksim Kita)。
- 加速
IPv6CIDRToRange的实现。 #17569 (vdimir). - 添加
remerge_sort_lowered_memory_bytes_ratio设置项(如果重新归并后的内存使用量未按该比例得到降低,则会禁用重新归并)。#17539 (Azat Khuzhin). - 改进了在主键中使用 SimpleAggregateFunction(String) 时 AggregatingMergeTree 的性能。#17109 (Azat Khuzhin)。
- 现在
-If组合器已被去虚拟化,count也已正确向量化。此更改对应于 这个 PR。#17043(Amos Bird)。 - 修复在存在大量
MergeTree表时,从Merge表读取的性能问题。修复了 #7748。#16988(Anton Popov)。 - 提升了函数
repeat的性能。 #16937 (satanson). - 略微提升浮点数解析性能。 #16809 (Maksim Kita).
- 为
OPTIMIZE TABLE ... FINAL添加跳过已合并分区的功能。 #15939 (Kruglov Pavel). - 集成 Daniel Lemire 的 fast_float 以解析浮点数。#16787(Maksim Kita)。目前尚未启用,因为其性能仍然低于 ClickHouse 中现有的粗略浮点数解析器。
- 修复 max_distributed_connections(影响
prefer_localhost_replica = 1和max_threads != max_distributed_connections)。 #17848 (Azat Khuzhin). - 在向 S3 发送数据时自适应选择单分片或多分片上传方式。单分片上传由新的设置
max_single_part_upload_size控制。#17934(Pavel Kovalenko)。 - 在
PipelineExecutor中增加对异步任务的支持。为远程查询引入初步的异步套接字支持。#17868 (Nikolai Kochetov). - 允许在列大小未知的情况下,在 compact 部件上使用
optimize_move_to_prewhere优化。#17330 (Anton Popov).
改进
- 避免在使用
TinyLog或Log表引擎的表上执行INSERT SELECT向自身写入时发生死锁。修复了 #6802。修复了 #18691。修复了 #16812。修复了 #14570。#15260(alexey-milovidov)。 - 支持类似 MySQL 的
SHOW CREATE VIEW name语法。#18095 (Du Chuan)。 - 允许所有
Decimal * Float或反向形式的查询,包括聚合查询(例如SELECT sum(decimal_field * 1.1)或SELECT dec_col * float_col),结果类型为 Float32 或 Float64。#18145(Mike)。 - 改进精简版 Web UI:添加历史记录;添加分享功能;避免不同请求之间的竞态条件;添加请求进行中和就绪状态指示器;添加 favicon;在 textarea 未获得焦点时也能检测 Ctrl+Enter。 #17293 #17770 (alexey-milovidov).
- clickhouse-server 没有向 ZooKeeper 服务器发送
close请求。 #16837 (alesapin). - 避免在内存限制过低(
max_memory_usage = 1/max_untracked_memory = 1)的情况下导致服务器异常终止。#17453 (Azat Khuzhin)。 - 修复在不同事件具有相同时间戳时
windowFunnel函数结果的不确定性问题。#18884 (Fuwang Hu)。 - Docker:在 clickhouse-server Docker 镜像中,将 clickhouse 用户和用户组的 uid/gid 显式设置为固定值 101。#19096 (filimonov)。
- 对
Distributed表的异步 INSERT:新增了两个设置(类似于 MergeTree 系列):-fsync_after_insert- 对每次插入执行 fsync,这会降低插入性能。-fsync_directories- 在所有操作(写入、重命名等)完成后,对临时目录(仅用于异步 INSERT)执行 fsync。#18864(Azat Khuzhin)。 SYSTEM KILL命令现在可以在 Docker 中正常工作。已关闭 #18847。#18848(alexey-milovidov)。- 在执行
FETCH PARTITION时展开 ZooKeeper 路径中的宏。#18839 (fastio)。 - 对所有副本应用
ALTER TABLE <replicated_table> ON CLUSTER MODIFY SETTING ...,因为这类 ALTER 命令不会在副本之间复制。#18789 (Amos Bird)。 - 允许列转换器
EXCEPT接受字符串作为正则表达式匹配器。这解决了 #18685。#18699(Amos Bird)。 - 修复
SummingMergeTree中的SimpleAggregateFunction。现在它的行为与AggregateFunction一致。在之前的版本中,值会被直接相加,而不考虑具体的聚合函数。本次修复对应 #18564、#8052、#18637(Amos Bird)。再次修复在SummingMergeTree中使用SimpleAggregateFunction的相关问题。本次修复对应 #18676、#18677(Amos Bird)。 - 修复了在函数 bar 的最后一个参数为 NaN 时,分配器内部触发的断言错误。现在会抛出一个普通的 ClickHouse 异常。修复了 #17876。#18520(Nikita Mikhaylov)。
- 修复易用性问题:在某些工具中,异常消息后缺少换行符。 #18444 (alexey-milovidov).
- 新增支持:可以在
LowCardinality(Type)与Type之间相互转换主键和分区键列的类型。同时新增支持:可以将主键列类型从EnumX转换为IntX类型。修复 #5604。#18362(alesapin)。 - 实现对
untuple的字段访问。 #18133。 #18309 (hexiaoting)。 - 允许从 CSV 中解析
Array字段,如果它是以字符串形式表示,并且该字符串中包含按嵌套 CSV 方式序列化的数组。例如:"[""Hello"", ""world"", ""42"""" TV""]"将被解析为['Hello', 'world', '42" TV']。允许从 CSV 中以不带外层括号的字符串形式解析数组。例如:"'Hello', 'world', '42"" TV'"将被解析为['Hello', 'world', '42" TV']。#18271 (alexey-milovidov). - 改进 MergeTree wide parts 的自适应粒度计算。#18223 (alesapin).
- 现在
clickhouse install也可以在 Mac 上运行了。此前的问题是该平台上没有 procfs。#18201(Nikita Mikhaylov)。 - 改进了
SHOW ...查询语法的提示。#18183 (Du Chuan). - 数组聚合函数
arrayMin、arrayMax、arraySum、arrayAvg新增对Int128、Int256、UInt256的支持。#18147 (Maksim Kita)。 - 在 Set 和 Join 存储设置中添加
disk。#18112(Grigory Pervakov)。 - 访问控制:现在表函数
merge()要求当前用户对其读取数据的每个表都具有SELECT权限。此 PR 修复了 #16964。#18104 #17983(Vitaly Baranov)。 - 临时表在系统表
system.tables和system.columns中现在只在创建它们的会话中可见。内部数据库_temporary_and_external_tables现在在这些系统表中被隐藏;临时表则显示为数据库名为空且已设置is_temporary标志的表。#18014(Vitaly Baranov)。 - 修复在终端窗口大小发生变化时
clickhouse-client的渲染问题。#18009 (Amos Bird)。 - 当客户端断开连接时,将相关事件的日志级别从 Warning 降低为 Information。 #18005 (filimonov)。
- 强制从文件系统中移除 DiskS3 的空或异常元数据文件。S3 为实验性功能。#17935(Pavel Kovalenko)。
- 访问控制:
allow_introspection_functions=0会禁止使用自省函数,但不再禁止为这些函数授予权限(被授权用户需要将allow_introspection_functions设置为1才能自己使用这些权限)。类似地,allow_ddl=0会禁止使用 DDL 命令,但不再禁止为这些命令授予权限。#17908(Vitaly Baranov)。 - 可用性改进:列名提示。#17112。#17857(fastio)。
- 当两个 Merge 表尝试相互读取对方的数据时,增加诊断信息。 #17854 (徐炘).
- 支持在使用 ClickHouse Docker 镜像运行脚本时覆盖超时时间值。 #17818 (Guillaume Tassery).
- 检查 system 日志表的引擎定义语法,以避免某些配置错误。需要注意的是,这种检查不涉及语义层面,这意味着诸如不存在的列或表达式函数之类的错误,只有在表真正创建时才会被发现。#17739 (Du Chuan)。
- 在初始化
RabbitMQ表时,如果没有连接,将不再抛出异常(会在后台自动重新连接)。 #17709 (Kseniia Sumarokova). - 在 Buffer 刷新时不要忽略服务器内存限制。#17646 (Azat Khuzhin).
- 切换到来自 ClickHouse-Extras 的已打补丁 RocksDB 版本,以修复 use-after-free 错误。#17643(Nikita Mikhaylov)。
- 为并行解析的异常消息添加了偏移量。这修复了 #17457。#17641(Nikita Mikhaylov)。
- 不要在 INSERT 查询执行过程中抛出“Too many parts”错误。#17566 (alexey-milovidov).
- 允许在
ALTER查询的UPDATE语句中使用查询参数。修复 #10976。#17563(alexey-milovidov)。 - 查询混淆器:避免在标识符名称中使用某些 SQL 关键字。#17526 (alexey-milovidov)。
- 通过服务器指标导出当前由 DDLWorker 执行的最大 DDL 条目,可用于检查 DDLWorker 是否在某处卡住。 #17464 (Amos Bird)。
- 导出所有服务器上当前线程的异步指标。这对于排查类似此问题的故障非常有用。#17463(Amos Bird)。
- 当将
asterisk_include_materialized_columns和asterisk_include_alias_columns设置为开启时,在通配符查询中包含诸如 MATERIALIZED / ALIAS 等动态列。#17462 (Ken Chen)。 - 允许在
config.xml中使用<ttl>属性为系统日志表配置 TTL,以删除旧条目。#17438(Du Chuan)。 - 现在,通过 MySQL 和 PostgreSQL 协议到达服务器的查询具有各自不同的接口类型(可在表
system.query_log的interface列中查看):MySQL 为4,PostgreSQL 为5,不再使用之前统一的1,而1现仅用于原生协议。#17437(Vitaly Baranov)。 - 修复
INSERT ... SELECT ... SETTINGS查询中 SETTINGS 子句的解析。#17414 (Azat Khuzhin). - 在 RadixSort 中正确统计内存占用。 #17412 (Nikita Mikhaylov).
- 在服务端的
receiveHello中添加 EOF 检查,以避免出现Attempt to read after eof异常。#17365 (Kruglov Pavel). - 避免在 bigint 转换过程中可能发生的栈溢出。大整数目前为实验性特性。#17269 (flynn)。
- 现在
set索引可以与GLOBAL IN搭配使用。这修复了 #17232 和 #5576。#17253(Amos Bird)。 - 为发往 S3 存储的请求添加 HTTP 重定向次数限制(
s3_max_redirects)。#17220(ianton-ru)。 - 当
-OrNull组合器与-If、-Merge、-MergeState、-State组合器一起使用时,应将-OrNull放在最前面。#16935 (flynn)。 - 支持配置 HTTP 代理和 HTTPS S3 端点。 #16861 (Pavel Kovalenko).
- 为 S3 客户端添加了对通过环境变量、
~/.aws和AssumeRole进行身份验证的正确支持。#16856(Vladimir Chebotarev)。 - 新增更多 OpenTelemetry span,并添加一个将 span 数据导出到 Zipkin 的示例。 #16535 (Alexander Kuzmenkov).
- 缓存字典:在获取缓存字典时彻底消除回调和加锁。在查询过程中,键不再被划分为「未找到」和「已过期」,而是统一存储在同一个 map 中。#14958 (Nikita Mikhaylov)。
- 修复实验性特性
fsync_part_directory/fsync_after_insert/in_memory_parts_insert_sync一直未生效的问题。 #18845 (Azat Khuzhin). - 允许在
MaterializeMySQL引擎的嵌套数据库中使用Atomic引擎。#14849 (tavplubix)。
缺陷修复
- 修复在极少数情况下服务器可能会停止接受新连接的问题。 #17542 (Amos Bird, alexey-milovidov).
- 修复在分析带有常量参数的二元函数索引时出现的问题,该问题会导致错误的查询结果。此修复解决了 #18364。#18373(Amos Bird)。
- 修复在索引比较两端类型不一致时可能出现的错误索引分析。此修复解决了 #17122。#17145(Amos Bird)。
- 在合并时禁用基于 AIO 的写入,因为这在极其罕见的情况下可能导致主键列数据损坏。#18481 (alesapin)。
- 限制从宽格式 part 合并到紧凑格式 part。在垂直合并的情况下,这可能会生成损坏的结果 part。#18381 (Anton Popov).
- 修复在发生读退避(日志中出现消息
<Debug> MergeTreeReadPool: Will lower number of threads)时,从MergeTree*读取可能导致查询结果不完整的问题。该问题是在 #16423 中引入的。本修复解决了 #18137。#18216(Nikolai Kochetov)。 - 修复
rocksdb库中的 use-after-free Bug。 #18862 (sundyli). - 修复以
ORC格式从文件进行无限循环读取的问题(该问题是在 #10580 中引入的)。修复了 #19095。#19134(Nikolai Kochetov)。 - 修复 MergeTree 数据写入器中的一个 bug,该 bug 可能导致标记大小超过固定粒度大小。修复了 #18913。#19123(alesapin)。
- 修复了一个启动时的错误:ClickHouse 无法从
LowCardinality(Nullable(...))中读取压缩编解码器并抛出异常Attempt to read after EOF。修复了 #18340。#19101(alesapin)。 - 限制对使用旧语法创建的
MergeTree表执行MODIFY TTL查询。此前这些查询会返回成功,但实际上不会产生任何效果。#19064(Anton Popov)。 - 确保
groupUniqArray在处理 Enum 类型参数时返回正确的类型。此更改关闭了 #17875。#19019(alexey-milovidov)。 - 修复在将
LowCardinality类型的参数传递给ignore函数时,可能出现的Expected single dictionary argument for function错误。修复了 #14275。#19016(Nikolai Kochetov)。 - 修复了在使用
TinyLog引擎的表中插入LowCardinality列时的问题。修复了 #18629。#19010(Nikolai Kochetov)。 - Join 会尝试将 const 列物化,但我们的代码希望它们出现在其他位置。#18982 (Nikita Mikhaylov).
- 禁用
optimize_move_functions_out_of_any,因为此优化并不总是正确的。此更改关闭了 #18051。此更改关闭了 #18973。#18981(alexey-milovidov)。 - 修复在合并查询计划中的
Expression步骤时可能引发的异常QueryPipeline stream: different number of columns。修复了 #18190。#18980(Nikolai Kochetov)。 - 修复了在关闭过程中极少出现的死锁。#18977 (tavplubix)。
- 修复了在执行
ALTER TABLE ... DROP PART 'part_name'查询时错误地移除整个分区所有去重块的问题。修复了 #18874。#18969(alesapin)。 - Attach partition 现在会重置 mutation。 #18804。 #18935 (fastio)。
- 修复
bitmapOrCardinality中可能导致空指针解引用的问题,从而关闭了 #18911。#18912(sundyli)。 - 修复
clickhouse-local在关闭期间可能发生的卡死问题。此更改修复了 #18891。#18893(alexey-milovidov)。 - 对于外部数据库(MySQL、ODBC、JDBC)的查询,如果存在
x IN table形式的表达式,会被错误重写。该修复修正了 #9756。#18876(alexey-milovidov)。 - 修复 *If 组合器在一元函数和 Nullable 类型下的行为问题。#18806 (Azat Khuzhin).
- 修复这样一个问题:当全局将
network_compression_method设置为非默认值时,异步分布式 INSERT 可能会被服务器拒绝。这修复了问题 #18741。#18776(alexey-milovidov)。 - 修复了在尝试将
NULL从Nullable(String)CAST为Nullable(Decimal(P, S))时出现的Attempt to read after eof错误。现在当函数CAST无法从可空字符串解析出 Decimal 值时,会返回NULL。修复了 #7690。#18718(Winter Zhang)。 - 修复了一个较小的日志问题。#18717 (sundyli).
- 修复使用旧语法创建的
ReplicatedMergeTree表中删除空数据部分的行为。修复了 #18582。#18614(Anton Popov)。 - 修复此前在不同情况下发生的日期溢出 Bug。严格将 Date 的取值上限限制为 "2106-02-07",并将大于 "2106-02-07" 的日期转换为值 0。#18565 (hexiaoting)。
- 为从 MySQL 复制添加对 FixedString 数据类型的支持。从 MySQL 复制是一个实验性功能。该补丁修复了 #18450,同时也修复了 #6556。#18553(awesomeleo)。
- 修复在对包含
RIGHT或FULL连接的子查询结果使用ORDER BY时可能出现的Pipeline stuck错误。#18550 (Nikolai Kochetov)。 - 修复一个缺陷:在终止对应的 mutation 后,可能会导致
ALTER查询挂起。由线程模糊测试工具发现。#18518 (alesapin)。 - 在
parseDateTimeBestEffort函数中对 12AM(凌晨 12 点)提供了正确的解析支持。修复了 #18402。#18449(vladimir-golovchenko)。 - 修复了在对类型为
Nullable(String)的参数调用toType(...)函数(如toDate、toUInt32等)时出现的value is too short错误。现在此类函数在解析出错时会返回NULL,而不再抛出异常。修复了 #7673。#18445(tavplubix)。 - 修复
SHOW TABLES的意外行为。#18431 (fastio)。 - 修复 -SimpleState 组合器生成的参数和返回类型不兼容的问题。 #18404 (Amos Bird).
- 修复在并发使用
Set或Join表以及从system.tables中进行查询时可能出现的竞态条件。#18385 (alexey-milovidov)。 - 修复
system.settings_profile_elements表的填充。此 PR 解决了 #18231。#18379(Vitaly Baranov)。 - 修复在使用两级聚合时,带有
Distinct组合器的聚合函数中可能发生的崩溃。修复了 #17682。#18365(Anton Popov)。 - 修复了在具有 IPv4/IPv6 双栈的机器上,服务器无法访问
clickhouse-odbc-bridge进程的问题;修复了使用格式错误的查询执行 ODBC 字典更新时和/或导致 odbc-bridge 进程崩溃的问题;可能关闭了 #14489。#18278(Denis Glazachev)。 - 访问控制:如果用户至少拥有对表中任意一列的访问权限,现在即可执行
SELECT count() FROM table。此 PR 修复了 #10639。#18233(Vitaly Baranov)。 - 访问控制:现在
SELECT JOIN需要对每个被 JOIN 的表都拥有SELECT权限。此 PR 修复了 #17654。#18232(Vitaly Baranov)。 - 修复 Enum 与 Int 类型之间的键值比较问题。该修复解决了 #17989。#18214(Amos Bird)。
- 从 MySQL 进行复制(实验性功能)。修复 #18186,修复 #16372,修复 MaterializeMySQL 数据库引擎中唯一键转换问题。#18211 (Winter Zhang)。
- 修复同时使用
WITH FILL和WITH TIES的查询存在的不一致性问题 #17466。#18188 (hexiaoting)。 - 修复在最后一列解析出错时仍插入带默认值行的问题。修复了 #17712。#18182(Jianmei Zhang)。
- 修复在尝试设置 settings profile 时出现
Unknown setting profile错误的问题。#18167(tavplubix)。 - 修复执行
MODIFY COLUMN ... REMOVE TTL查询时未真正删除列 TTL 的错误。#18130(alesapin)。 - 修复了解析 S3 URL 时出现的
std::out_of_range: basic_string错误。#18059 (Vladimir Chebotarev)。 - 修正
DateTime64与Date的比较行为。修复了 #13804 和 #11222 问题。... #18050(Vasily Nemkov)。 - 从 MySQL 进行复制(实验性功能):修复 #15187,修复 #17912,并支持在 MaterializeMySQL 中转换 MySQL 前缀索引。#17944 (Winter Zhang)。
- 当使用
logger.size参数并将其设置为大于 2^32 的数值来配置服务器日志轮转时,日志不会被正确轮转。此问题已修复。#17905 (Alexander Kuzmenkov). - 当查询包含 ARRAY JOIN 时(因此该查询实际上并非“简单”查询),针对简单查询的优化会产生错误结果。 #17887 (sundyli).
- 修复
topK聚合函数中可能导致段错误的问题,从而关闭了 #17404。#17845(Maksim Kita)。 - WAL(实验性功能):如果禁用了
in_memory_parts_enable_wal,则不要从 WAL 恢复数据片段。#17802 (detailyang)。 - 关于最大可删除表大小的异常消息显示不正确。 #17764 (alexey-milovidov).
- 修复了在向
Distributed表插入数据时,由于空间不足可能导致的段错误。 #17737 (tavplubix). - 修复了 ClickHouse 无法重新建立与 MySQL 服务器连接的问题。#17681 (Alexander Kazakov).
- Windows:修复了在 Windows Subsystem for Linux 上运行的 ClickHouse 中,在
Atomic数据库执行RENAME查询时出现的Function not implemented错误。修复了 #17661。#17664(tavplubix)。 - 在执行
ON CLUSTER查询且pool_size> 1 时,可能由于竞态条件而错误地判断集群是否为环形(交叉)复制集群。该问题已修复。#17640 (tavplubix)。 - 修复在服务器以守护进程模式运行时
system.stack_trace表为空的问题。#17630 (Amos Bird)。 - 对于 MergeTree 表,现在可以在后台记录异常
fmt::v7::format_error。修复了 #17613。#17615(alexey-milovidov)。 - 在交互式模式下使用
clickhouse-client执行多行查询时,单行注释会被错误地扩展到整个查询的末尾。此更改修复了 #13654。#17565(alexey-milovidov)。 - 修复了当对应的 mutation 在其他副本上被终止时导致 ALTER 查询挂起的问题。修复了 #16953。#17499(alesapin)。
- 修复在 ClickHouse 低估 mark 缓存大小时的内存统计问题。当存在大量包含 mark 的小文件时,可能会出现该问题。#17496 (alesapin)。
- 修复在启用设置
optimize_redundant_functions_in_order_by时对ORDER BY的处理。#17471 (Anton Popov). - 修复由于错误优化导致在使用
DISTINCT后仍可能出现的重复行。修复了 #17294。#17296(li chengxiang)。#17439(Nikolai Kochetov)。 - 修复了 MergeTree 表 后台任务中高 CPU 占用的问题。#17416 (tavplubix)。
- 修复了在从包含
LowCardinality类型的JOIN表读取数据时可能发生的崩溃。修复了 #17228。#17397(Nikolai Kochetov)。 - 从 MySQL 进行复制(实验性特性):修复了 #16835,尝试解决与 MySQL SHOW 语句之间表头不匹配的问题。#17366(Winter Zhang)。
- 通过谓词优化器修复非确定性函数相关问题。这修复了 #17244。#17273(Winter Zhang)。
- 修复在使用
LIMIT的 Distributed 查询中可能出现的Unexpected packet Data received from client错误。 #17254 (Azat Khuzhin). - 修复了当子查询中存在常量列时 set 索引失效的问题。修复了 #17246。#17249(Amos Bird)。
- clickhouse-copier:针对非分区表的修复 #15235。#17248 (Qi Chen)。
- 修复了存储在 S3 磁盘上的数据分片可能无法正常工作的变更操作(实验性功能)。 #17227 (Pavel Kovalenko).
- 修复了函数
fuzzBits中的一个缺陷,相关问题:#16980。#17051(hexiaoting)。 - 修复仅带 OFFSET 子句的查询中
optimize_distributed_group_by_sharding_key的问题。#16996 (Azat Khuzhin). - 修复在
Merge表上对Distributed表执行 JOIN 时的查询问题。#16993(Azat Khuzhin)。 - 修复涉及单调函数的 ORDER BY 优化。修复 #16107。#16956(Anton Popov)。
- 修复在比较具有不同 scale 的
DateTime64类型时的错误。修复 #16655 ... #16952(Vasily Nemkov)。 - 修复在启用设置
optimize_aggregators_of_group_by_keys时,GROUP BY与JOIN相关的优化问题。修复了 #12604。#16951(Anton Popov)。 - 对
SHOW ACCESS查询进行了一个小修正。 #16866 (tavplubix). - 修复在启用
optimize_trivial_count_query设置并使用分区谓词时的执行行为。#16767(Azat Khuzhin)。 - 通过 MySQL 线协议返回 INSERT 查询所影响的行数。之前 ClickHouse 始终返回 0,现已修复此问题。修复了 #16605。#16715(Winter Zhang)。
- 修复了
select_sequential_consistency在优化后的简单计数查询和 system 表中导致的不一致行为。#16309 (Hao Chen)。 - 当
REPLACE列转换器在不存在的列上操作时抛出错误。#16183 (hexiaoting). - 若 RIGH|FULL JOIN 的 ON 表达式不是等值连接(equi-join),则抛出异常。 #15162 (Artem Zuikov).
构建/测试/打包方面的改进
- 为 ClickHouse 二进制文件添加了简单的完整性检查。它有助于检测由故障硬件导致的数据损坏(例如存储介质上的位衰减或内存中的位翻转)。#18811 (alexey-milovidov)。
- 将
OpenSSL替换为BoringSSL,从而避免与 sanitizers 相关的问题。修复了 #12490。修复了 #17502。修复了 #12952。#18129(alexey-milovidov)。 - 简化
Sys/Vinit 脚本。该脚本在 Ubuntu 12.04 及更早版本中无法正常工作。#17428 (alexey-milovidov). - 对
./clickhouse install脚本进行了多项改进。#17421 (alexey-milovidov)。 - 现在 ClickHouse 可以充当一个假的 ZooKeeper。当前的存储实现只是一个内存哈希表,服务器仅部分支持 ZooKeeper 协议。#16877 (alesapin)。
- 修复 TestKeeperStorage(ZooKeeper 的 mock)中对失效列表 watch 删除的处理。 #18065 (alesapin).
- 添加用于故障注入的
SYSTEM SUSPEND命令,可用于方便地执行故障转移测试。此更改关闭了 #15979。 #18850 (alexey-milovidov)。 - 在使用
lld链接 ClickHouse 时生成构建 ID。发现在我的机器上,lld默认不会生成它。构建 ID 用于崩溃报告和内部分析。 #18808 (alexey-milovidov)。 - 修复代码风格检查中的 shellcheck 错误。 #18566 (Ilya Yatsishin).
- 将时区信息更新为 2020e 版本。 #18531 (alesapin)。
- 修复 codespell 警告。将代码风格检查拆分为独立部分。更新代码风格检查的 Docker 镜像。#18463 (Ilya Yatsishin).
- 在文档中新增对冲突标记遗留情况的自动检查。#18332(alexey-milovidov)。
- 为无状态测试启用 Thread Fuzzer 以检查其不稳定性。#18299 (alesapin).
- 不要使用非线程安全的函数
strerror。 #18204 (alexey-milovidov). - 更新
anchore/scan-action@main工作流操作(其分支已从master迁移到main)。#18192 (Stig Bakken)。 - 现在
clickhouse-test在执行数据库 DROP/CREATE 操作时带有超时控制。#18098 (alesapin)。 - 为无状态测试启用对 Pytest 框架的实验性支持。#17902 (Ivan)。
- 现在我们在集成测试中使用最新版本的 Docker daemon。#17671(alesapin)。
- 在启用 Sentry 时,将官方构建信息以及内存、CPU 和可用磁盘空间等信息发送到 Sentry。Sentry 是一项需主动启用的功能,用于帮助 ClickHouse 开发者。该改动关闭了 #17279。#17543 (alexey-milovidov)。
- 在
clickhouse-copier代码中存在一个未初始化的变量。#17363 (Nikita Mikhaylov)。 - 修复了 #17309 中的 一份 MSan 报告。#17344(Nikita Mikhaylov)。
- 修复 Arrow Flight 库中 IPv6 相关问题。有关详细信息,请参阅该评论。#16664(Zhanna)。
- 添加一个库,将部分
libc函数替换成会终止进程的 trap 指令。#16366 (alexey-milovidov)。 - 在发生栈溢出时在服务器日志中提供诊断信息,并向 clickhouse-client 返回错误消息。修复了 #14840。 #16346(alexey-milovidov)。
- 现在我们几乎可以并行运行所有无状态功能测试。#15236 (alesapin)。
- 修复
librdkafka中 snappy 解压缩的数据损坏问题(只影响使用 gcc 10 构建的版本,但官方构建已改用 clang,因此至少近期的官方发行版不受影响)。 #18053 (Azat Khuzhin). - 如果服务器被 OOM Killer 终止,则在日志中记录一条消息。 #13516 (alexey-milovidov)。
- PODArray:避免在参数为 (nullptr, 0) 时调用 memcpy(修复 UBSan 报告中的问题)。修复了 #18525。#18526(alexey-milovidov)。
- 对 DDLWorker 内部的 ZooKeeper 路径拼接进行了小幅改进。#17767 (Bharat Nallan)。
- 支持从调试文件重新加载符号。此 PR 还修复了一个 build-id 问题。#17637 (Amos Bird)。