2021 年变更日志
ClickHouse 发布 v21.12, 2021-12-15
向后不兼容的变更
- 修复了先前存在不良行为的功能。 不允许直接选择 Kafka/RabbitMQ/FileLog。可以通过设置
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中移除,因为自 20.6 起支持多领导者。如果您从旧版本升级,并且某些旧版本的副本是领导者,则服务器将在升级后启动失败。停止旧版本的副本以使新版本启动。之后,将无法降级到 20.6 之前的版本。 #32140 (tavplubix)。
新功能
- 在 clickhouse-keeper 中实现了更多的 ZooKeeper 四字命令: https://zookeeper.net.cn/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格式并行解析的错误。 #30178 (Kruglov Pavel)。允许在CustomSeparated输入/输出格式中打印/解析列名和类型。添加类似于TSVWithNames/WithNamesAndTypes的格式CustomSeparatedWithNames/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)。
实验性功能
WINDOW VIEW以在 ClickHouse 中启用流处理。 #8331 (vxider)。- 放弃在
MaterializedMySQL中使用 Ordinary 数据库的支持。 #31292 (Stig Bakken)。 - 为 Log 系列实现命令 BACKUP 和 RESTORE。此功能正在开发中。 #30688 (Vitaly Baranov)。
性能提升
- 减少使用
s3/url/hdfs格式Parquet、ORC、Arrow读取时的内存使用量(由设置input_format_allow_seeks控制,默认启用)。还添加了设置remote_read_min_bytes_for_seek以控制 seeks。关闭 #10461。关闭 #16857。 #30936 (Kseniia Sumarokova)。 - 为 JOIN ON 中的常量条件添加优化,参考 #26928。 #27021 (Vladimir C)。
- 支持除
JSONEachRowWithProgress和PrettyCompactMonoBlock之外的所有文本格式的并行格式化。 #31489 (Kruglov Pavel)。 - 加速对可为空列的计数。 #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)。 - 优化函数
tupleElement以读取启用了设置optimize_functions_to_subcolumns的子列。 #31261 (Anton Popov)。 - 优化函数
mapContains以读取启用了设置optimize_functions_to_subcolumns的子列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中不同分区的 mutations。 #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 日志持续时间 - 如果存在查询异常,则在查询级别为零。 #32038 (Frank Chen)。
- 修复无法创建
Int256的LowCardinality的问题。 #31832 (alexey-milovidov)。 - 在引擎/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)。 - 当在配置中未定义宏时,从
Replicated数据库参数中使用分片和副本名称来扩展ReplicatedMergeTree参数中的宏。关闭 #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)。- 在系统表上执行
show create table时返回人工创建查询。 #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从用户设置移动到 merge tree 设置。 #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 中删除 znodes 期间 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)。
Bug 修复
- 修复了启用位置参数时按 group by / order by / limit by 别名的问题。关闭了 #31173。 #31741 (Kseniia Sumarokova)。
- 修复了
Buffer表引擎与Map类型一起使用的问题。修复了 #30546。 #31742 (Anton Popov)。 - 修复了从启用
use_uncompressed_cache的MergeTree表中读取数据的问题。 #31826 (Anton Popov)。 - 修复了当无事可做的 mutations 卡住时的行为(启用了设置
empty_result_for_aggregation_by_empty_set)。 #32358 (Nikita Mikhaylov)。 - 修复了在写入 protobuf 时跳过列的问题。此 PR 修复了 #31160,请参阅评论 #31160#issuecomment-980595318。 #31988 (Vitaly Baranov)。
- 修复了在子查询中删除不需要的列时出现的错误。如果查询中存在没有 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)。 - 修复了
Nullable(Float)的 NaN 反序列化在Quoted转义规则下的解析错误。 #32190 (Kruglov Pavel)。 - XML 字典:在升级到较新版本期间,表创建查询中使用的标识符可以限定为
default_database。关闭了 #31963。 #32187 (Maksim Kita)。 - 如果在某些副本上禁用设置
replicated_can_become_leader,则使用仲裁插入时,活动副本的数量可能被错误地确定。此问题已修复。 #32157 (tavplubix)。 - 字典:修复了
{condition}不适用于自定义数据库查询的情况。 #32117 (Maksim Kita)。 - 修复了使用
cast_keep_nullable从Nullable进行CAST的问题(例如,对于toUInt32OrDefault(toNullable(toUInt32(1)))之前出现PARAMETER_OUT_OF_BOUND错误)。 #32080 (Azat Khuzhin)。 - 修复了在某些晦涩的情况下创建 Join Storage 表的问题。关闭了 #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)。- 如果 part 在所有副本上都丢失,并且同一分区中没有其他 part,则某些
GET_PART条目可能会在复制队列中挂起。在分区键仅包含整数类型或Date[Time]类型的列的情况下,此问题已修复。修复了 #31485。 #31887 (tavplubix)。 - 修复了
empty和notEmpty函数对UUID类型参数的使用。修复了 #31819。 #31883 (Anton Popov)。 - 在构造
KeeperTCPHandler时,将配置路径从keeper_server.session_timeout_ms更改为keeper_server.coordination_settings.session_timeout_ms。operation_timeout也做了相同的更改。 #31859 (JackyWoo)。 - 修复了使用可空主键时,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)。
- 修复了当指定的集群名称是
Replicated数据库的名称时,执行ON CLUSTER查询时出现的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)。 RENAME TABLE查询在尝试重命名Ordinary数据库中的 DDL 字典时工作不正确,此问题已修复。 #31638 (tavplubix)。- 按照预期的方式实现了
sparkbar聚合函数,请参阅:#26175#issuecomment-960353867, comment。 #31624 (小路)。 - 修复了当只有列名包含无效 UTF-8 序列时生成的 JSON 无效的问题。 #31534 (Kevin Michel)。
- 在修复此优化中的错误之前,禁用
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 中的一个错误,该错误可能导致在某些协调日志丢失且我们有比最新日志更新鲜的快照时无法启动。 #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 查询中断的错误。在 #30691 中发现。 #30997 (Kseniia Sumarokova)。
- 在 ATTACH PARTITION ... FROM 和 MOVE PARTITION ... 的情况下跳过
max_partition_size_to_drop check检查。 #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,并确保在构建期间不使用来自主机 OS 的源文件或二进制文件。这关闭了 #27133。这关闭了 #21435。这关闭了 #30462。 #30011 (alexey-milovidov)。
- 添加函数
getFuzzerData()以轻松模糊特定函数。这关闭了 #23227。 #27526 (Alexey Boykov)。 - 在 Docker 内部更正确地设置 capabilities。 #31802 (Constantine Peresypkin)。
- 启用 clang
-fstrict-vtable-pointers、-fwhole-program-vtables编译选项。 #20151 (Maksim Kita)。 - 避免为 FreeBSD 交叉编译下载 toolchain tarball。 #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协调设置(必须在所有仲裁副本上都相同)关闭此行为。向后不兼容性非常罕见,并且可能仅在新节点将快照(在恢复情况下发生)发送到无法读取 ZSTD 格式快照的旧节点时发生。 #29417 (alesapin)。
新功能
- 新的异步 INSERT 模式允许累积插入的数据,并在后台将其存储在单个批次中。在客户端,可以通过为
INSERT查询设置async_insert来启用它,数据内联在查询中或在单独的缓冲区中(例如,对于通过 HTTP 协议的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)。关于性能的说明:使用异步插入,您每秒最多可以执行大约 10000 个单独的 INSERT 查询,因此如果您想要实现每秒数百万行插入的性能,仍然建议批量插入。 - 为
clickhouse-local添加交互模式。因此,您可以直接运行clickhouse-local以获得命令行 ClickHouse 界面,而无需连接到服务器并处理来自文件和外部数据源的数据。还将clickhouse-client和clickhouse-local的代码合并在一起。关闭了 #7203。关闭了 #25516。关闭了 #22401。 #26231 (Kseniia Sumarokova)。 - 增加了对可执行(脚本化)用户定义函数的支持。这些 UDF 可以用任何编程语言编写。 #28803 (Maksim Kita)。
- 允许预定义到外部数据源的连接。这允许在使用外部数据源时避免指定凭据或地址,而是可以通过名称引用它们。关闭了 #28367。 #28577 (Kseniia Sumarokova)。
- 在
INFORMATION_SCHEMA数据库中添加了SCHEMATA、TABLES、VIEWS和COLUMNS视图,对应于system数据库中的表。关闭了 #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 可以与无服务器请求一起工作,而无需使用变通方法。关闭了 #18693。 #29155 (Filatenkov Artur)。 - 带有 JOIN ON 的查询现在支持析取(OR)。 #21320 (Ilya Golshtein)。
- 添加了函数
tokens。它允许使用非字母数字 ASCII 字符作为分隔符将字符串拆分为 tokens。 #29981 (Maksim Kita)。添加了函数ngrams以从文本中提取 ngrams。关闭了 #29699。 #29738 (Maksim Kita)。 - 添加了 Unicode 规范化函数:
normalizeUTF8NFC、normalizeUTF8NFD、normalizeUTF8NFKC、normalizeUTF8NFKD函数。 #28633 (darkkeks)。 - 使用
FileLog表引擎在 ClickHouse 中流式消费应用程序日志文件。它类似于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,则在 chunk 之前,将带有换行符的 chunk 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 (凌涛)。- 从服务器向客户端发送 profile 事件。引入了新的数据包类型
ProfileEvents。关闭了 #26177。 #28364 (Dmitry Novik)。 FixedString和String数据类型的位移操作。这关闭了 #27763。 #28325 (小路)。- 支持在 MaterializedPostgreSQL 数据库引擎中动态地添加/删除 PostgreSQL 的复制表。支持更改数据库设置。关闭了 #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)。
性能改进
- 后台合并可以相互抢占,并且它们以适当的优先级进行调度。现在,长时间运行的合并不会阻止短时间合并的进行。这是为了更好地调度和控制合并的执行。它减少了出现“parts too many”错误的几率。 #22381。 #25165 (Nikita Mikhaylov)。添加了执行比后台线程池中线程数更多的合并和 mutation 的能力。合并和 mutation 将根据它们的大小逐步执行(较小的优先级更高)。要执行的任务数与线程数的比率由设置
background_merges_mutations_concurrency_ratio控制,默认为 2。 #29140 (Nikita Mikhaylov)。 - 允许对远程文件系统使用异步读取。减少从远程文件系统读取时的 seek 次数。这极大地提高了性能,并使实验性的
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)。
- 添加了将
IS NULL/IS NOT NULL下推到外部数据库(即 MySQL)的支持。 #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)。
- 改进了过滤器字节掩码生成器(用于 WHERE 运算符)函数,全部使用 SSE/AVX2/AVX512 指令完成。请注意,默认情况下 ClickHouse 仅使用 SSE,因此仅与自定义构建相关。 #30014 (jasperzhu)。 #30670 (jasperzhu)。
- 提高了 Nullable 浮点数的 SUM 聚合函数的性能。 #28906 (Raúl Marín)。
- 在使用多个磁盘的情况下,加快了 part 加载过程。这个想法类似于 https://github.com/ClickHouse/ClickHouse/pull/16423 。生产环境显示改进:24 分钟 -> 16 分钟。 #28363 (Amos Bird)。
- 减小了 S3 多部分上传 part 大小的默认设置,以降低内存使用量。 #28679 (ianton-ru)。
- 加速了
bitmapAnd函数。 #28332 (dddounaiking)。 - 当合并仍在进行时,在
StorageMergeTree中删除了次优的 mutation 通知。 #27552 (Vladimir Chebotarev)。 - 尝试提高字符串比较的性能。 #28767 (alexey-milovidov)。
- 主键索引和分区过滤器可以在元组中工作。 #29281 (凌涛)。
- 如果查询具有多个具有相同参数但 level 参数不同的 quantile 聚合函数,并且启用了设置
optimize_syntax_fuse_functions,它们将被融合在一起并在一次传递中执行。 #26657 (hexiaoting)。 - 现在,通过投影优化了主键第一个表达式上的 min-max 聚合。这是为了 #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)。支持 lambdas。示例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 时出现“除以零”错误。关闭了 #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 (凌涛)。 - 支持
ALTER TABLE用于Memory数据库中的表。Memory 数据库用于clickhouse-local。 #30866 (tavplubix)。 arrayStringConcat现在支持所有可序列化类型的数组。 #30840 (Nickita Taranov)。- ClickHouse 现在将考虑 docker/cgroups 限制来获取系统内存量。请参阅 #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)。 - 副本克隆和为损坏的 parts 排队获取的 minor 改进,应该避免在复制队列中极少出现的
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)。- 将 ClickHouse logo 添加到 Play UI。 #29674 (alexey-milovidov)。
- 改进了从 Arrow 支持的格式(如
Arrow、ArrowStream、Parquet和ORC)读取列时的异常消息。 这解决了 #29926。 #29927 (alexey-milovidov). - 修复了
Buffer表中 flush 和 startup 之间的 data-race。 这可能在测试中出现。 #29930 (Azat Khuzhin)。 - 修复了
DatabaseMemory和LiveView的DROP TABLE之间的lock-order-inversion。 Live View 是一项实验性功能。 Memory 数据库在 clickhouse-local 中使用。 #29929 (Azat Khuzhin)。 - 修复了定期字典重载和配置重载之间的 lock-order-inversion。 #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_type -MemoryPeak)。 #29858 (Azat Khuzhin)。 - PostgreSQL 外部表:为获取副本身份索引的查询添加了分区表前缀 'p'。 #29828 (Shoh Jahon)。
- 在 mutate/merge 期间应用
max_untracked_memory/memory_profiler_step/memory_profiler_sample_probability以分析 merges 期间的内存使用情况。 #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更改,则重新加载字典、模型、用户定义的executable 函数。 关闭了 #28142。 #29529 (Maksim Kita)。 - 去除了对 projection 名称的无意义限制。 现在 projection 名称可以以
tmp_开头。 #29520 (Amos Bird). - 修复了带有嵌套子查询的 mutations 中的
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)。 - 添加了对
FREEZE内存中 parts 的支持(用于备份)。 #29376 (Mo Xuan)。 - 为
clickhouse-benchmark传递初始 query_id(以前,如果您通过clickhouse-benchmark运行远程查询,则 shards 上的查询不会通过initial_query_id链接到初始查询)。 #29364 (Azat Khuzhin)。 - 跳数索引
tokenbf_v1和ngrambf_v1:添加了对Array数据类型的支持,其键类型为String或FixedString类型。 #29280 (Maksim Kita)。 跳数索引tokenbf_v1和ngrambf_v1添加了对Map数据类型的支持,其键类型为String或FixedString类型。 作者 @lingtaolf。 #29220 (Maksim Kita)。 - 函数
has:添加了对Map数据类型的支持。 #29267 (Maksim Kita)。 - 为 clickhouse-keeper 添加了
compress_logs设置,该设置允许在ZSTD中压缩 clickhouse-keeper 日志(对于复制状态机)。 实现了: #26977。 #29223 (alesapin)。 - 添加了一个设置
external_table_strict_query- 它将强制在查询中将整个 WHERE 表达式传递到外部数据库,即使它不兼容。 #29206 (Azat Khuzhin)。 - 当使用
ARRAY JOIN时禁用 projections。 在以前的版本中,projection 分析可能会破坏 array join 中的别名。 #29139 (Amos Bird). - 在
MsgPack输入/输出格式中支持更多类型。 #29077 (Kruglov Pavel). - 允许在
ORC输入/输出格式中输入和输出LowCardinality列。 #29062 (Kruglov Pavel). - 从
system.distributed_ddl_queue中选择可能会显示不正确的值,现已修复。 #29061 (tavplubix). - HTTP 连接的未知方法的正确行为。 解决了 #29050。 #29057 (Filatenkov Artur).
clickhouse-keeper:修复了clickhouse-keeper-converter中的一个错误,该错误可能导致从 ZooKeeper 日志(非快照)恢复时丢失一些数据。 #29030 (小路)。 修复了clickhouse-keeper-converter中的一个错误,该错误可能导致不正确的 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-combinator 检查的嵌套函数限制(但禁止嵌套相同的 combinator)。 #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设置,这将分离而不是删除字节不完全相同的部分(在 mege/mutate 之后)。 #28708 (Azat Khuzhin). - 为
MergeTree实现了max_suspicious_broken_parts_bytes设置(限制所有损坏部分的总体大小,默认为1GiB)。 #28707 (Azat Khuzhin). - 在
RabbitMQ表设置中启用宏展开。 #28683 (Vitaly Baranov). - 恢复了使用
Log引擎的表在多线程中读取数据的可能性。 #28125 (Vitaly Baranov). - 修复了 JSON 函数中 NULL 列处理的错误行为。 这修复了 #27930。 #28012 (Amos Bird).
- 允许分别从列中设置跳数索引的 Mark/Uncompressed 缓存大小。 #27961 (Amos Bird).
- 允许将 JOIN 与
USING与其他 JOIN 类型混合使用。 #23881 (darkkeks). - 更新 aws-sdk 子模块以在 Yandex Cloud S3 中进行限流。 #30646 (ianton-ru).
- 修复了在处理 gRPC 调用时在查询处理结束时释放查询 ID 和会话 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 的所有镜像都将放置在单独的 dockerhub 仓库中。 #28656 (alesapin).
- 改进了对使用 clang-13 构建的支持。 #28046 (Sergei Semin).
- 添加了将原始 profile 事件打印到
clickhouse-client的功能(这对于调试和测试可能很有用)。 #30064 (Azat Khuzhin). - 为 clickhouse-server 单元(systemd 和 sysvinit init)添加时间依赖项。 #28891 (Azat Khuzhin).
- 当符号重新加载时,重新加载堆栈跟踪缓存。 #28137 (Amos Bird).
Bug 修复
- 在极少数情况下,用于在 UTF-8 字符串中进行不区分大小写搜索的函数(如
positionCaseInsensitiveUTF8和countSubstringsCaseInsensitiveUTF8)可能会找到实际上不匹配的子字符串,此问题已修复。 #30663 (tavplubix). - 修复了从加密磁盘上的空文件读取的问题。 #30494 (Vitaly Baranov).
- 修复了在设置
legacy_column_name_of_tuple_literal = 0的分布式查询中,将析取链转换为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 表达式中操作数超过两个时,未使用的 set index。 这修复了 #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和后台 merge 之间的竞争条件,该条件可能导致移动/替换的数据部分保留在分区中。 修复了 #29327。 #30717 (tavplubix). - 修复了在 always true PREWHERE 的情况下,PREWHERE 与 WHERE 的问题。 #30668 (Azat Khuzhin).
- Limit push down 优化可能导致
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)的查询可能会返回不正确的结果。 修复了 projections 的 set 创建。 #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 修复了 nullable 属性的 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中的 nullable 参数。 #30177 (Anton Popov). - 修复了带有
GLOBAL IN和WITH TOTALS的查询的Port is already connected错误。 仅适用于 21.9 和 21.10 版本。 #30086 (Nikolai Kochetov). - 修复了 MergeTree 的 MOVE PARTITION 和 merges/mutations 之间的竞争。 #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之间可能发生的 data-race。 #29959 (Azat Khuzhin). - 修复了
StorageLog中LogSink::writeMarks()和LogSource之间的 data-race。 #29946 (Azat Khuzhin). - 修复了 merge tree 表的并发查询限制的潜在资源泄漏,该泄漏在 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错误,据推测是由于内核中的某些错误。 修复了 #29154。 #29811 (tavplubix). - 修复了当使用非字符串字面量而不是路径时,
ATTACH TABLE ... FROM 'path'查询中的错误强制转换。 这可能导致读取未初始化的内存。 #29790 (alexey-milovidov). - 修复了
GROUP BY期间对LowCardinality的并发访问(与Buffer表结合使用可能会导致问题)。 #29782 (Azat Khuzhin). - 修复了在 shards 具有混合版本
<= 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 表引擎表上进行读写操作时发生的死锁。#29544 (Raúl Marín)。
- 修复了
pathStartsWith检查中的错误,因为std::mismatch的使用存在错误:如果第二个范围比第一个范围短,则行为未定义。。#29531 (Kseniia Sumarokova)。 - 在 ODBC 桥接器中,为错误“游标状态无效”添加了重试机制。这是一个可重试的错误。关闭了 #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)。
- 修复了配置错误时,复制访问存储无法干净关闭的问题。#29388 (Kevin Michel)。
- 移除了窗口函数
nth_value,因为它不是内存安全的。这关闭了 #29347。#29348 (alexey-milovidov)。 - 修复了投影部分的垂直合并。这修复了 #29253 问题。此 PR 还修复了在 https://github.com/ClickHouse/ClickHouse/pull/25165 中引入的几个投影合并/mutation 问题。#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 error(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)。
- 处理与字典连接时的
any_join_distinct_right_table_keys,关闭了 #29007。#29014 (Vladimir C)。 - 修复了在别名列上进行连接时出现的 “Not found column ... in block” 错误,关闭了 #26980。#29008 (Vladimir C)。
- 修复了
GLOBAL IN子查询中使用的线程数(自 #19414 错误修复以来,它在单线程中执行)。#28997 (Nikolai Kochetov)。 - 修复了当 ORDER BY 包含 WITH FILL 时发生的错误优化。这关闭了 #28908。这关闭了 #26049。#28910 (alexey-milovidov)。
- 修复了带有常量的高阶数组函数(
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的错误。关闭了 #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)。 - 修复了在创建分布式表时,当传入的参数错误时发生的 core dump。#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)。
新功能
- 添加了将用户自定义函数 (UDF) 创建为 lambda 表达式的功能。语法
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索引创建虚拟投影。现在,当启用allow_experimental_projection_optimization时,查询将在可能的情况下使用 minmax 索引而不是读取数据。#26286 (Amos Bird)。 - 在
sequenceMatch和sequenceCount中引入了两个检查,允许在事件列表中缺少序列模式的某些确定性部分时提前退出。此更改解锁了许多以前因达到操作上限而失败的查询,并总体上加快了 pipeline 速度。#27729 (Jakub Kuklis)。 - 使用二元函数的始终单调信息增强主键分析,特别是对于非零常数除法。#28302 (Amos Bird)。
- 使
hasAll过滤器条件利用 bloom filter 数据跳过索引。#27984 (Braulio Valdivielso Martínez)。 - 通过延迟表启动过程来加速数据部分加载。#28313 (Amos Bird)。
- 修复了可能将过多条件从
WHERE移动到PREWHERE的问题(优化由设置optimize_move_to_prewhere控制)。#28139 (lthaooo)。 - 默认启用
optimize_distributed_group_by_sharding_key。#28105 (Azat Khuzhin)。
改进
- 在创建
Distributed表之前检查集群名称,不允许创建具有不正确集群名称的表。修复了 #27832。#27927 (tavplubix)。 - 添加了聚合函数
quantileBFloat16Weighted,类似于其他 quantile...Weighted 函数。这关闭了 #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 状态下的 parts 可能导致意外异常(
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 对象使用 Multipart copy 上传。#27858 (ianton-ru)。
- 允许库字典路径的符号链接遍历。#27815 (Kseniia Sumarokova)。
- 现在,将
ALTER MODIFY COLUMT修改为Nullable(T)不需要 mutation。#27787 (victorgao)。 - 不要静默忽略
ReadBufferFromS3中的错误,也不要计算延迟。#27484 (Vladimir Chebotarev)。 - 通过仅重新计算元数据而不执行实际的 TTL 操作来改进
ALTER ... MATERIALIZE TTL。#27019 (lthaooo)。 - 允许读取自定义顶级域名列表,而无需在 EOF 处换行符。#28213 (Azat Khuzhin)。
Bug Fix
- 修复了从
carbon-clickhouse读取压缩数据时,出现 “attempt to read after end of file” 失败的情况。关闭了 #26149。#28150 (FArthur-cmd)。 - 修复了当使用
ON CLUSTER子句执行GRANT WITH REPLACE语句时,检查访问权限的问题。此 PR 改进了修复 #27001。#27983 (Vitaly Baranov)。 - 允许从
LowCardinality(UUID)类型的列中选择extremes = 1。#27918 (Vitaly Baranov)。 - 修复了 PostgreSQL 风格的 cast (
::运算符) 处理负数的问题。#27876 (Anton Popov)。 - 在 #26864 之后。修复
NamedSessionStorage的关闭问题:存储在NamedSessionStorage中的会话上下文现在会在销毁全局上下文之前被销毁。 #27875 (Vitaly Baranov)。 - 修复
windowFunnel"strict" 模式的 Bug。此修复解决了 #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.错误的 Bug。修复了 #28515。 #28528 (alesapin)。 - 修复了在分布式 DDL 队列的后台处理中可能发生的 ZooKeeper 监视器泄漏(小问题)。关闭了 #26036。 #28446 (tavplubix)。
- 修复了
MaterializedPostgreSQL引擎中表名缺少引号的问题。关闭了 #28316。 #28433 (Kseniia Sumarokova)。 - 修复了来自可空列的未连接行的错误行为。关闭了 #27691。 #28349 (vdimir)。
- 修复了当并非所有键列都被使用时 NOT-IN 索引优化的问题。此修复解决了 #28120。 #28315 (Amos Bird)。
- 修复了由于新 part 被空 part 替换而导致的 parts 相交问题。 #28310 (Azat Khuzhin)。
- 修复了在启用
optimize_read_in_order设置的情况下,使用ORDER BY和Merge表的查询中结果不一致的问题。 #28266 (Anton Popov)。 - 修复了当
extremes设置为 1 时,使用Nullable(LowCardinality)类型的查询可能读取未初始化内存的问题。修复了 #28165。 #28205 (Nikolai Kochetov)。 - 多个针对 projections 的小型修复。请参阅 PR 中的详细描述。 #28178 (Amos Bird)。
- 修复了由于上下文/配置重载器关闭顺序不正确而导致的极少数情况下在关闭时发生的段错误。 #28088 (nvartolomei)。
- 修复了
JSONExtract函数中处理Nullable(String)类型的 null 值的问题。此修复解决了 #27929 和 #27930。此问题在 https://github.com/ClickHouse/ClickHouse/pull/25452 中引入。 #27939 (Amos Bird)。 - 多个针对新的
clickhouse-keeper工具的修复。修复了clickhouse-keeper中的一个罕见 Bug,当客户端可以在请求-响应之前收到监视响应时会发生此 Bug。 #28197 (alesapin)。修复了当列表监视 (getChildren) 由针对子节点的set请求触发时,clickhouse-keeper中的不正确行为。 #28190 (alesapin)。修复了clickhouse-keeper设置更改可能导致日志丢失和服务器挂起的罕见情况。 #28360 (alesapin)。修复了clickhouse-keeper中的一个 Bug,当rotate_logs_interval减小时,可能导致无限日志。 #28152 (alesapin)。
构建/测试/打包 改进
- 在压力测试中启用线程模糊器。线程模糊器是 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(如Array或Tuple)的标量子查询会抛出错误。修复了 #25411。 #26423 (Nikolai Kochetov)。 - 引入了 here documents 的语法。示例
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)。 - 添加了类似于
SELECT ... INTO OUTFILE的INSERT ... FROM INFILE功能。 #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)函数。它创建位图的子集,并将结果限制为cardinality_limit,偏移量为offset。 #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)。 - 添加了返回当前查询的(初始)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)。 ReplicatedMergeTree在HDFS存储上的零拷贝复制。 #25918 (Zhichang Yu)。- 允许在
Arrow、ORC和Parquet输入格式中将 Nested 类型作为结构体数组插入。 #25902 (Kruglov Pavel)。 - 添加了新的数据类型
Date32(将数据存储为 Int32),支持与DateTime64相同的日期范围,支持将 parquet date32 加载到 ClickHouseDate32,添加了类似于toDate的新函数toDate32。 #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)。 - 删除了重复的索引分析,并避免了在 projection 分析期间可能发生的无效限制检查。 #27742 (Amos Bird)。
- 允许在 HTTP 请求的正文中传递查询参数。 #27706 (Hermano Lustosa)。
- 禁止在分区表达式上使用
arrayJoin。 #27648 (Raúl Marín)。 - 如果身份验证失败,则记录客户端 IP 地址。 #27514 (Misko Lee)。
- 在 GRPC 协议中使用字节而不是字符串来表示二进制数据。 #27431 (Vitaly Baranov)。
- 如果未设置 HTTP 端口,并且用户尝试将 HTTP 请求发送到 TCP 端口,则发送带有错误消息的响应。 #27385 (Braulio Valdivielso Martínez)。
- 添加了用于内部使用的
_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)。
- 默认情况下,Watchdog 在 docker 中被禁用。修复了不处理 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时过多的 (x2) 连接尝试。 #26658 (Azat Khuzhin). - 避免
clickhouse-benchmark在连接失败时(例如 EMFILE)挂起。 #26656 (Azat Khuzhin). - 允许 Kafka 引擎使用更多线程。 #26642 (feihengye).
- 为
clickhouse-benchmark添加轮询调度支持(除了统计报告外,它与常规多主机/端口运行没有区别)。 #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步骤。现在distributed_push_down_limit受到optimize_distributed_group_by_sharding_key优化的尊重。 #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).
- 为 profile 调用添加
sleep/sleepEachRow事件。 #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). - 为
Log和TinyLog表的system.columns表添加了有关列大小的信息。 修复了 #9001。 #26241 (Nikolay Degterinsky). - 当存在自定义磁盘配置且某些磁盘上不存在
detached目录时,查询system.detached_parts表时不再抛出异常。 修复了 #26078。 #26236 (alexey-milovidov). - 检查键中是否存在非确定性函数,包括类似
now()、today()的常量表达式。 修复了 #25875。 修复了 #11333。 #26235 (alexey-milovidov). - 在 PostgreSQL 表引擎中将 timestamp 和 timestamptz 数据类型转换为
DateTime64。 #26234 (jasine). - 对投影应用激进的 IN 索引分析,以便可以选择更好的投影候选项。 #26218 (Amos Bird).
- 当传递标量函数时,删除 IN 的 GLOBAL 关键字。 在以前的版本中,如果用户指定
GLOBAL IN f(x),则会抛出异常。 #26217 (Amos Bird). - 向异常消息添加错误 ID(例如
BAD_ARGUMENTS)。 修复了 #25862。 #26172 (alexey-milovidov). - 修复了 clickhouse-local 的 --progress 选项输出不正确的问题。 进度条将在达到 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可能无法正常工作。 使用直接 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中一个罕见的错误,该错误可能导致错误Unexpected merged part intersects drop range。 #27807 (alesapin). - 防止在 Kafka 收到 NULL(墓碑)消息时某些格式崩溃。 修复了 #19255。 #27794 (filimonov).
- 修复了子查询中 union distinct 的列过滤。 修复了 #27578。 #27689 (Kseniia Sumarokova).
- 修复了当类似
arrayHas的函数应用于 LowCardinality of Nullable 的不同非数字类型(如DateTime和DateTime64)的数组时出现的错误类型转换。 在以前的版本中,会发生错误的转换。 在新版本中,它将导致异常。 修复了 #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).
- 修复了当某些 part 包含缺失列时投影物化期间的崩溃。 修复了 #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 中无效分区上的 mutation 卡住的问题。 #27248 (Azat Khuzhin).
- 在模棱两可的情况下,lambda 函数优先使用其参数而不是其他别名或标识符。 #27235 (Raúl Marín).
- 修复了 merge join 中的列结构,修复了 #27091。 #27217 (Vladimir C).
- 在极少数情况下,
system.detached_parts表可能包含某些 part 的不正确信息,此问题已修复。 修复了 #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字典源的library-bridge中字典键的加载。 #26834 (Kseniia Sumarokova). - 应用某些组合器时,聚合函数参数可能会丢失,从而导致类似
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).
- 修复了窗口函数中潜在的空指针解引用。 修复了 #25276。 #26668 (Alexander Kuzmenkov).
- 修复了 clickhouse-client 历史记录文件转换(从 3 年前的 clickhouse-client 版本升级时),如果文件为空。 #26589 (Azat Khuzhin).
- 修复了 groupBitmapAnd/Or/Xor 的错误函数名称(可能在某些情况下显示)。 修复了此问题。 #26557 (Amos Bird).
- 更新了 clickhouse-server docker entrypoint 中的
chowncmd 检查。 它修复了 Kubernetes 上集群 pod 重启失败(或超时)的 bug。 #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). - 修复了丢失副本恢复中可能导致副本发散的罕见 bug。 #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 没有零值,则在 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).
- 修复了来自没有函数的列的 sharding_key 用于 remote() 的情况(之前
select * from remote('127.0.0.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).
构建/测试/打包改进
- 现在我们在随机时区中运行有状态和无状态测试。 修复了 #12439。 在 Protobuf 格式中将 String 读取为 DateTime 和将 DateTime 写入为 String 现在尊重时区。 在 Arrow 和 Parquet 格式中将 UInt16 读取为 DateTime 现在将其视为 Date,然后根据 DateTime 的时区转换为 DateTime,因为 Date 在 Arrow 和 Parquet 中序列化为 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-16master 版本。 #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函数不将键表达式包装在元组中。#26130 (Maksim Kita)。 - 实现了
AggregateFunction状态的bin/hex函数。#26094 (zhaoyu)。 - 支持
empty和notEmpty函数的UUID类型参数。如果UUID全为零(nil UUID),则UUID为空。关闭了 #3446。#25974 (zhaoyu)。 - 添加了对 MySQL 协议中
SET SQL_SELECT_LIMIT的支持。关闭了 #17115。#25972 (Kseniia Sumarokova)。 - 更多网络交互的检测:添加了接收/发送字节数的计数器;添加了接收/发送速率的仪表。添加了缺失的文档。关闭了 #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)。 - 支持配置文件中的多个 includes。可以从多个来源包含用户配置、远程服务器配置。只需放置带有
from_zk、from_env或incl属性的<include />元素,它将被替换为 substitution。#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 后出现重叠 part 的问题。#25884 (alesapin)。 - 更好地处理
ReplicatedMergeTree表的丢失 part。修复了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操作中,取消分区中已运行的 merges。解决了 #17151。#25684 (tavplubix)。 - 支持 MaterializeMySQL 的 ENUM` 数据类型。#25676 (Storozhuk Kostiantyn)。
- 支持 JOIN 中的 materialized 和 aliased 列,关闭了 #13274。#25634 (Vladimir C)。
- 修复了
ALTER TABLE ... DETACH和后台 merges 之间可能存在的逻辑竞争条件。#25605 (Azat Khuzhin)。 - 使
NetworkReceiveElapsedMicroseconds指标正确地包含等待客户端数据INSERT所花费的时间。关闭了 #9958。#25602 (alexey-milovidov)。 - 支持 S3 和 HDFS 的
TRUNCATE TABLE。关闭了 #25530。#25550 (Kseniia Sumarokova)。 - 支持动态重新加载配置以更改后台作业执行(merges、mutations、fetches)线程池中的线程数。#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)。
Bug 修复
- 修复了某些情况下不正确的
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). - 从
Date到DateTime(或DateTime64)的CAST未使用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)。 - 修复了带有
LowCarinality列的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). - 修复了将普通 projection 与
PREWHERE结合使用时可能出现的不匹配标头。修复了 #26020。#26038 (Amos Bird)。 - 修复了将带有整数键的
Map类型格式化为JSON的问题。#25982 (Anton Popov)。 - 修复了查询 profiler 堆栈展开期间可能发生的死锁。修复了 #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查询的罕见 bug,该 bug 可能导致错误消息Unexpected merged part intersecting drop range。#25783 (alesapin)。 - 修复了带有
GROUP BY表达式的TTL中的 bug,该 bug 拒绝在 part 中首次执行后执行TTL。#25743 (alesapin)。 - 允许 StorageMerge 访问带有别名的表。关闭了 #6051。#25694 (Kseniia Sumarokova)。
- 修复了某些情况下 dict join 速度慢的问题,关闭了 #24209。#25618 (Vladimir C)。
- 修复了参与 TTL 表达式的列的
ALTER MODIFY COLUMN。#25554 (Anton Popov)。 - 修复了带有非 UInt8 类型的
PREWHERE中的 assertion,关闭了 #19589。#25484 (Vladimir C)。 - 修复了一些模糊测试的 msan 崩溃。 修复了 #22517。 #26428 (Nikolai Kochetov).
- 更新了
clickhouse-serverdocker entrypoint 中的chowncmd 检查。它修复了 Kubernetes 上的错误 “cluster pod restart failed (or timeout)”。#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 中的 structs 和 maps 以及 Arrow 输入/输出格式中的 dictionaries。提供新的设置
output_format_arrow_low_cardinality_as_dictionary。#24341 (Kruglov Pavel)。 - 在 dictionaries 中添加了对
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 的
digestACL。#24448 (alesapin)。
性能提升
- 添加了优化,将某些函数转换为读取子列以减少读取数据量。例如,语句
col IS NULL被转换为读取子列col.null。可以通过设置optimize_functions_to_subcolumns启用优化,该设置目前默认为关闭。#24406 (Anton Popov)。 - 将更多列重写为可能的别名表达式。这可能会实现更好的优化,例如投影。#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 bridges 的资源约束和隔离。为 bridge 进程使用单独的
clickhouse-bridge组和用户。设置 oom_score_adj,以便 bridge 进程成为 OOM killer 的首要目标。设置最大 RSS 为 1 GiB。关闭 #23861。#25280 (Kseniia Sumarokova)。 - 添加独立的
clickhouse-keeper符号链接到主clickhouse二进制文件。现在可以在没有主 clickhouse 服务器的情况下运行协调服务。#24059 (alesapin)。 - 对
VIEW的查询使用全局设置。修复了对VIEW的查询使用本地设置的行为,如果CREATE VIEW和SELECT上的设置不同,则会导致错误。目前,VIEW将不会使用这些修改后的设置,但您仍然可以在CREATE VIEW查询的SETTINGS部分传递其他设置。关闭 #20551。#24095 (Vladimir)。 - 在服务器启动时,分区 ID 不正确的 parts 将永远不会被删除,而是始终被分离。#25070。#25166 (Nikolai Kochetov)。
- 将后台计划池的大小增加到 128(
background_schedule_pool_size设置)。它允许避免复制队列在缓慢的 zookeeper 连接上挂起。#25072 (alesapin)。 - 添加 merge tree 设置
max_parts_to_merge_at_once,限制一次可以在后台合并的 parts 数量。不影响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 表。从 dirname 中删除副本以用于 internal_replication=true(允许从任意数量的副本插入到 Distributed,以前仅支持 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)条件的分片。(支持具有多个元素的元组。具有单个元素的元组不起作用,因为它被解析为字面量)。#24930 (Amos Bird)。 - 改进了 S3 错误的日志消息,在空键和存储桶的情况下不再有双空格。#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下添加在失败时拆分分布式批处理的能力(例如,由于内存限制、损坏)(默认情况下为 OFF)。#23864 (Azat Khuzhin)。 - 处理
Join表引擎的列名冲突。关闭 #20309。#23769 (Vladimir)。 - 在
clickhouse-local中为File表引擎以及在clickhouse-client中当数据传递到 stdin 时显示进度。关闭 #18209。#23656 (Kseniia Sumarokova)。 clickhouse-copier的 Bug 修复和改进。允许复制具有不同(但兼容的 schema)的表。关闭 #9159。添加了复制 ReplacingMergeTree 的测试。关闭 #22711。支持列上的 TTL 和 Data Skipping Indices。它只是删除它们以创建内部 Distributed 表(底层表将具有 TTL 和跳过索引)。关闭 #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查询。需要此 hack,因为ALTER TABLE MOVE PARTITION被重试多次,而普通的 MergeTree 表没有去重。关闭 #17966。将进度以 JSON 格式写入 ZooKeeper 节点路径task_path + /status。关闭 #20955。支持没有参数的 ReplicatedTables。关闭 #24834 。#23518 (Nikita Mikhaylov)。- 添加了从 S3 读取重试之间的退避睡眠。#23461 (Vladimir Chebotarev)。
- 尊重
insert_allow_materialized_columns(允许物化列)用于 INSERT 到Distributed表。#23349 (Azat Khuzhin)。 - 添加为分布式查询下推 LIMIT 的能力。#23027 (Azat Khuzhin)。
- 修复具有多个 S3 卷的零拷贝复制(修复了 #22679)。#22864 (ianton-ru)。
- 解析用户从操作系统请求任何可用端口时绑定的实际端口号,以在日志消息中显示它。#25569 (bnaecker)。
- 修复了有时 postgres 数组的转换导致 String 数据类型而不是 n 维数组的情况,因为
attndims在某些情况下工作不正确。关闭 #24804。#25538 (Kseniia Sumarokova)。 - 修复 MySQL、PostgreSQL、ODBC 的带时区的 DateTime 转换。关闭 #5057。#25528 (Kseniia Sumarokova)。
- 区分不同表的 KILL MUTATION(修复了意外的
Cancelled mutating parts错误)。#25025 (Azat Khuzhin)。 - 允许在存储桶的根目录声明 S3 磁盘(S3 虚拟文件系统是一项正在开发的实验性功能)。#24898 (Vladimir Chebotarev)。
- 为分布式表启用读取子列(例如,Tuples 的组件)。#24472 (Anton Popov)。
- MySQL 兼容性协议的功能:使
user函数返回正确的输出。关闭 #25697。#25697 (sundyli)。
Bug 修复
- 向后兼容性改进。在分区键中使用时,使用旧的 modulo 函数版本。关闭 #23508。#24157 (Kseniia Sumarokova)。
- 修复低内存服务器上极少见的 Bug,该 Bug 可能导致无法在不重启的情况下执行合并。可能修复了 #24603。#24872 (alesapin)。
- 修复极少见的错误
Tagging already tagged part,该错误发生在并发alter move/replace partition期间的复制队列中。可能修复了 #22142。#24961 (alesapin)。 - 修复通过聚合其他聚合函数的聚合函数状态来计算聚合函数状态时可能发生的崩溃(不是实际用例)。请参阅 #24523。#25015 (alexey-milovidov)。
- 修复了查询
SYSTEM RESTART REPLICA或SYSTEM SYNC REPLICA未完成的行为。这在 RAM 极低的服务器上检测到。#24457 (Nikita Mikhaylov)。 - 修复可能导致 ZooKeeper 客户端在 clickhouse-server 内部挂起的 Bug。#24721 (alesapin)。
- 如果 ZooKeeper 连接丢失,并且副本在恢复连接后被克隆,则其复制队列可能包含过时的条目。修复了当复制队列包含相交的虚拟 parts 时发生的断言失败。如果某些数据 part 丢失,则可能很少发生这种情况。在日志中打印错误而不是终止。#24777 (tavplubix)。
- 修复了查询计划的表达式下推优化中丢失
WHERE条件的 Bug(默认情况下设置query_plan_filter_push_down = 1)。修复了 #25368。#25370 (Nikolai Kochetov)。 - 修复了可能导致具有 TTL 的合并后 parts 相交的 Bug:
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)。 - 修复了在 primary key 中使用数组的情况下,带有
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数据库引擎中的一个 Bug,该 Bug 可能会极少数情况下导致某些副本跳过排队的 DDL 查询。#24805 (tavplubix)。 - 修复了没有查询的
EXPLAIN AST中的空指针解引用。#25631 (Nikolai Kochetov)。 - 修复了等待自动删除空 parts 的问题。这可能导致后台池被完全填满,并且复制卡住。#23315 (Anton Popov)。
- 修复了恢复存储在 S3 虚拟文件系统中的表的问题(这是一个实验性功能,尚未准备好用于生产)。#25601 (ianton-ru)。
- 修复了使用
Decimal256时Arrow格式中的空指针解引用。为Arrow格式添加Decimal256支持。#25531 (Kruglov Pavel)。 - 修复了预处理配置文件名称前过多的下划线。#25431 (Vitaly Baranov)。
clickhouse-copier工具的修复:修复了当 copier 的任务配置中缺少 sharding_key 时发生的段错误。#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>(此 Bug 出现在 21.6 中)。修复了 #25187。#25290 (Nikolai Kochetov)。 - 修复了
joinGetOrNull与不可为空的列的错误行为。这修复了 #24261。#25288 (Amos Bird)。 - 修复了 big integer 中的错误行为和 UBSan 报告。在以前的版本中,
CAST(1e19 AS UInt128)返回零。#25279 (alexey-milovidov)。 - 修复了使用 CSVWithNames 格式插入列子集时发生的错误。修复了 #25129。#25169 (Nikita Mikhaylov)。
- 不要将表的 projection 用于带有
FINAL的SELECT。目前尚不支持。#25163 (Amos Bird)。 - 修复了在表在分区键中使用
UUID的情况下,更新到 21.5 后可能发生的 parts 丢失。(不建议在分区键中使用UUID)。修复了 #25070。#25127 (Nikolai Kochetov)。 - 修复了由于交叉连接和
joined_subquery_requires_alias = 0导致的查询崩溃问题。修复了 #24011。 #25082 (Nikolai Kochetov)。 - 修复了
mapContains函数中常量 map 导致错误empty column was returned by function mapContains的 bug。关闭了 #25077。 #25080 (Kruglov Pavel)。 - 移除了创建列引用自身的表的功能,例如
a UInt32 ALIAS a + 1或b UInt32 MATERIALIZED b。修复了 #24910, #24292。 #25059 (alesapin)。 - 修复了当使用非空
GROUP BY键的聚合 projection 执行GROUP BY空 键的查询时,结果错误的问题。 #25055 (Amos Bird)。 - 修复了 Protobuf 格式中拆分嵌套消息的序列化问题。此 PR 修复了 #24647。 #25000 (Vitaly Baranov)。
- 修复了分布式查询的 limit/offset 设置(在远程节点上忽略)。 #24940 (Azat Khuzhin)。
- 修复了
Arrow格式中可能发生的堆缓冲区溢出 (heap-buffer-overflow)。 #24922 (Kruglov Pavel)。 - 修复了从 DiskS3 读取文件时可能出现的错误 'Cannot read from istream at offset 0'(S3 虚拟文件系统是一项正在开发的实验性功能,不应在生产环境中使用)。 #24885 (Pavel Kovalenko)。
- 修复了连接分布式物化视图时 "Missing columns" 异常。 #24870 (Azat Khuzhin)。
- 允许在 postgresql 兼容协议中使用
NULL值。关闭了 #22622。 #24857 (Kseniia Sumarokova)。 - 修复了当 mutation 尚未加载到内存时,mutation 等待时可能向客户端抛出异常
Mutation was killed的 bug。 #24809 (alesapin)。 - 修复了随机生成器状态反序列化中的 bug,该 bug 可能导致某些数据类型(如
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 。此 bug 在 https://github.com/ClickHouse/ClickHouse/pull/5212 中引入,并在之后被更智能的分区修剪器 (partition pruner) 暴露出来。 #24446 (Amos Bird)。 - 当用户身份验证由 LDAP 管理时。修复了 LDAP 角色(重新)映射期间可能发生的潜在死锁,当 LDAP 组映射到不存在的本地角色时。 #24431 (Denis Glazachev)。
- 在 "multipart/form-data" 消息中,将边界前的 CRLF 视为其一部分。修复了 #23905。 #24399 (Ivan)。
- 修复了删除包含相交假部件 (intersect fake parts) 的分区。在极少数情况下,可能会出现 mutation 版本大于当前块号的部件。 #24321 (Amos Bird)。
- 修复了将物化视图从 Ordinary 数据库移动到 Atomic 数据库(
RENAME TABLE查询)的 bug。现在内部表与物化视图一起移动到新的数据库。修复了 #23926。 #24309 (tavplubix)。 - 允许空的 HTTP 标头。修复了 #23901。 #24285 (Ivan)。
- 更正了 Memory 表中 mutations (ALTER UPDATE/DELETE) 的处理。关闭了 #24274。 #24275 (flynn)。
- 使 JOIN 输出中的 LowCardinality 列属性与输入中的相同,关闭了 #23351, 关闭了 #20315。 #24061 (Vladimir)。
- 修复了 Kafka 表。修复了当 Engine = Kafka 在之前同一个消费者有空分配时无法启动消费的故障转移行为中的 bug。关闭了 #21118。 #21267 (filimonov)。
构建/测试/打包改进
- 在 CI 中添加
darwin-aarch64(Mac M1 / Apple Silicon) 构建 #25560 (Ivan) 并将链接放入文档和网站中 (alexey-milovidov)。 - 添加了将二进制资源跨平台嵌入到可执行文件中的功能。它在 Illumos 上工作。 #25146 (bnaecker)。
- 向压力测试添加 join 相关选项以改进模糊测试 (fuzzing)。 #25200 (Vladimir)。
- 在 osx 中启用 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 的 cast 运算符 (
::)。例如:[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)。 - 添加聚合函数
uniqTheta以支持 ClickHouse 中的 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(布尔值,默认禁用)。启用后,显示每个应用的索引的已用索引、已过滤的 parts 和 granules 数量。支持MergeTree*表。 #22352 (Nikolai Kochetov)。 - LDAP: 实现了用户 DN 检测功能,用于在将 Active Directory 组映射到 ClickHouse 角色时使用。 #22228 (Denis Glazachev)。
- 新的聚合函数
deltaSumTimestamp,用于在合并期间通过存储时间戳来对连续行之间的差异求和,同时保持排序。 #21888 (Russ Frank)。 - 为 S3 添加了不太安全的 IMDS 凭证提供程序,该程序在 docker 下可以正常工作。 #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(减少在查询具有大扇出的分布式表时使用的线程数)。 #23683 (Nikolai Kochetov)。
改进
- 为 MergeTree 表族添加
_partition_value虚拟列。它可以用于以确定性方式修剪分区。这是实现 mutations 的分区匹配器所必需的。 #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+ 添加了对单例质心 (singleton centroids) 的特殊处理。还修复了早期算法版本实现中质心过度压缩的 bug。 #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)。 - 启用
DateTime64作为ReplacingMergeTree中的版本列。 #23992 (kevin wan)。 - 在服务器启动时记录有关操作系统名称、内核版本和 CPU 架构的信息。 #23988 (Azat Khuzhin)。
- 支持为
postgresql字典源指定表 schema。关闭了 #23958。 #23980 (Kseniia Sumarokova)。 - 为
Enum元素名称添加提示(在拼写错误的情况下建议名称)。关闭了 #17112。 #23919 (flynn)。 - 测量字典的 found rate(找到值的百分比)(请参阅
system.dictionaries中的found_rate)。 #23916 (Azat Khuzhin)。 - 允许通过表设置
rabbitmq_queue_settings_list添加特定的队列设置。(关闭了 #23737 和 #23918)。允许用户控制所有 RabbitMQ 设置:如果表设置rabbitmq_queue_consume设置为1- RabbitMQ 表引擎将仅连接到指定的队列,并且不会执行任何 RabbitMQ 消费者端设置,例如声明 exchange、队列、bindings。(关闭了 #21757)。在 RabbitMQ 表被删除时添加正确的清理 - 删除表已声明的队列和所有绑定的 exchanges - 如果它们是由该表创建的。 #23887 (Kseniia Sumarokova)。 - 将
broken_data_files/broken_data_compressed_bytes添加到system.distribution_queue。为异步插入到分布式表的文件数添加指标,这些文件已被标记为损坏 (BrokenDistributedFilesToInsert)。 #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)。 - 支持
LowCardinality与join_use_nulls的可空性,关闭 #15101。 #23237 (vdimir)。 - 为
S3磁盘添加了将MergeTreeparts 恢复到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查询中使用元组的问题。 #24464 (Anton Popov)。 - 在
Kafka表中支持Parquet格式。 #23412 (Chao Ma)。
Bug 修复
- 当在分区键和主键中使用时,使用旧版本的 modulo 函数。关闭 #23508。 #24157 (Kseniia Sumarokova)。这是先前版本中向后不兼容的来源。
- 修复了无限期处理查询
SYSTEM RESTART REPLICA或SYSTEM SYNC REPLICA时的行为。这在 RAM 极少的服务器上检测到。 #24457 (Nikita Mikhaylov)。 - 修复了
toWeek函数的不正确单调性。修复了 #24422 。此错误在 #5212 中引入,后来被更智能的分区修剪器暴露出来。 #24446 (Amos Bird)。 - 修复了删除包含相交假部件 (intersect fake parts) 的分区。在极少数情况下,可能会出现 mutation 版本大于当前块号的部件。 #24321 (Amos Bird)。
- 修复了将物化视图从 Ordinary 数据库移动到 Atomic 数据库(
RENAME TABLE查询)的 bug。现在内部表与物化视图一起移动到新的数据库。修复了 #23926。 #24309 (tavplubix)。 - 允许客户端请求中的空 HTTP 标头。修复了 #23901。 #24285 (Ivan)。
- 设置
max_threads = 1以修复Memory表的 mutation 失败。关闭 #24274。 #24275 (flynn)。 - 修复了
Memory表实现中的拼写错误,此错误在 #15127 中引入。关闭 #24192。 #24193 (张中南)。 - 修复了由于
HDFS在查询执行期间变得不可访问而导致的服务器异常终止。关闭 #24117。 #24191 (Kseniia Sumarokova)。 - 修复了使用 const 条件更新
Nested列时的崩溃。 #24183 (hexiaoting)。 - 修复了在 RBAC 重负载下可能发生的竞争条件。此 PR 修复了 #24090, #24134,. #24176 (Vitaly Baranov)。
- 修复了一个罕见的错误,该错误可能导致部分初始化的表可以处理写入请求(insert/alter/等等)。现在,此类表将处于只读模式。 #24122 (alesapin)。
- 修复了一个问题:
EXPLAIN PIPELINE与SELECT xxx FINAL显示了错误的 pipeline。 (hexiaoting)。 - 修复了在
WHERE中使用 constDateTime值与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字典中存在重复项时 keys 指标的计数(导致DictCacheKeysRequestedMiss溢出)。 #23929 (Azat Khuzhin)。 - 修复了
PostgreSQL引擎的连接池实现。关闭 #23897。 #23909 (Kseniia Sumarokova)。 - 修复了
distributed_group_by_no_merge = 2与GROUP BY和包装在常规函数中的聚合函数(在 #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 读取时,堆使用后释放的问题。 #23761 (Kseniia Sumarokova)。 - 避免在 INSERT 到 Distributed 表时可能出现的 "Cannot schedule a task" 错误(在发生某些异常的情况下)。 #23744 (Azat Khuzhin)。
- 修复了 staled
ReplicatedMergeTree副本恢复中的一个错误。如果在副本停机期间执行了ALTER查询,则某些元数据更新可能会被 staled 副本忽略。 #23742 (tavplubix)。 - 修复了
Join和WITH TOTALS的一个错误,关闭 #17718。 #23549 (vdimir)。 - 修复了带有
UNION的查询可能发生的Block structure mismatch错误,这可能在 filter-pushdown 优化后发生。修复了 #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)。 - 避免可能对区域设置和文件系统顺序的构建依赖。这允许可重现的构建。 #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 上的结果不同),因此我们使比较更加精确。仅当整数在浮点类型中精确表示时,它才会将整数和浮点数视为相等。 #22595 (alexey-milovidov)。 - 删除对单个
Tuple参数的argMin和argMax的支持。该代码不是内存安全的。该功能是错误添加的,并且使人们感到困惑。这些函数可能会在以后以不同的名称重新引入。这修复了 #22384 并还原了 #17359。 #23393 (alexey-milovidov)。
新功能
- 添加了函数
dictGetChildren(dictionary, key)、dictGetDescendants(dictionary, key, level)。函数dictGetChildren返回所有子项作为索引数组。它是dictGetHierarchy的逆变换。函数dictGetDescendants返回所有后代,就像递归应用level次dictGetChildren一样。零level值等效于无穷大。改进了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)。 - 改进了从
ArrowStream输入格式读取非本地文件(例如 URL)源的性能。 #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)。
- 允许将更多条件移动到
PREWHERE,就像 21.1 版本之前一样(内部启发式的调整)。移动的条件数量不足可能会导致更差的性能。 #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)。 - 为非复制的 MergeTree 插入去重添加了新的设置
non_replicated_deduplication_window。 #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+ 添加了对单例质心 (singleton centroids) 的特殊处理。还修复了早期算法版本实现中质心过度压缩的 bug。 #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)。 - 当从 WHERE 条件中带有 NULL 的 MergeTree 表中选择时,在极少数情况下会抛出异常。这关闭了 #20019。 #22978 (alexey-milovidov)。
- 修复了 Poco HTTP Client for 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 平台上表现一致。使用四舍五入到最接近的偶数(银行家舍入)。 #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)。
- 支持动态 interserver 凭据(在不停机的情况下轮换凭据)。#14113 (johnskopis)。
- 添加了对使用
Arrow和ArrowStream格式消息的 Kafka 存储的支持。#23415 (Chao Ma)。 - 修复了异常消息中缺少分号的问题。用户可能会觉得这个异常消息难以阅读。#23208 (alexey-milovidov)。
- 修复了关于
LowCardinality类型的某些异常消息中缺少空格的问题。#23207 (alexey-milovidov)。 - 在
Markdown格式的表格单元格中,某些值使用了居中对齐格式。现在已修复。#23096 (alexey-milovidov)。 - 从 clickhouse-client 的建议中删除非必要的细节。这关闭了 #22158。 #23040 (alexey-milovidov)。
- 修正了 sparse_hashed 字典的 system.dictionaries 中
bytes_allocated字段的计算。#22867 (Azat Khuzhin)。 - 修复了从 MergeTree 反向读取时,近似总行数计算错误的问题。#22726 (Azat Khuzhin)。
- 修复了当字典配置了指向自身的 clickhouse 源时,可能导致无限循环的情况。关闭了 #14314。 #22479 (Maksim Kita)。
Bug 修复
- 针对对冲请求的多个修复。修复了当启用设置
use_hedged_requests时,带有GLOBAL IN/JOIN查询的错误Can't initialize pipeline with empty pipe。修复了 #23431。 #23805 (Nikolai Kochetov)。修复了对冲连接中的竞争条件,该条件会导致崩溃。这修复了 #22161。 #22443 (Kruglov Pavel)。修复了从远程查询接收到unknown packet时可能发生的崩溃(启用了async_socket_for_remote)。修复了 #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)。 - 避免在 INSERT 到 Distributed 表时可能出现的 "Cannot schedule a task" 错误(在发生某些异常的情况下)。 #23744 (Azat Khuzhin)。
- 在聚合函数
mannWhitneyUTest中,当两个样本中的值完全相同时,添加了一个异常。这修复了 #23646。 #23654 (Nikita Mikhaylov)。 - 修复了通过 HTTP 插入数据导致异常时,服务器故障的问题。这修复了 #23512。 #23643 (Nikita Mikhaylov)。
- 修复了对某些带有转义序列的
LIKE表达式的错误解释。#23610 (alexey-milovidov)。 - 修复了重启/停止命令挂起的问题。关闭了 #20214。 #23552 (filimonov)。
- 修复了在 select 查询中存在多个 JOIN 时,
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聚合函数在重置计数器后产生不正确结果的 bug。#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' 且 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)。
- 修复了如果在默认配置文件中启用了
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()对于大值和非零比例的问题。#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 查询可能在 mutation 实际在其他副本上执行之前完成。#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设置为零。旧版本中它为零。#22527 (alexey-milovidov)。 - 修复了 Merge Join 算法中
LowCardinality类型列的错误转换。关闭了 #22386,关闭了 #22388。 #22510 (Vladimir)。 - 在
tokenbf_v1全文索引中可能发生缓冲区溢出(读取时)。多余的字节未被使用,但在极少数情况下,读取操作可能导致崩溃。这关闭了 #19233。 #22421 (alexey-milovidov)。 - 不限制 HTTP chunk 大小。修复了 #21907。 #22322 (Ivan)。
- 修复了一个 bug,该 bug 导致在启用
optimize_aggregation_in_order和表中存在多个 parts 时,数据聚合不足。稍微提高了启用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)。 - 修复了由于重复数据删除,
quorum_parallel=1的仲裁插入实际上不是 "仲裁" 的极少数 bug。#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 上进行查询分析。请参阅 #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 rollup 配置中的
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。部件通过其校验和进行搜索和比较。#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返回所有后代,就像递归应用level次dictGetChildren一样。零level值等同于无穷大。关闭了 #14656。 #22096 (Maksim Kita)。 - 添加了
executable_pool字典源。关闭了 #14528。 #21321 (Maksim Kita)。 - 添加了表函数
dictionary。它的工作方式与Dictionary引擎相同。关闭了 #21560。 #21910 (Maksim Kita)。 - 支持
Nullable类型用于PolygonDictionary属性。#21890 (Maksim Kita)。 - 如果未使用 DDL 创建的字典指定当前数据库名称,则函数
dictGet、dictHas将使用当前数据库名称。关闭了 #21632。 #21859 (Maksim Kita)。 - 添加了函数
dictGetOrNull。它的工作方式类似于dictGet,但是在字典中找不到 key 时返回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。它指定了允许从该用户接收授权的用户或角色,条件是该用户还拥有所有必需的访问权限以及授权选项。默认情况下,使用GRANTEES ANY,这意味着具有授权选项的用户可以授予任何人。语法: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'。此命令用于正确地从所有磁盘中移除 “freezed” 分区。 #21142 (Pavel Kovalenko)。 - 支持 JOIN 的隐式键类型转换。 #19885 (Vladimir)。
实验性功能
- 为浮点类型支持
RANGE OFFSET帧(用于窗口函数)。实现lagInFrame/leadInFrame窗口函数,它们类似于lag/lead,但尊重窗口帧。当帧为between unbounded preceding and unbounded following时,它们是相同的。这关闭了 #5485。 #21895 (Alexander Kuzmenkov)。 ReplicatedMergeTree在 S3 存储上的零拷贝复制。 #16240 (ianton-ru)。- 增加了将现有的 S3 磁盘迁移到具有备份恢复功能模式的可能性。 #22070 (Pavel Kovalenko)。
性能提升
- 支持在
clickhouse-local和其他任何地方进行并行格式化。 #21630 (Nikita Mikhaylov)。 - 支持
CSVWithNames和TSVWithNames格式的并行解析。这关闭了 #21085。 #21149 (Nikita Mikhaylov)。 - 启用对 64 MiB 以上的文件范围使用 mmap IO 读取(设置
min_bytes_to_use_mmap_io)。这可能会带来适度的性能提升。 #22326 (alexey-milovidov)。 - 为使用
min_bytes_to_use_mmap_io设置读取的文件添加缓存。当设置值较小时,通过避免频繁的 mmap/munmap 调用和随之而来的页面错误,可以显著(2 倍以上)提高性能。请注意,mmap IO 存在主要缺点,使其在生产环境中不太可靠(例如,在有故障的磁盘上挂起或 SIGBUS;内存使用量更不可控)。然而,它在基准测试中表现良好。 #22206 (alexey-milovidov)。 - 避免在使用编解码器
NONE时进行不必要的数据复制。请注意,编解码器NONE几乎没用 - 建议始终使用压缩(默认情况下为LZ4)。尽管普遍认为禁用压缩可能会提高性能(但可能产生相反的效果)。NONE编解码器在某些情况下很有用:- 当数据不可压缩时;- 用于综合基准测试。 #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)。 - 修复了带有
UInt256参数的函数range的 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)。 - 在系统表中显示
EmbeddedRocksDB表的数据目录路径。 #21903 (tavplubix)。 - 添加 profile event
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 时创建空 part。修复了 #20304。 #20387 (Kruglov Pavel)。 MaterializeMySQL: 为_version列添加 minmax 跳数索引。 #20382 (Stig Bakken)。- 为
clickhouse-format添加选项--backslash,它可以在格式化查询的每一行末尾添加反斜杠。 #21494 (flynn)。 - 现在,当我们尝试 mutate 已经覆盖的 part 时,clickhouse 不会抛出
LOGICAL_ERROR异常。修复了 #22013。 #22291 (alesapin)。
Bug 修复
- 在
HedgedConnections中取消数据包接收器之前,从 epoll 中移除套接字,以防止可能的竞争。修复了 #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)。 - 修复了带有
TOTALS和arrayJoin的JOIN中的错误Invalid number of rows in Chunk。关闭了 #19303。 #22129 (Vladimir)。 - 修复了用于从 Kafka 轮询消息的后台线程池名称。具有损坏线程池的 Kafka 引擎将不会从消息队列中消费消息。 #22122 (fastio)。
- 修复了
ReplicatedMergeTree表引擎的OPTIMIZE和ALTER查询的等待。现在,当表被 detach 或重启时,查询不会挂起。 #22118 (alesapin)。 - 为有 bug 的 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而失败。此错误不允许 part 合并。 #21976 (Nikolai Kochetov)。 - 恢复了 #15454,这可能会导致加载哈希类型外部字典时内存使用量显著增加。这关闭了 #21935。 #21948 (Maksim Kita)。
- 防止对冲连接重叠(
Unknown packet 9 from server错误)。 #21941 (Azat Khuzhin)。 - 修复了在某些情况下读取带有 "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)。 - 修复了标量子查询索引分析。这修复了 #21717,该问题是在 #18896 中引入的。 #21766 (Amos Bird)。
- 修复了当
ALTER MODIFY COLUMN查询不更改Decimal列的类型(如果其大小(32 位或 64 位)未更改)时,ReplicatedMerge表引擎的错误。 #21728 (alesapin)。 - 修复了当对
ReplicatedMergeTree同时运行OPTIMIZE和DROP时可能发生的无限等待。 #21716 (Azat Khuzhin)。 - 修复了
arrayElement函数对于类型为Map的常量整数参数的错误。 #21699 (Anton Popov)。 - 修复了从
ip_trie中不存在的属性使用access_to_key_from_attributes时发生的 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)。 - 修复了安全套接字中的接收和发送超时以及非阻塞读取。 #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)。修复了关于内部 CMake 变量CMAKE_ASM_COMPILE_OBJECT未在ppc64le上设置的 CMake 错误。 #22469 (Kfir Itzhak)。修复了 Fedora/RHEL/CentOS 在ppc64le上找不到libclang_rt.builtins的问题。 #22458 (Kfir Itzhak)。启用在ppc64le上使用jemalloc进行构建。 #22447 (Kfir Itzhak)。修复了ppc64le上 ClickHouse 的配置嵌入和 cctz 的时区嵌入。 #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,方法是在使用时启用断言。 #21914 (alexey-milovidov)。
- 在 cmake 脚本中添加 llvm-12 二进制文件名称以进行搜索。 隐式常量转换以静音 clang 警告。 更新子模块以使用 CMake 3.19 构建。 静音
readpassphrase库中宏展开中的递归。 已弃用的-fuse-ld更改为 clang 的--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 表,因为它会被忽略。 仍然可以附加旧表。 #20282 (alesapin)。
- 现在所有不区分大小写的功能名称都将重写为其规范表示形式。 这是投影查询路由(即将推出的功能)所需要的。 #20174 (Amos Bird)。
- 修复在以下情况下创建
TTL的问题:其表达式是一个函数,并且它与ORDER BY键相同。 现在允许为TTL中GROUP BY的主键列设置自定义聚合。 向后不兼容:对于不在GROUP BY中且未显式设置的主键列,TTL 过期时,现在应用函数any而不是max。 此外,如果您将 TTL 与WHERE或GROUP BY一起使用,则在进行滚动更新时可能会看到异常。 #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 客户端中添加了服务器端加密客户密钥(
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告诉仅当查询至少读取此数量的标记时才应用先前的设置。 #19544 (Amos Bird)。 - 添加
file函数以从 user_files 目录中读取文件作为字符串。 这与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 时,并行化对级别 > 0 的单个 part 的 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 源的配置时,ClickHouse 现在将随机化具有相同优先级的副本列表,以确保选择 mysql 端点的轮询逻辑。 这关闭了 #20629。 #20632 (Alexander Kazakov)。
- 函数 'reinterpretAs(x, Type)' 重命名为 'reinterpret(x, Type)'。 #20611 (Maksim Kita)。
- 支持 RabbitMQ 引擎的 vhost #20576。 #20596 (Kseniia Sumarokova)。
- 改进了由数组和元组组合而成的数据类型的序列化。 改进了枚举数据类型与 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)。
- 支持位图函数中的所有本机整数类型。 #20171 (Amos Bird)。
- 更新了
CacheDictionary、ComplexCacheDictionary、SSDCacheDictionary、SSDComplexKeyDictionary以使用 LRUHashMap 作为底层索引。 #20164 (Maksim Kita)。 - 设置
access_management现在可以在启动时通过提供CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT进行配置,默认为禁用 (0),这是之前的值。 #20139 (Marquitos)。 - 修复了 DateTime64 的 toDateTime64(toDate()/toDateTime()) - 实现了 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_OPT_RECONNECT 选项的值现在可以通过 mysql 副本的配置部分中的“opt_reconnect”参数来控制。 #19998 (Alexander Kazakov)。
- 如果用户调用
JSONExtract函数并请求Float32类型,则允许不精确地转换为结果类型。 例如,JSON 中的数字0.1是双精度的,并且无法在 Float32 中表示,但用户仍然希望获得它。 以前的版本对于非 Nullable 类型返回 0,对于 Nullable 类型返回 NULL,以指示转换不精确。 该逻辑 100% 正确,但用户感到惊讶并导致疑问。 这关闭了 #13962。 #19960 (alexey-milovidov)。 - 如果块结构不匹配,则为插入到分布式表中的操作添加块结构转换。 #19947 (Azat Khuzhin)。
- 改进了
system.distributed_ddl_queue表。 将 MaxDDLEntryID 初始化为重启后的最后一个值。 在此 PR 之前,MaxDDLEntryID 将保持为零,直到处理新的 DDLTask。 #19924 (Amos Bird)。 - 在
system.parts中显示MaterializeMySQL表。 #19770 (Stig Bakken)。 - 为
Buffer配置文件添加单独的配置指令。 #19721 (Azat Khuzhin)。 - 将与 JOIN 无关的条件移动到 WHERE 子句。 #18720。 #19685 (hexiaoting)。
- 添加了根据异步发送的待处理字节数来限制 INSERT 到 Distributed 的能力(为
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)。
- 修复了从
Values格式插入到带有LowCardinality列的表时出现的错误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)进行突变。 其他引擎将报告更清晰的错误。 修复了 #21168。 #21183 (alesapin)。
- 修复了 #21112。 修复了可能导致插入查询重复的错误(如果其中一个回调来得太晚)。 #21138 (Kseniia Sumarokova)。
- 修复了当类型可为空时,
input_format_null_as_default生效的问题。 这修复了 #21116 。 #21121 (Amos Bird)。 - 修复了与将 Tuple 转换为 Map 相关的 bug。 关闭了 #21029。 #21120 (hexiaoting)。
- 修复了删除具有自定义(非默认)ZooKeeper 集群的 Replicated*MergeTree 时的元数据泄漏。 #21119 (fastio)。
- 修复了在 joinGet 中使用 LowCardinality 键时的类型不匹配问题。 这修复了 #21114。 #21117 (Amos Bird)。
- 修复了当引擎需要指定其他参数时,default_replica_path 和 default_replica_name 值在 Replicated(*)MergeTree 引擎上无用的问题。 #21060 (mxzlxy)。
- 当格式化类型为
DateTime64的特定制作的超出范围的值时,可能会发生越界内存访问。 这关闭了 #20494。 这关闭了 #20543。 #21023 (alexey-milovidov)。 - 阻止并行插入到存储连接中。 #21009 (vdimir)。
- 修复了
ALTER MODIFY COLUMN创建已知会失败的突变的行为。 #21007 (Anton Popov)。 - 关闭了 #9969。 修复了 Brotli http 压缩错误,该错误对于大数据量、稍微复杂的结构以及 json 输出格式重现。 将 Brotli 更新到最新版本,以包含“修复环形缓冲区中对未初始化数据的罕见访问”。 #20991 (Kseniia Sumarokova)。
- 修复了查询取消时的“从异步任务队列返回空任务”。 #20881 (Azat Khuzhin)。
- 使用 MySQL 5.7 客户端连接到 ClickHouse 服务器时,
USE database;查询不起作用,已修复。 修复了 #18926。 #20878 (tavplubix)。 - 修复了在聚合函数中使用带有
-State组合器的-Distinct组合器。 #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 的 const 时
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中的 Bug 修复。#20079 (vdimir)。- 修复了当计算负数除以小除数的模时,结果数据类型不足以容纳负数结果的情况。关闭了 #20052 问题。#20067 (alexey-milovidov)。
- MaterializeMySQL: 修复了更新多个表的语句的复制问题。#20066 (Håvard Kvålen)。
- 防止在 docker 初始化脚本执行期间出现 "Connection refused" 错误。#20012 (filimonov)。
EmbeddedRocksDB是一个实验性存储引擎。修复了缺少正确类型检查的问题。简化了代码。关闭了 #19967 问题。#19972 (alexey-milovidov)。- 修复了当参数类型为
Nullable(T)且 T 是 Int32 之外的任何整数类型时,函数fromModifiedJulianDay中的段错误。#19959 (PHO)。 - BloomFilter 索引崩溃修复。修复了 #19757 问题。#19884 (Maksim Kita)。
- 如果启用了 system.text_log,则可能发生死锁。修复了 #19874 问题。#19875 (alexey-milovidov)。
- 修复了启动服务器时,如果表具有包含 dictGet() 的默认表达式,则无法启动的问题。允许在不加载字典的情况下获取 dictGet() 的返回类型。#19805 (Vitaly Baranov)。
- 修复了仅执行
select时 clickhouse-client 发生的 abort 异常。#19790 (taiyang-li)。 - 修复了在启动多个 clickhouse-copiers 的情况下,将 pieces 移动到目标表可能失败的 Bug。#19743 (madianjun)。
- 执行
ON CLUSTER查询的后台线程可能会挂起,等待已删除的复制表执行某些操作。此问题已修复。#19684 (yiguolei)。
构建/测试/打包改进
- 允许全局启用 AVX-2 构建 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/merges 的内存跟踪;考虑了OPTIMIZE TABLE/merges 的查询内存限制和采样。#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 工作队列中的查询。#17656 (Bharat Nallan)。 - 添加了对 LDAP 组名称映射的支持,以及将属性值通常映射到来自 ldap 用户目录的用户的本地角色的支持。#17211 (Denis Glazachev)。
- 支持插入到表函数
cluster,并且对于表函数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.keys 是否包含第二个参数 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系统调用的次数,加快了 parts 的删除速度。这恢复了之前存在的优化。更安全的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 option 的支持,以更好地压缩字符串列,从而节省空间。#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 的 merges)。#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 parts(Wide/Compact/InMemory)类型添加了指标。#19381 (Azat Khuzhin)。
- 允许 docker 以任意 uid 执行。#19374 (filimonov)。
- 修复了 Pretty 格式中
IPv4数据类型的值的错误对齐。它们向右对齐,而不是向左对齐。关闭了 #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 entrypoint 的多项改进。#18954 (filimonov)。
- 添加了
normalizeQueryKeepNames和normalizedQueryHashKeepNames以规范化查询,而无需使用?掩盖长名称。这有助于更好地分析复杂的查询日志。#18910 (Amos Bird)。 - 在发送之前,检查发送方分布式批次的每个块的校验和(无需读取文件两次,校验和将在读取时验证),这将避免接收方 INSERT 卡住(在发送方截断的 .bin 文件上)。避免为批处理 INSERT 读取 .bin 文件两次(需要计算行/字节以考虑压缩,现在此信息包含在标头中,保留了向后兼容性)。#18853 (Azat Khuzhin)。
- 修复了带有聚合函数状态的表的 RIGHT 和 FULL JOIN 的问题。在以前的版本中,抛出了关于
cloneResized方法的异常。#18818 (templarzq)。 - 添加了基于前缀的 S3 endpoint 设置。#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)。- 修复了当参数类型为
Nullable(T)且 T 是 Int32 之外的任何整数类型时,函数fromModifiedJulianDay中的段错误。#19959 (PHO)。 - 函数
greatCircleAngle在之前的版本中返回了不准确的结果。此修复关闭了 #19769。 #19789 (alexey-milovidov)。 - 修复了在数据损坏后,某些复制操作(如 mutation)无法处理部分数据的罕见错误。修复了 #19593。 #19702 (alesapin)。
- 执行
ON CLUSTER查询的后台线程可能会挂起,等待已删除的复制表执行某些操作。此问题已修复。#19684 (yiguolei)。 - 修复了列描述的反序列化错误。这使得无法将数据 INSERT 到列名为
\的表中。 #19479 (alexey-milovidov)。 - 在其中一个文件中的数据块为空的情况下,将分布式批处理标记为损坏。 #19449 (Azat Khuzhin)。
- 修复了一个非常罕见的错误,该错误可能导致 mutation 在
DROP/DETACH/REPLACE/MOVE PARTITION后挂起。此问题在大多数情况下已通过 #15537 部分修复。 #19443 (tavplubix)。 - 修复了可能出现的错误
Extremes transform was already added to pipeline。修复了 #14100。 #19430 (Nikolai Kochetov)。 - 修复了具有非零默认值(例如某些枚举)的 join 类型中的默认值。关闭了 #18197。 #19360 (vdimir)。
- 不要将用于分布式发送的文件在 EOF 时标记为损坏。 #19290 (Azat Khuzhin)。
- 修复了
async_socket_for_remote的管道 fd 泄漏问题。 #19153 (Azat Khuzhin)。 - 修复了从
ORC格式文件无限读取的问题(在 #10580 中引入)。修复了 #19095。 #19134 (Nikolai Kochetov)。 - 修复了 merge tree 数据写入器中的问题,该问题可能导致标记的大小大于固定的粒度大小。修复了 #18913。 #19123 (alesapin)。
- 修复了 clickhouse 无法从
LowCardinality(Nullable(...))读取压缩编解码器并在启动时抛出异常Attempt to read after EOF的错误。修复了 #18340。 #19101 (alesapin)。 - 简化了
tupleHammingDistance的实现。支持任意相等长度的元组。修复了 #19029。 #19084 (Nikolai Kochetov)。 - 确保
groupUniqArray为 Enum 类型的参数返回正确的类型。此修复关闭了 #17875。 #19019 (alexey-milovidov)。 - 修复了如果将函数
ignore与LowCardinality参数一起使用,可能出现的错误Expected single dictionary argument for function。修复了 #14275。 #19016 (Nikolai Kochetov)。 - 修复了将
LowCardinality列插入到具有TinyLog引擎的表中的问题。修复了 #18629。 #19010 (Nikolai Kochetov)。 - 修复了 JOIN 中的一个小问题: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)。
- 修复了服务器内存不足时发生的罕见崩溃。 #18976 (tavplubix)。
- 修复了
ALTER TABLE ... DROP PART 'part_name'查询删除了整个分区的重复数据删除块的不正确行为。修复了 #18874。 #18969 (alesapin)。 - 修复了问题 #18894 添加了一个检查,以避免当长列别名('table.column' 样式,通常由 BI 工具(如 Looker)自动生成)等于长表名时发生异常。 #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 将重置 mutations。 #18804。 #18935 (fastio)。
- 修复了
bitmapOrCardinality中可能导致空指针解引用的问题。此修复关闭了 #18911。 #18912 (sundyli)。 - 修复了尝试将
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 发生的 abort 异常。#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函数中参数不足检查触发了地址清理器。 #19720 (alexey-milovidov)。- 移除集成测试中 docker-compose 的 --project-directory。修复了来自 docker 容器的日志格式。 #19706 (Ilya Yatsishin)。
- 使集成测试的 macros.xml 生成更容易。不再有来自 dicttoxml 的过度日志记录。dicttoxml 项目已 5 年以上未活跃。 #19697 (Ilya Yatsishin)。
- 允许通过环境变量
CLICKHOUSE_WATCHDOG_ENABLE显式启用或禁用 watchdog。默认情况下,如果服务器未连接到终端,则启用 watchdog。 #19522 (alexey-milovidov)。 - 允许在 arm64 上构建带有 Kafka 支持的 ClickHouse。 #19369 (filimonov)。
- 允许构建不带 ssl 的 librdkafka。 #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)。
- 修复了按大于 127 的 UInt8 值进行过滤的问题。 #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)。 - 修复了当并发
ALTER和DROP查询在处理 ReplicatedMergeTree 表时可能挂起的问题。 #19237 (alesapin)。 - 修复了使用
Template或CustomSeparated格式通过 http 接口插入数据时出现的There is no checkpoint错误。修复了 #19021。 #19072 (tavplubix)。 - 当无法计算子查询的结果时,在分析阶段禁用子查询的常量折叠。 #18446 (Azat Khuzhin)。
- Mutation 可能会在
MOVE或REPLACE PARTITION后,或者在极少数情况下,在DETACH或DROP PARTITION后挂起,等待某些不存在的 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更改影响数据 parts 的存储设置 (write_final_mark和enable_mixed_granularity_parts)。 #18306 (Amos Bird)。 - 默认将
insert_quorum_parallel设置为 1。它比 “sequential” quorum inserts 更方便使用。但是,如果您依赖顺序一致性,则应将此设置设置回零。 #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')。此更改的原因是toUUID(N)在 N 为非零值时结果不明显。 - 拒绝使用 “key usage” 不正确的 SSL 证书。在之前的版本中,它们可以正常工作。请参阅 #19262。
- 从默认配置 (
<remote_servers>,<zookeeper>,<macros>,<compression>,<networks>) 中移除了对替换文件 (/etc/metrika.xml) 的incl引用。如果您正在使用替换文件并依赖于那些隐式引用,则应在更新之前手动显式地将它们放回原处,方法是添加带有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 字典直接支持
IPv4/IPv6类型。 #17571 (vdimir)。 - IP 字典支持密钥获取。解决了 #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现在支持 SQL 兼容的POSITION(needle IN haystack)语法。 这关闭了 #18701。 ... #18779 (Jianmei Zhang)。 - 现在我们为 MergeTree 系列的表添加了一个新的存储设置
max_partitions_to_read。 它限制了单个查询中可以访问的最大分区数。 还添加了一个用户设置force_max_partition_limit来强制执行此约束。 #18712 (Amos Bird)。 - 为插入的 parts 在
system.part_log中添加query_id列。 关闭了 #10097。 #18644 (flynn)。 - 允许使用列规范创建表并进行选择。 示例:
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)。 - 支持内置函数
isIPv4String&&isIPv6String,类似于 MySQL。 #18349 (Du Chuan)。 - 添加一个新的设置
insert_distributed_one_random_shard = 1,以允许在没有分布式键的情况下插入到多分片分布式表。 #18294 (Amos Bird)。 - 为 MergeTreeSettings 添加设置
min_compress_block_size和max_compress_block_size,它们比全局设置具有更高的优先级,并在设置时生效。 关闭 13890。 #17867 (flynn)。 - 添加对 64 位 roaring bitmaps 的支持。 #17858 (Andy Yang)。
- 扩展了
OPTIMIZE ... DEDUPLICATE语法,以允许显式(或使用星号/列转换器隐式)指定要检查重复项的列列表。 ... #17846 (Vasily Nemkov)。 - 添加了函数
toModifiedJulianDay、fromModifiedJulianDay、toModifiedJulianDayOrNull和fromModifiedJulianDayOrNull。 这些函数在 Proleptic Gregorian 日历日期和 Modified Julian Day 编号之间进行转换。 #17750 (PHO)。 - 添加使用自定义 TLD 列表的功能:添加了函数
firstSignificantSubdomainCustom、cutToFirstSignificantSubdomainCustom。 #17748 (Azat Khuzhin)。 - 添加对
PROXYv1协议的支持,以包装原生 TCP 接口。 允许通过代理转发的 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 表中总行数、字节数和 parts 数的异步指标。 这修复了 #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 引擎的 MaterializedView 非常有用,也将有利于 projections。 #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-grams 和 shingles 的 minHash 和 simHash 的函数。 它们旨在用于半重复搜索。 还添加了函数
bitHammingDistance和tupleHammingDistance。 #7649 (flynn)。 - 添加新的数据类型
Map。 请参阅 #1841。 Map 的第一个版本仅支持String类型的键和值。 #15806 (hexiaoting)。 - 实现基于 ANTLR4 运行时并从 EBNF 语法生成的替代 SQL 解析器。 #11298 (Ivan)。
性能提升
- 新的 IP 字典实现,具有更低的内存消耗,在某些情况下提高了性能,并修复了错误。 #16804 (vdimir)。
- 用于数据导出的并行格式化。 #11617 (Nikita Mikhaylov)。
- LDAP 集成:在 LDAP 服务器连接配置中添加了
verification_cooldown参数,以允许在可配置的时间段内缓存成功的“bind”尝试。 #15988 (Denis Glazachev)。 - 为
clickhouse-local添加--no-system-table选项,以便在没有系统表的情况下运行。 这避免了DateLUT的初始化,而DateLUT的初始化可能会在启动时占用大量时间(数十毫秒)。 #18899 (alexey-milovidov)。 - 在
AggregateFunctionWindowFunnelData中用PODArrayWithStackMemory替换PODArray,以提高windowFunnel函数的性能。 #18817 (flynn)。 - 不要在同步 INSERT 到 Distributed 表时向分片发送空块。 这关闭了 #14571。 #18775 (alexey-milovidov)。
- 优化了 StorageMemory 的读取。 #18052 (Maksim Kita)。
- 使用 Dragonbox 算法进行浮点数到字符串的转换,而不是 ryu。 这显著提高了浮点数到字符串转换的性能。 #17831 (Maksim Kita)。
- 加速了
IPv6CIDRToRange的实现。 #17569 (vdimir)。 - 添加了
remerge_sort_lowered_memory_bytes_ratio设置(如果 remerge 后的内存使用量没有按此比率降低,则将禁用 remerge)。 #17539 (Azat Khuzhin)。 - 提高了在 PK 中使用 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)。 - 允许在列大小未知时,将
optimize_move_to_prewhere优化与紧凑 parts 一起使用。 #17330 (Anton Popov)。
改进
- 避免从具有
TinyLog或Log表引擎的表执行 INSERT SELECT 到自身时发生死锁。 这关闭了 #6802。 这关闭了 #18691。 这关闭了 #16812。 这关闭了 #14570。 #15260 (alexey-milovidov)。 - 支持
SHOW CREATE VIEW name语法,类似于 MySQL。 #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)。
- 异步 INSERT 到
Distributed表:添加了两个新设置(类似于 MergeTree 系列):-fsync_after_insert- 为每次插入执行 fsync。 将降低插入性能。 -fsync_directories- 在所有操作(写入、重命名等)之后,为临时目录(仅用于异步 INSERT)执行 fsync。 #18864 (Azat Khuzhin)。 SYSTEM KILL命令开始在 Docker 中工作。 这关闭了 #18847。 #18848 (alexey-milovidov)。- 在执行
FETCH PARTITION时扩展 zk 路径中的宏。 #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)。 - 为 merge tree 宽 parts 进行了更好的自适应粒度计算。 #18223 (alesapin)。
- 现在
clickhouse install可以在 Mac 上工作了。 问题在于此平台上没有 procfs。 #18201 (Nikita Mikhaylov)。 - 为
SHOW ...查询语法提供了更好的提示。 #18183 (Du Chuan)。 - Array 聚合
arrayMin、arrayMax、arraySum、arrayAvg支持Int128、Int256、UInt256。 #18147 (Maksim Kita)。 - 将
disk添加到 Set 和 Join 存储设置。 #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)。
- 检查系统日志表的引擎定义语法,以防止一些配置错误。 请注意,此语法检查不是语义上的,这意味着在创建表之前不会发现诸如不存在的列/表达式函数之类的错误。 #17739 (Du Chuan)。
- 如果 RabbitMQ 表初始化时没有连接,则删除异常抛出(它将在后台重新连接)。 #17709 (Kseniia Sumarokova)。
- 在 Buffer 刷新期间不要忽略服务器内存限制。 #17646 (Azat Khuzhin)。
- 切换到 RocksDB 的补丁版本(来自 ClickHouse-Extras)以修复 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)。 - 允许指定 TTL 以从 系统日志表 中删除旧条目,使用
config.xml中的<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)。
Bug Fix
- 修复服务器在极少数情况下可能停止接受连接的问题。 #17542 (Amos Bird, alexey-milovidov)。
- 修复了带有常量参数的二元函数的索引分析,这会导致错误的查询结果。修复了 #18364 问题。#18373 (Amos Bird)。
- 修复当索引比较的类型不同时,可能出现的错误索引分析。 这修复了 #17122。 #17145 (Amos Bird)。
- 在合并期间禁用使用 AIO 写入,因为它可能导致合并期间主键列的极少数数据损坏。 #18481 (alesapin)。
- 限制从宽 parts 合并到紧凑 parts。 在垂直合并的情况下,它会导致 parts 结果损坏。 #18381 (Anton Popov)。
- 修复在读取
MergeTree*时,如果发生读取退避(日志中显示消息<Debug> MergeTreeReadPool: Will lower number of threads),可能导致查询结果不完整的问题。 在 #16423 中引入。 修复了 #18137。 #18216 (Nikolai Kochetov)。 - 修复
rocksdb库中的 use-after-free 错误。 #18862 (sundyli)。 - 修复了从
ORC格式文件无限读取的问题(在 #10580 中引入)。修复了 #19095。 #19134 (Nikolai Kochetov)。 - 修复 merge tree 数据写入器中的一个错误,该错误可能导致 marks 的大小大于固定的粒度大小。 修复了 #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)。 - 修复了如果将函数
ignore与LowCardinality参数一起使用,可能出现的错误Expected single dictionary argument for function。修复了 #14275。 #19016 (Nikolai Kochetov)。 - 修复了将
LowCardinality列插入到具有TinyLog引擎的表中的问题。修复了 #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无法从可空字符串解析十进制数时,它将返回NULL。修复了 #7690。 #18718 (Winter Zhang)。 - 修复与日志记录相关的小问题。 #18717 (sundyli)。
- 修复删除使用旧语法创建的
ReplicatedMergeTree表中的空 parts。 修复了 #18582。 #18614 (Anton Popov)。 - 修复了之前日期溢出与不同值相关的错误。 严格限制 Date 值到 "2106-02-07",将 date > "2106-02-07" 转换为值 0。 #18565 (hexiaoting)。
- 为从 MySQL 复制添加 FixedString 数据类型支持。 从 MySQL 复制是一项实验性功能。 此补丁修复了 #18450,也修复了 #6556。 #18553 (awesomeleo)。
- 修复在使用
RIGHT或FULLjoin 的子查询后使用ORDER BY时,可能出现的Pipeline stuck错误。 #18550 (Nikolai Kochetov)。 - 修复可能导致在相应的 mutation kill 之后
ALTER查询挂起的错误。 由线程模糊器发现。 #18518 (alesapin)。 - 在
parseDateTimeBestEffort函数中正确支持 12AM。 这修复了 #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)。
- 当使用大于 2^32 的数值配置
logger.size参数时,服务器日志轮换配置不正确。 这已修复。 #17905 (Alexander Kuzmenkov)。 - 如果查询包含 ARRAY JOIN(因此查询实际上是非平凡的),则简单的查询优化会产生错误的结果。 #17887 (sundyli)。
- 修复
topK聚合函数中可能出现的段错误。 这关闭了 #17404。 #17845 (Maksim Kita)。 - WAL(实验性功能):如果禁用
in_memory_parts_enable_wal,则不从 WAL 恢复 parts。 #17802 (detailyang)。 - 关于要删除的最大表大小的异常消息显示不正确。 #17764 (alexey-milovidov)。
- 修复了当插入到
Distributed表时空间不足时可能发生的段错误。 #17737 (tavplubix)。 - 修复了 ClickHouse 无法恢复与 MySQL 服务器连接的问题。 #17681 (Alexander Kazakov)。
- Windows:修复了在 Windows 子系统 Linux 上运行的 ClickHouse 中,在
Atomic数据库中执行RENAME查询时出现的Function not implemented错误。 修复了 #17661。 #17664 (tavplubix)。 - 当
pool_size> 1 时,由于竞争条件,在执行ON CLUSTER查询时,可能无法正确确定集群是否为循环(交叉)复制。 这已修复。 #17640 (tavplubix)。 - 修复服务器在守护程序模式下运行时,
system.stack_trace表为空的问题。 #17630 (Amos Bird)。 fmt::v7::format_error异常可能会在后台为 MergeTree 表记录。 这修复了 #17613。 #17615 (alexey-milovidov)。- 当 clickhouse-client 在交互模式下与多行查询一起使用时,单行注释错误地扩展到查询的末尾。 这修复了 #13654。 #17565 (alexey-milovidov)。
- 修复当在不同的副本上 kill 相应的 mutation 时,alter 查询挂起的问题。 修复了 #16953。 #17499 (alesapin)。
- 修复当 mark 缓存大小被 clickhouse 低估时的内存记帐问题。 当有许多带有 marks 的微小文件时,可能会发生这种情况。 #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 语句不匹配的 header。 #17366 (Winter Zhang)。
- 修复了带有谓词优化器的非确定性函数。 这修复了 #17244。 #17273 (Winter Zhang)。
- 修复了对于带有
LIMIT的分布式查询,可能出现的Unexpected packet Data received from client错误。 #17254 (Azat Khuzhin)。 - 修复当子查询中存在 const 列时,set 索引失效的问题。 这修复了 #17246。 #17249 (Amos Bird)。
- clickhouse-copier:修复非分区表的问题 #15235。 #17248 (Qi Chen)。
- 修复了存储在 S3 磁盘上的 parts 的 mutation 可能无法工作的问题(实验性功能)。 #17227 (Pavel Kovalenko)。
- funciton
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)。
- 修复了不同比例的
DateTime64类型的错误比较。 修复了 #16655 ... #16952 (Vasily Nemkov)。 - 修复了启用设置
optimize_aggregators_of_group_by_keys和 joins 的 group by 优化。 修复了 #12604。 #16951 (Anton Popov)。 - SHOW ACCESS 查询中的小修复。 #16866 (tavplubix)。
- 修复了启用
optimize_trivial_count_query设置和分区谓词的行为。 #16767 (Azat Khuzhin)。 - 为通过 MySQL wire 协议的 INSERT 查询返回受影响的行数。 以前 ClickHouse 总是返回 0,现在已修复。 修复了 #16605。 #16715 (Winter Zhang)。
- 修复了针对优化的简单计数查询和系统表的
select_sequential_consistency导致的不一致行为。 #16309 (Hao Chen)。 - 当
REPLACE列转换器对不存在的列进行操作时抛出错误。 #16183 (hexiaoting)。 - 在 RIGH|FULL JOIN 中,如果 ON 表达式不是等值 join,则抛出异常。 #15162 (Artem Zuikov)。
构建/测试/打包改进
- 为 ClickHouse 二进制文件添加简单的完整性检查。 它允许检测由于硬件故障(存储介质上的位腐烂或 RAM 中的位翻转)导致的损坏。 #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)中死列表 watches 的移除问题。 #18065 (alesapin)。
- 为故障注入添加了
SYSTEM SUSPEND命令。它可以用于方便地进行故障转移测试。 这关闭了 #15979。 #18850 (alexey-milovidov)。 - 当 ClickHouse 与
lld链接时,生成 build id。 事实证明,在我的机器上,lld默认不生成 build id。 Build id 用于崩溃报告和内省。 #18808 (alexey-milovidov)。 - 修复了样式检查中的 shellcheck 错误。 #18566 (Ilya Yatsishin)。
- 将时区信息更新到 2020e。 #18531 (alesapin)。
- 修复 codespell 警告。 将样式检查拆分为单独的部分。 更新样式检查 docker 镜像。 #18463 (Ilya Yatsishin)。
- docs 中冲突标记残留的自动化检查。 #18332 (alexey-milovidov)。
- 为无状态测试 flaky check 启用 Thread Fuzzer。 #18299 (alesapin)。
- 不要使用非线程安全函数
strerror。 #18204 (alexey-milovidov)。 - 更新
anchore/scan-action@mainworkflow action(已从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函数替换为将终止进程的陷阱。 #16366 (alexey-milovidov)。 - 在服务器日志中提供堆栈溢出的诊断信息,并将错误消息发送到 clickhouse-client。 这关闭了 #14840。 #16346 (alexey-milovidov)。
- 现在我们可以并行运行几乎所有无状态功能测试。 #15236 (alesapin)。
- 修复了
librdkafkasnappy 解压缩中的损坏问题(仅在 gcc10 构建中出现问题,但官方构建已经使用 clang,因此至少最近的官方版本不受影响)。 #18053 (Azat Khuzhin)。 - 如果服务器被 OOM killer 终止,则在日志中打印消息。 #13516 (alexey-milovidov)。
- PODArray:避免调用带有 (nullptr, 0) 参数的 memcpy(修复 UBSan 报告)。 这修复了 #18525。 #18526 (alexey-milovidov)。
- DDLWorker 内部 zookeeper 路径的路径连接的微小改进。 #17767 (Bharat Nallan)。
- 允许从 debug 文件重新加载符号。 此 PR 还修复了一个 build-id 问题。 #17637 (Amos Bird)。