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

2021 更新日志

ClickHouse 发布 v21.12,2021-12-15

向后不兼容的变更

  • 修复此前一个行为不符合预期的功能。 不再允许对 Kafka/RabbitMQ/FileLog 进行直接查询(direct select)。可以通过设置 stream_like_engine_allow_direct_select 来启用。即使通过该设置启用了直接查询,如果存在挂载的物化视图,仍不允许直接查询。对于 Kafka 和 RabbitMQ,直接查询(如果被允许)默认不会提交消息。要在直接查询时启用提交,用户必须使用存储级别设置 kafka{rabbitmq}_commit_on_select=1(默认值为 0)。#31053Kseniia Sumarokova)。
  • 对一个新函数的行为进行轻微变更。 在 JSON_VALUE 中返回未加引号的字符串。修复 #27965#31008Kseniia Sumarokova)。
  • 设置项重命名。 为 TSV/CSV 输入格式添加自定义 null 表示形式的支持。修复在 TSV/CSV/JSONCompactStringsEachRow/JSONStringsEachRow 输入格式中反序列化 Nullable(String) 的问题。将 output_format_csv_null_representationoutput_format_tsv_null_representation 分别重命名为 format_csv_null_representationformat_tsv_null_representation#30497Kruglov Pavel)。
  • 进一步废弃已经未使用的代码。 仅与仍在使用 20.6 之前版本 ClickHouse 的用户相关。从 ReplicatedMergeTree 中移除了“leader 选举”机制,因为自 20.6 起已支持多个 leader。如果你是从更早的版本升级,并且某个旧版本副本当前是 leader,那么在升级后该服务器将无法启动。请先停止旧版本的副本以便新版本能够启动。之后将无法再降级到 20.6 之前的版本。#32140tavplubix)。

新功能

  • 在 clickhouse-keeper 中实现了更多 ZooKeeper “Four Letter Words” 命令: https://zookeeper.apache.org/doc/r3.4.8/zookeeperAdmin.html#sc_zkCommands#28981JackyWoo)。现在 clickhouse-keeper 的功能已全部实现。
  • 支持 Bool 数据类型。#31072 (kevin wan)。
  • 在 File、URL 和 HDFS 存储以及 INSERT INTO 表函数中支持 PARTITION BY。修复 #30273#30690Kseniia Sumarokova)。
  • 添加了 CONSTRAINT ... ASSUME ...(在 INSERT 期间不会检查约束)。添加了将查询转换为 CNF 形式(https://github.com/ClickHouse/ClickHouse/issues/11749),以便更方便地进行优化。添加了基于约束的简单查询改写(目前仅支持简单匹配,后续将改进以支持 <,=,> 等)。在可能的情况下,添加了用轻量级列替换重量级列的功能。#18787Nikita Vasilev)。
  • http/url 函数提供基本身份验证。#31648 (michael1589)。
  • WITH FILL 修饰符的 STEP 子句中支持使用 INTERVAL 类型。 #30927 (Anton Popov)。
  • FROM INFILE 子句中增加对从多个文件并行读取以及使用 glob 通配符的支持。 #30135 (Filatenkov Artur)。
  • Identifier 表和数据库查询参数提供支持。解决 #27226#28668 (Nikolay Degterinsky)。
  • TLDR:大幅提升各文本格式的完备性与一致性。 重构 TSVTSVRawCSV 以及 JSONCompactEachRowJSONCompactStringsEachRow 格式,去除代码重复,为带有 -WithNames-WithNamesAndTypes 后缀的格式新增基础接口。新增 CSVWithNamesAndTypesTSVRawWithNamesTSVRawWithNamesAndTypesJSONCompactEachRowWIthNamesJSONCompactStringsEachRowWIthNamesRowBinaryWithNames 格式。为 TSVWithNamesAndTypesTSVRaw(WithNames/WIthNamesAndTypes)CSVWithNamesAndTypesJSONCompactEachRow(WithNames/WIthNamesAndTypes)JSONCompactStringsEachRow(WithNames/WIthNamesAndTypes) 等格式添加并行解析支持。为 RowBinaryWithNamesAndTypes 格式增加列映射与类型检查支持。新增 input_format_with_types_use_header 设置,用于指定是否需要检查 <format_name>WIthNamesAndTypes 格式中写入的类型是否与表结构匹配。新增 input_format_csv_empty_as_default 设置,并在 CSV 格式中用它替代 input_format_defaults_for_omitted_fields(因为后者不应控制 csv_empty_as_default)。修正 input_format_defaults_for_omitted_fields 的使用方式(之前它只被当作 csv_empty_as_default 使用,但实际上应控制对被省略字段的默认表达式计算)。修复 TSVRaw 格式中的 Nullable 输入/输出问题,使该格式与向 TSV 插入时完全兼容。在启用 input_format_null_as_default 时,修复 LowCardinality(Nullable) 中插入 NULL 的问题(之前会插入默认值而非实际的 NULL)。修复 JSONStringsEachRow/JSONCompactStringsEachRow 格式中的字符串反序列化问题(字符串此前只会解析到首个 '\n' 或 '\t' 为止)。为 Template 输入格式添加使用 Raw 转义规则的能力。为 JSONCompactEachRow(WithNames/WIthNamesAndTypes) 输入格式增加诊断信息。修复在 min_chunk_bytes_for_parallel_parsing 小于单行字节数时,对 -WithNames 格式进行并行解析的 bug。#30178Kruglov Pavel)。允许在 CustomSeparated 输入/输出格式中输出/解析列名和类型。新增 CustomSeparatedWithNames/WithNamesAndTypes 格式,类似于 TSVWithNames/WithNamesAndTypes#31434Kruglov Pavel)。
  • 支持阿里云 OSS 存储。#31286 (cfcz48)。
  • 在配置文件中开放全局线程池的所有设置。 #31285 (Tomáš Hromada)。
  • 引入了窗口函数 exponentialTimeDecayedSumexponentialTimeDecayedMaxexponentialTimeDecayedCountexponentialTimeDecayedAvg,在较大的窗口下它们比 exponentialMovingAverage 更高效,同时也支持了更多使用场景。#29799Vladimir Chebotarev)。
  • 新增选项,可在将日志写入文件之前使用 LZ4 进行压缩。关闭了 #23860#29219Nikolay Degterinsky)。
  • 支持具有 CROSS JOIN 语义的 JOIN ON 1 = 1 写法。修复了 #25578#25894Vladimir C)。
  • Map 类型添加 Map 组合器。将用于映射数组的旧 sum-, min-, max- Map 重命名为 sum-, min-, max- MappedArrays#24539 (Ildus Kurbangaliev).
  • 使通过 HTTP 进行的读取操作可重试。修复 #29696#29894 (Kseniia Sumarokova).

实验性特性

  • 在 ClickHouse 中通过 WINDOW VIEW 启用流式处理。#8331 (vxider)。
  • 移除在 MaterializedMySQL 中使用 Ordinary 数据库的支持。#31292 (Stig Bakken)。
  • 为 Log 系列表引擎实现 BACKUPRESTORE 命令。该功能仍在开发中。#30688 (Vitaly Baranov)。

性能改进

  • 在使用 ParquetORCArrow 格式通过 s3 / url / hdfs 读取时减少内存占用(由设置 input_format_allow_seeks 控制,默认启用)。同时新增设置 remote_read_min_bytes_for_seek 用于控制随机访问(seek)。解决 #10461。解决 #16857#30936 (Kseniia Sumarokova).
  • 为 JOIN ON 中的常量条件添加优化,参考 #26928#27021 (Vladimir C).
  • 为除 JSONEachRowWithProgressPrettyCompactMonoBlock 之外的所有文本格式提供并行格式化支持。#31489 (Kruglov Pavel).
  • 加速对可空列的 count 计算。#31806 (Raúl Marín).
  • 加速聚合函数 avgsumCount#31694 (Raúl Marín).
  • 提升 JSON 和 XML 输出格式的性能。#31673 (alexey-milovidov).
  • 改进将数据同步到块设备时的性能。解决 #31181#31229 (zhanglistar).
  • 修复 LiveView 表中的查询性能问题。修复 #30831#31006 (vzakaznikov).
  • 加速查询解析。#31949 (Raúl Marín).
  • 允许为普通/带标签的指标拆分 GraphiteMergeTree 汇总规则(可选字段 rule_type)。#25122 (Michail Safronov).
  • 移除对 remote() 的多余 DESC TABLE 请求(在 remote('127.1', system.one) 这种情况下(即使用标识符作为 db.table 而不是字符串)会产生多余的 DESC TABLE 请求)。#32019 (Azat Khuzhin).
  • 在启用设置 optimize_functions_to_subcolumns 时,将函数 tupleElement 优化为读取子列。#31261 (Anton Popov).
  • 在启用设置 optimize_functions_to_subcolumns 时,将函数 mapContains 优化为读取子列 key#31218 (Anton Popov).
  • 新增设置 merge_tree_min_rows_for_concurrent_read_for_remote_filesystemmerge_tree_min_bytes_for_concurrent_read_for_remote_filesystem#30970 (Kseniia Sumarokova).
  • StorageMergeTree 中跳过对不同分区的 mutation 操作。#21326 (Vladimir Chebotarev).

改进

  • 若有其他表或字典依赖于某个表或字典,则禁止删除该表或字典。 #30977 (tavplubix).
  • 允许对聚合函数状态进行版本管理。现在我们可以在聚合函数状态的序列化格式中引入向后兼容的变更。修复了 #12552#24820Kseniia Sumarokova)。
  • 支持 PostgreSQL 风格 ALTER MODIFY COLUMN 语法。#32003 (SuperDJY)。
  • RangeHashedDictionaryComplexKeyRangeHashedDictionary 添加对 update_field 的支持。 #32185 (Maksim Kita).
  • murmurHash3_128sipHash128 函数现在可以接受任意数量的参数。这解决了问题 #28774#28965小路)。
  • HDFS 存储添加默认表达式支持,并在源为列式格式时优化数据读取。#32256 (李扬)。
  • 优化 OpenTelemetry span 的操作名称。#32234Frank Chen)。
  • 对于输出格式 JSONEachRow 使用 Content-Type: application/x-ndjsonhttp://ndjson.org/)。#32223Dmitriy Dorofeev)。
  • 改进了在 Template/CustomSeparated 格式中基于带引号转义规则跳过未知字段的行为。此前只能跳过带引号的字符串,现在可以跳过任意类型的值。#32204Kruglov Pavel)。
  • 现在,当配置中包含重复的 ID 或端点时,clickhouse-keeper 将拒绝启动或应用配置更改。修复了 #31339#32121alesapin)。
  • 在由 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).
  • 允许用户为 DiskHDFSStorageHDFS 配置 hdfs_replication 参数。解决 #32039#32049leosunli)。
  • 将 ClickHouse 的 exceptionexception_code 字段添加到 OpenTelemetry span 的日志中。#32040 (Frank Chen).
  • 改进 OpenTelemetry span 日志的持续时间计算——如果查询发生异常,在查询级别的持续时间会被记为 0。 #32038 (Frank Chen).
  • 修复无法创建 Int256 类型的 LowCardinality 的问题。#31832alexey-milovidov)。
  • 如果 engine/partition_by 不同,则重新创建 system.*_log 表。 #31824 (Azat Khuzhin).
  • MaterializedMySQL:修复对名为 'table' 的表的处理问题。#31781 (Håvard Kvålen)。
  • ClickHouse 字典源:支持预定义连接。修复 #31705 问题。#31749Kseniia 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#31557Vitaly Baranov)。
  • ReplicatedMergeTree 参数中展开宏时,如果这些宏未在配置中定义,则使用 Replicated 数据库参数中的分片和副本名称。修复 #31471#31488tavplubix)。
  • 改进了对 min/max/count 投影的分析。现在,在启用 allow_experimental_projection_optimization 时,虚拟 min/max/count 投影可以与分区键中的列一起使用。#31474Amos Bird)。
  • clickhouse-local 添加 --pager 支持。 #31457 (Azat Khuzhin).
  • 修复在交互式查询编辑时编辑器阻塞等待的问题(waitpid() 在收到 SIGWINCH 时返回 -1,且 EDITORclickhouse-local/clickhouse-client 同时运行)。 #31456 (Azat Khuzhin).
  • 如果在 JSONCompactStrings(EachRow) 格式中字段之后存在多余数据,则抛出异常。 #31455 (Kruglov Pavel).
  • http_send_timeouthttp_receive_timeout 设置的默认值从 1800(30 分钟)修改为 180(3 分钟)。#31450 (tavplubix)。
  • MaterializedMySQL 现在可以处理 CREATE TABLE ... LIKE ... DDL 查询。#31410Stig Bakken)。
  • 在对 system 表执行 show create table 时返回模拟生成的 CREATE 查询语句。 #31391 (SuperDJY).
  • 此前仅 numbers 表函数会显示进度,现在 numbers_mt 也会显示进度了。#31318 (Kseniia Sumarokova)。
  • 现在会使用用户的初始角色来确定适用的行策略,参见 #31080#31262Vitaly Baranov)。
  • 如果修改了某个已废弃的设置,则在 system.warnings 中显示警告。#31252 (tavplubix)。
  • 改进了 MergeTree 中用于后台清理任务的退避机制。设置项 merge_tree_clear_old_temporary_directories_interval_secondsmerge_tree_clear_old_parts_interval_seconds 从用户设置中移动到了 MergeTree 设置中。#31180 (tavplubix)。
  • 现在,每个副本只会向客户端发送 profile events 计数器的增量信息。#31155 (Dmitry Novik)。这使得 clickhouse-client 中的 --hardware_utilization 选项变得可用。
  • 默认启用 clickhouse-client 的多行编辑功能。该改动修复了 #31121#31123Amos Bird)。
  • ALTER 查询中的函数名进行规范化处理。这有助于避免在使用索引/投影创建表与通过 ALTER 命令添加索引/投影之间出现元数据不匹配。这是对 https://github.com/ClickHouse/ClickHouse/pull/20174 的后续 PR。由于目前没有相关缺陷报告且该场景相对少见,将其标记为改进项。#31095Amos Bird)。
  • RENAME DATABASE/TABLE/DICTIONARY 查询添加对 IF EXISTS 修饰符的支持。当使用该修饰符时,如果要重命名的 DATABASE/TABLE/DICTIONARY 不存在,将不会报错。#31081 (victorgao)。
  • 在删除分区时取消垂直合并。这是对 https://github.com/ClickHouse/ClickHouse/pull/25684https://github.com/ClickHouse/ClickHouse/pull/30996 的后续工作。#31057Amos Bird)。
  • ClickHouse 字典源内部的本地会话将不再把其事件发送到会话日志。这修复了在关闭时可能发生的死锁问题(tsan 报警)。此外,此 PR 还修复了不稳定的 test_dictionaries_dependency_xml/#31013 (Vitaly Baranov).
  • 减少 ALTER 命令中的锁定。#31010 (Amos Bird).
  • 修复 clickhouse-local 交互模式中的 --verbose 选项,并支持将日志写入文件。#30881 (Kseniia Sumarokova).
  • clickhouse-client 中新增了 \l\d\c 命令,类似于 MySQL 和 PostgreSQL 中的对应命令。#30876 (Pavel Medvedev)。
  • 对于 clickhouse-local 或 clickhouse-client:如果在使用 --query--queries-file 时同时指定了 --interactive 选项,则先按非交互模式执行这些查询,然后再进入交互模式。#30851 (Kseniia Sumarokova)。
  • 修复可能出现的“The local set of parts of X doesn't look like the set of parts in ZooKeeper”错误(当在 ZooKeeper 中删除 znode 时 DROP 操作失败的情况)。#30826 (Azat Khuzhin).
  • Avro 格式现已支持 Kafka。已添加 output_format_avro_rows_in_file 设置。#30351 (Ilya Golshtein).
  • 允许为单个 MaterializedPostgreSQL 数据库指定一个或多个 PostgreSQL 模式。修复了 #28901。修复了 #29324#28933Kseniia Sumarokova)。
  • 将 clickhouse-keeper 内部通信使用的默认端口从 44444 更改为 9234。修复了 #30879#31799alesapin)。
  • 实现支持 Decimal 参数的 transform 函数。 #31839 (李帅).
  • 通过增加对 HDFS URL 结构的额外检查,在 HDFS URL 非法时,修复了调试服务器中的异常中止问题以及发布服务器中的 DB::Exception: std::out_of_range: basic_string 错误。#31042 (Kruglov Pavel)。
  • 修复 hdfs 表函数/引擎中潜在的断言问题,并添加测试。#31036 (Kruglov Pavel).

缺陷修复

  • 修复在启用位置参数时 group by / order by / limit by 中的别名解析问题。关闭 #31173#31741Kseniia Sumarokova)。
  • 修复在包含 Map 类型的表中使用 Buffer 表引擎时的问题。修复了 #30546#31742Anton Popov)。
  • 修复在启用 use_uncompressed_cache 时从 MergeTree 表读取数据的问题。#31826 (Anton Popov).
  • 修复了在启用设置 empty_result_for_aggregation_by_empty_set 时,无需执行任何操作的 mutation 会卡住的问题。 #32358 (Nikita Mikhaylov).
  • 修复在写入 protobuf 时跳过列的问题。此 PR 修复了 #31160,参见评论 #31160#issuecomment-980595318。#31988Vitaly Baranov)。
  • 修复在子查询中删除不需要的列时的 bug。如果在查询中存在不带 GROUP BY 的聚合函数,即使该聚合函数被认为是不需要的,也不要删除。#32289 (dongyifeng).
  • 配额尚未用尽,却被视为已超出限制。此 PR 修复了 #31174#31337sunny)。
  • 在使用部分撤销权限时修复 SHOW GRANTS 的行为。此 PR 修复了 #31138#31249Vitaly Baranov)。
  • 当 ClickHouse 在具有 cgroup 限制的容器中运行时,内存大小被错误估计。#31157 (Pavel Medvedev)。
  • 修复当默认表达式的数据类型与列的数据类型不一致时的 ALTER ... MATERIALIZE COLUMN ... 查询。#32348Anton Popov)。
  • 修复了在聚合函数 avgWeighted 中使用 Decimal 参数时导致的 SIGFPE 崩溃。修复了 #32053#32303tavplubix)。
  • 如果 Dictionary 表引用了与其同名的 XML 字典,服务器在启动时可能会因报错 Cannot attach 1 tables due to cyclic dependencies 而启动失败,该问题已修复。修复 #31315#32288tavplubix)。
  • 修复在使用 Quoted 转义规则对 Nullable(Float) 反序列化 NaN 时的解析错误。#32190 (Kruglov Pavel)。
  • XML 字典:在创建表查询中使用的标识符,在升级到新版本时可以限定为 default_database。解决了 #31963#32187Maksim Kita)。
  • 在使用 quorum 插入时,如果在某些副本上禁用了 replicated_can_become_leader 设置,活动副本的数量可能会被错误计算。该问题已修复。 #32157 (tavplubix)。
  • Dictionaries: 修复在自定义数据库查询中 {condition} 不生效的问题。#32117 (Maksim Kita)。
  • 修复在使用 cast_keep_nullableNullable 进行 CAST 时的问题(此前在例如 toUInt32OrDefault(toNullable(toUInt32(1))) 的情况下会触发 PARAMETER_OUT_OF_BOUND 错误)。 #32080 (Azat Khuzhin).
  • 在某些罕见场景下修复 Join Storage 的 CREATE TABLE 行为。关闭 #31680#32066 (SuperDJY)。
  • 修复在分离 part 时出现的 Directory ... already exists and is not empty 错误。#32063tavplubix)。
  • MaterializedMySQL(实验特性):修复从 MySQL 读取 DECIMAL 数据时的错误解析问题。#31990Håvard Kvålen)。
  • FileLog(实验特性)引擎在创建表失败时会不必要地创建元数据目录。修复 #31962#31967flynn)。
  • 如果某个 GET_PART 条目对应的 part 在所有副本上都丢失,并且同一分区中没有其他 part,那么该条目可能会挂起在复制队列中。在分区键仅由整数类型或 Date[Time] 类型的列组成的情况下,该问题已被修复。修复了 #31485#31887tavplubix)。
  • 修复 UUID 类型参数下的 emptynotEmpty 函数问题。修复了 #31819#31883Anton Popov)。
  • 在构造 KeeperTCPHandler 时,将配置路径从 keeper_server.session_timeout_ms 更改为 keeper_server.coordination_settings.session_timeout_msoperation_timeout 同样更改。#31859 (JackyWoo)。
  • 修复在使用 Nullable 主键时对 Nullable 类型的非法类型转换问题。(不推荐使用 Nullable 主键——请勿使用。)此修复对应 #31075#31823Amos Bird)。
  • 修复了 SQL 中递归 UDF 导致的崩溃。关闭 #30856#31820Maksim Kita)。
  • 修复在字典属性类型为 Nullable 时使用显式指定类型的 dictGet 函数导致的崩溃问题。修复了 #30980#31800Maksim 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 输出格式中的竞态条件,当输出中同时包含数据行和进度行时可能出现该问题。#31736Kruglov Pavel)。
  • 修复了在执行 ON CLUSTER 查询时,如果指定的集群名称是某个 Replicated 数据库的名称,会报 there are no such cluster here 错误的问题。#31723 (tavplubix)。
  • 修复了在 Nullable 列上调用 decrypt 函数时在某些情况下抛出的异常。修复了 #31662。修复了 #31426#31707alexey-milovidov)。
  • 修复了在字符串包含 UTF-8 字符时 ngrams 函数的问题。#31706 (yandd).
  • 设置 input_format_allow_errors_numinput_format_allow_errors_ratio 在解析 IPv4 等域类型时不起作用的问题已修复。修复 #31686#31697tavplubix)。
  • 修复了在 MATERIALIZE COLUMN 中出现的空指针异常问题。 #31679 (Nikolai Kochetov).
  • Ordinary 数据库中尝试重命名 DDL 字典时,RENAME TABLE 查询行为不正确,现已修复。 #31638 (tavplubix).
  • 按预期实现 sparkbar 聚合函数,参见:#26175#issuecomment-960353867、comment#31624小路)。
  • 修复在仅有列名包含无效 UTF-8 序列时生成的无效 JSON。 #31534 (Kevin Michel)。
  • 在修复与此优化相关的 bug 之前,禁用 partial_merge_join_left_table_buffer_bytes。参见 #31009)。移除冗余选项 partial_merge_join_optimizations#31528 (Vladimir C)。
  • 修复短 INSERT SELECT 查询的进度显示。#31510 (Azat Khuzhin).
  • 修复在 GROUP BY 与位置参数配合使用时的错误行为。关闭 #31280#issuecomment-968696186。 #31420 (Kseniia Sumarokova).
  • 修复用于 S3 的 STS 凭证提供程序中出现的 nullptr 问题。 #31409 (Vladimir Chebotarev)。
  • 从索引分析中移除 notLike 函数,因为其实现不正确。#31169sundyli)。
  • 修复 Keeper 中的一个 bug:当部分协调日志丢失且可用快照比最新日志更新时,可能导致无法启动的问题。#31150 (alesapin)。
  • 在本地 JOIN 时重写右侧分布式表。解决了 #25809#31105abel-cheng)。
  • 修复使用别名和 WHERE 条件的 Merge 表(此前完全无法正常工作)。关闭 #28802#31044Kseniia Sumarokova)。
  • 修复 JSON_VALUE/JSON_QUERY 在带引号标识符中的处理方式,使其支持在 JSON 路径中包含空格。关闭了 #30971#31003Kseniia Sumarokova)。
  • 在非面向行的格式中使用 formatRow 函数会导致段错误。因此不再允许在此类格式中使用该函数(因为这没有意义)。#31001 (Kruglov Pavel).
  • 修复了一个在删除物化视图后会导致后续 SELECT 查询失败的 bug。问题见 #30691#30997Kseniia Sumarokova)。
  • 在执行 ATTACH PARTITION ... FROM 和 MOVE PARTITION ... 操作时跳过对 max_partition_size_to_drop 的检查 #30995 (Amr Alaa)。
  • 修复了 INTERSECTEXCEPT 运算符的某些边缘情况。关闭了 #30803#30965Kseniia Sumarokova)。

构建/测试/打包改进

  • 修复非 x86 构建上的错误过滤结果。修复了 #31417。修复了 #31524#31574alexey-milovidov)。
  • 使 ClickHouse 构建完全可复现(在不同机器上生成的二进制在字节级完全一致)。修复了 #22113#31899alexey-milovidov)。从二进制文件中移除指向构建目录的文件系统路径,以实现可复现构建。此更改是为了解决 #22113#31838alexey-milovidov)。
  • zlib-ngcassandramariadb-connector-c 以及 xzre2sentrygsaslarrowprotobuf 使用我们自己的 CMakeLists。这是为了解决 #20151,也是 #9226 的一部分,是移除构建系统中恼人冗余内容的一小步。#30599alexey-milovidov)。
  • Hermetic 构建:使用固定版本的 libc,并确保在构建过程中不会使用来自宿主操作系统的任何源码或二进制文件。修复了 #27133。修复了 #21435。修复了 #30462#30011alexey-milovidov)。
  • 新增函数 getFuzzerData(),以便更容易对特定函数进行模糊测试(fuzz)。修复了 #23227#27526Alexey Boykov)。
  • 在 Docker 内更规范地设置 capabilities。#31802Constantine Peresypkin)。
  • 启用 clang 编译选项 -fstrict-vtable-pointers-fwhole-program-vtables#20151Maksim Kita)。
  • 避免为 FreeBSD 交叉编译下载工具链 tar 包。#31672alexey-milovidov)。
  • 初步支持 RISC-V。有关注意事项和已测试的构建命令,请参见 development/build-cross-riscv。#31309Vladimir Smirnov)。
  • 支持在 ARM 机器上使用参数 "-DENABLE_TESTS=OFF" 进行编译。#31007zhanghuajie)。

ClickHouse 版本 v21.11,发布于 2021-11-09

向后不兼容变更

  • 调整 SQL/JSON 函数中 json_pathjson 参数的顺序(以与标准保持一致)。关闭 #30449#30474Kseniia Sumarokova)。
  • 移除 MergeTree 表设置项 write_final_mark。该设置现在始终为 true#30455Kseniia Sumarokova)。无需采取任何操作,所有表都与新版本兼容。
  • 移除函数 bayesAB。如需恢复该函数,请以更新后的形式重新提交。这将关闭 #26233#29934alexey-milovidov)。
  • 仅当你已经开始使用实验性的 clickhouse-keeper 支持时才适用。现在 ClickHouse Keeper 默认使用 ZSTD 编解码器压缩快照,而不是自定义的 ClickHouse LZ4 分块压缩。可以通过协调设置 compress_snapshots_with_zstd_format 关闭此行为(在所有 quorum 副本上必须保持一致)。向后不兼容的情况非常少见,只会在新节点向旧节点发送快照(例如在恢复场景中)且旧节点无法读取 ZSTD 格式快照时发生。#29417alesapin)。

新特性

  • 新的异步 INSERT 模式允许在后台累积插入的数据,并将其作为单个批次存储。在客户端,可以通过为带有内联数据或使用独立缓冲区(例如通过 HTTP 协议执行的 INSERT 查询)的 INSERT 查询设置 async_insert 来启用该模式。如果 wait_for_async_insert 为 true(默认值),客户端将等待数据刷写到表中。在服务器端,该模式由 async_insert_threadsasync_insert_max_data_sizeasync_insert_busy_timeout_ms 这些设置进行控制。实现了 #18282#27537Anton Popov)。#20557Ivan)。关于性能说明:使用异步插入时,每秒最多可以执行约 10 000 条独立的 INSERT 查询,因此如果希望达到每秒数百万行的插入性能,仍然建议按批次进行插入。
  • clickhouse-local 添加了交互模式。现在,你可以直接运行 clickhouse-local,在无需连接服务器的情况下获得命令行 ClickHouse 界面,并处理来自文件和外部数据源的数据。同时合并了 clickhouse-clientclickhouse-local 的代码。关闭 #7203。关闭 #25516。关闭 #22401#26231Kseniia Sumarokova)。
  • 新增对可执行(可脚本化的)用户自定义函数的支持。此类 UDF 可以使用任何编程语言编写。 #28803 (Maksim Kita).
  • 允许为外部数据源预定义连接。这样在使用外部数据源时,就可以避免每次都指定凭证或地址,而是通过名称进行引用。修复了 #28367#28577Kseniia Sumarokova)。
  • system 数据库中添加了 INFORMATION_SCHEMA 数据库,其中的 SCHEMATATABLESVIEWSCOLUMNS 视图对应相应的表。解决了 #9770#28691tavplubix)。
  • 支持 EXISTS (subquery)。解决 #6852#29731Kseniia Sumarokova)。
  • 用于审计的会话日志。将所有成功和失败的登录和注销事件记录到新的 system.session_log 表中。 #22415 (Vasily Nemkov) (Vitaly Baranov).
  • 支持多维余弦距离和欧几里得距离函数;L1、L2、Lp、Linf 距离和范数。支持对元组进行内积运算以及各种算术运算符操作。这完全解决了 #4509 中的问题,并且实现了更多功能。#27933Alexey Boykov)。
  • INTO OUTFILEFROM INFILE 添加压缩和解压缩支持(支持自动检测或通过额外的可选参数指定)。#27135Filatenkov Artur)。
  • 通过 HTTP OPTIONS 请求添加了 CORS(跨域资源共享)支持。这意味着现在 Grafana 在 serverless 请求场景下可以正常工作,无需任何变通方案。修复了 #18693#29155Filatenkov Artur)。
  • 包含 JOIN ON 子句的查询现在支持逻辑或(OR)。 #21320 (Ilya Golshtein).
  • 新增函数 tokens。该函数允许使用非字母数字的 ASCII 字符作为分隔符,将字符串拆分为标记。 #29981 (Maksim Kita)。新增函数 ngrams,用于从文本中提取 n-gram。已关闭 #29699#29738 (Maksim Kita)。
  • 新增 Unicode 规范化函数:normalizeUTF8NFCnormalizeUTF8NFDnormalizeUTF8NFKCnormalizeUTF8NFKD#28633 (darkkeks)。
  • 在 ClickHouse 中使用 FileLog 表引擎对应用程序日志文件进行流式消费。它类似于 KafkaRabbitMQ 引擎,但用于本地文件系统中仅追加写入并会轮转的日志文件。解决了 #6953#25969flynn)(Kseniia Sumarokova)。
  • 添加 CapnProto 输出格式,重构 CapnProto 输入格式。#29291 (Kruglov Pavel).
  • 允许在查询中使用二进制字面量来书写数字。例如 SELECT 0b001;#29304Maksim Kita)。
  • 新增 hashed_array 字典类型。在使用具有多个属性的字典时可以节省内存。解决了 #30236#30242Maksim Kita)。
  • 添加了 JSONExtractKeys 函数。#30056Vitaly)。
  • 添加了函数 getOSKernelVersion——返回操作系统内核版本的字符串。#29755 (Memo)。
  • 添加了 MD4SHA384 函数。MD4 是一种已过时且不安全的哈希函数,仅应在极少数情况下使用,例如某些遗留系统已经在使用 MD4,而你需要得到与其完全相同的结果时。 #29602 (Nikita Tikhomirov).
  • 可以通过在配置文件中将 hsts_max_age 参数设置为正数,为 ClickHouse HTTP 服务器启用 HSTS。#29516 (凌涛)。
  • 添加对华为 OBS 存储的支持。关闭 #24294#29511kevin wan)。
  • 新增函数 mapContainsKeyLike,用于判断 map 中是否存在键名匹配简单正则表达式的元素。 #29471 (凌涛)。新增函数 mapExtractKeyLike,用于从 map 中提取仅保留键名匹配指定模式的元素。 #30793 (凌涛)。
  • 已实现 ALTER TABLE x MODIFY COMMENT#29264Vasily Nemkov)。
  • 新增了 ClickHouse 中尚未提供、但可通过 H3 API 使用的 H3 检查函数:https://h3geo.org/docs/api/inspection#29209Bharat 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 函数。#28952Ivan Veselov)。
  • 添加聚合函数 exponentialMovingAverage,可用作窗口函数。这一变更关闭了 #27511#28914alexey-milovidov)。
  • 允许将表列的子列包含到 DESCRIBE 查询结果中(可通过设置 describe_include_subcolumns 启用)。 #28905 (Anton Popov).
  • ExecutableExecutablePool 新增选项 send_chunk_header。如果该选项为 true,则会在数据块之前向客户端发送一行包含该块行数(rows_count)及换行符的头信息。 #28833 (Maksim Kita)。
  • tokenbf_v1ngram 支持键类型为 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。当然,具体会跳过多少行取决于你设置的 granularityindex_granularity#28511 (凌涛).
  • 将性能剖析事件从服务器发送到客户端。引入了新的数据包类型 ProfileEvents。已关闭 #26177#28364Dmitry Novik)。
  • FixedStringString 数据类型提供位移运算。此更改修复了 #27763 中的问题。#28325小路)。
  • 在数据库引擎 MaterializedPostgreSQL 中支持动态添加 / 删除参与复制的表。支持对数据库设置执行 ALTER 操作。关闭 #27573#28301Kseniia Sumarokova)。
  • 新增函数 accurateCastOrDefault(x, T)。修复 #21330。作者 @taiyang-li。#23028Maksim Kita)。
  • 新增函数 toUUIDOrDefaulttoUInt8/16/32/64/256OrDefaulttoInt8/16/32/64/128/256OrDefault,使用户可以在字符串解析失败时指定默认值(非 null)。 #21330 (taiyang-li)。

性能优化

  • 后台合并任务可以相互抢占执行,并按合适的优先级进行调度。现在,长时间运行的合并任务不会阻止短合并任务继续执行。这样可以更好地调度和控制合并的执行,减少出现 “too many parts” 错误的概率。#22381#25165Nikita Mikhaylov)。新增:允许同时执行的合并和变更(mutations)任务数量可以多于后台线程池中的线程数量。合并和变更会根据其大小依次分步执行(越小优先级越高)。要执行的任务数与线程数的比例由设置 background_merges_mutations_concurrency_ratio 控制,默认值为 2。#29140Nikita Mikhaylov)。
  • 允许对远程文件系统使用异步读取,减少从远程文件系统读取时的寻道操作次数。这极大地提升了性能,并使实验性的 webs3 磁盘在某些条件下比 EBS 运行得更快。#29205Kseniia Sumarokova)。与此同时,web 磁盘类型(托管在 Web 服务器上的静态数据集)也从实验特性毕业,正式达到生产可用级别。
  • clickhouse-client 中,带有 INTO OUTFILE 的查询现在将使用多线程。修复了在使用 INTO OUTFILE 时进度条闪烁的问题。此更改关闭了 #30873。此更改关闭了 #30872#30886alexey-milovidov)。
  • 减少在某些类型的 SELECT 查询中从磁盘读取的冗余压缩数据量(仅适用于 MergeTree 引擎族)。#30111 (alesapin)。
  • 在 MergeTree 系列表引擎中读取压缩数据块时,移除了一些多余的 seek 调用。#29766 (alesapin).
  • 使 url 表函数能够并行处理多个 URL。修复了 #29670#29671#29673alexey-milovidov)。
  • 在启用 optimize_aggregation_in_order 设置时,提升按主键顺序聚合的性能。 #30266 (Anton Popov).
  • 现在 ClickHouse 在与外部 S3 通信时会使用 DNS 缓存。#29999 (alesapin)。
  • 为外部数据库(例如 MySQL)添加对 IS NULL/IS NOT NULL 下推的支持。#29463Azat Khuzhin)。将 isNull/isNotNull 转换为 IS NULL/IS NOT NULL,以便下推到外部数据库(例如 MySQL)。#29446Azat Khuzhin)。
  • 对 Dictionary 表执行的 SELECT 查询现在会使用多线程。#30500 (Maksim Kita)。
  • 提升 Decimal 列在筛选(WHERE 操作)时的性能。#30431Jun Jin)。
  • 使用性能更优的 popcnt/ctz 实现,移除过滤操作中的多分支代码。 #29881 (Jun Jin).
  • 改进过滤 bytemask 生成器函数(用于 WHERE 运算符),将 SSE/AVX2/AVX512 指令集统一到一个实现中。注意,默认情况下 ClickHouse 仅使用 SSE,因此这只与自定义构建相关。#30014 (jasperzhu). #30670 (jasperzhu).
  • 提高 SUM 聚合函数在 Nullable 浮点数上的性能。 #28906 (Raúl Marín).
  • 在使用多个磁盘时加速数据分片的加载过程。思路类似于 https://github.com/ClickHouse/ClickHouse/pull/16423。生产环境中显示性能提升:24 分钟缩短为 16 分钟。#28363Amos Bird)。
  • 将 S3 分段上传的默认分片大小减小,以降低内存使用。#28679 (ianton-ru).
  • 提升 bitmapAnd 函数的性能。#28332 (dddounaiking)。
  • 当合并仍在进行时,移除了 StorageMergeTree 中效果不佳的变更通知。#27552 (Vladimir Chebotarev)。
  • 尝试优化字符串比较性能。 #28767 (alexey-milovidov).
  • 主键索引和分区过滤器现在支持 tuple。 #29281 (凌涛)。
  • 如果查询中包含多个具有相同参数但 level 参数不同的 quantile 聚合函数,并且启用了 optimize_syntax_fuse_functions 设置,它们将被融合在一起,并在同一次遍历中执行。#26657hexiaoting)。
  • 现在,针对主键的第一个表达式的 min-max 聚合已通过投影(projection)进行了优化。此改动用于解决 #329#29918Amos 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#30734Maksim Kita)。支持 CREATE OR REPLACECREATE IF NOT EXISTS 语法。#30454Maksim Kita)。新增 DROP IF EXISTS 支持。例如 DROP FUNCTION IF EXISTS test_function#30437Maksim Kita)。支持 lambda 表达式。例如 CREATE FUNCTION lambda_function AS x -> arrayMap(element -> element * 2, x);#30435Maksim Kita)。为 clickhouse-local 提供 SQL 用户自定义函数支持。#30179Maksim Kita)。
  • 全局启用逐查询内存分析器(将 memory_profiler_step 设为 4MiB)。#29455Azat Khuzhin)。
  • 已在 system.data_skipping_indices 中新增列 data_compressed_bytesdata_uncompressed_bytesmarks_bytes。已在 system.parts 中新增列 secondary_indices_compressed_bytessecondary_indices_uncompressed_bytessecondary_indices_marks_bytes。已关闭 #29697#29896Maksim Kita)。
  • 为 system.tables 添加名为 table 的别名,并为 system.databases 添加名为 database 的别名 #29677#29882kevin wan)。
  • 在服务器启动时正确解析表之间的依赖关系。修复 #8004,修复 #15170#28373tavplubix)。
  • 当在函数 divideintDivmodulo 中分母为 Nullable 时,避免出现“Division by zero”错误。解决 #22621#28352Kruglov Pavel)。
  • 允许在文本格式中将 Date 数据类型的值解析为 YYYYMMDD,除了 YYYY-MM-DD 形式之外。此更改修复了 #30870#30871alexey-milovidov)。
  • Web UI:在表格单元格中渲染条形图。 #29792 (alexey-milovidov).
  • 用户现在可以在创建字典时添加注释:CREATE DICTIONARY ... COMMENT 'vaue' ... #29899 (Vasily Nemkov)。用户现在也可以在 CREATE DATABASE 语句中为数据库添加注释 ... #29429 (Vasily Nemkov)。
  • 引入 compiled_expression_cache_elements_size 设置。如果你将来需要用到这个设置,你自然会知道它是做什么的。#30667Maksim Kita)。
  • clickhouse-format 现在支持选项 --query。在之前的版本中,必须通过 stdin 传入查询。#29325 (凌涛)。
  • 支持对 Memory 数据库中的表执行 ALTER TABLE 操作。Memory 数据库用于 clickhouse-local#30866 (tavplubix).
  • 现在,arrayStringConcat 已支持所有可序列化类型的数组。#30840 (Nickita Taranov)。
  • ClickHouse 现在在获取系统内存大小时会考虑 Docker/cgroup 的限制。参见 #25662#30574Pavel Medvedev)。
  • 现在从 PostgreSQL 数据库获取的表结构更加可靠。#30477 (Kseniia Sumarokova).
  • 在 GROUP BY 和 ORDER BY 中全面支持位置参数。 #30433 (Kseniia Sumarokova).
  • 允许使用 JSONExtractString 将非字符串元素提取为字符串类型。此更改对应于 pull/25452#issuecomment-927123287#30426Amos Bird)。
  • 新增支持在针对 GraphiteMergeTreeSELECT 查询中使用 FINAL 子句。 #30360 (Nikita Mikhaylov).
  • 对副本克隆以及为损坏数据片段入队抓取操作进行了小幅改进,可避免在复制队列中极其罕见出现 GET_PART 条目卡住的问题。 #30346 (tavplubix).
  • 允许在 user_files 目录中使用指向文件的符号链接,以用于文件表函数。#30309 (Kseniia Sumarokova).
  • 修正了 Date32DateDateTimeDateTime64String 的比较。 #30219 (liang.huang).
  • 允许从 MergeTree 表中删除 SAMPLE BY 表达式(ALTER TABLE <table> REMOVE SAMPLE BY)。 #30180 (Anton Popov).
  • 现在,Keeper(作为 clickhouse-server 的一部分)如果能够连接到其他节点,将会以异步方式启动。#30170 (alesapin)。
  • 现在 clickhouse-client 支持内置多行编辑。#30143Amos Bird)。
  • polygon 字典(反向地理编码):在将 store_polygon_key_column 设置为 true 时,新增支持通过 SELECT 查询读取字典内容。解决了 #30090#30142Maksim Kita)。
  • 在 Play UI 中添加 ClickHouse 徽标。 #29674 (alexey-milovidov).
  • 在从 ArrowArrowStreamParquetORC 等 Arrow 支持的格式读取列时改进了异常信息。解决了 #29926#29927alexey-milovidov)。
  • 修复 Buffer 表中刷新和启动之间的数据竞争问题。该问题可能会在测试中出现。#29930 (Azat Khuzhin)。
  • 修复 DatabaseMemoryLiveView 执行 DROP TABLE 时的 lock-order-inversion(锁顺序反转)问题。Live View 是一个实验性特性。Memory 数据库用于 clickhouse-local。#29929 (Azat Khuzhin).
  • 修复定期重载字典与重载配置之间的锁顺序反转问题。 #29928 (Azat Khuzhin).
  • 将 zoneinfo 文件更新至 2021c。#29925 (alexey-milovidov).
  • clickhouse-copier 新增支持配置重试次数及其间隔时间的功能。#29921 (Azat Khuzhin)。
  • 添加 shutdown_wait_unfinished_queries 服务器配置项,以允许在关闭时等待正在运行的查询完成,最长等待时间为 shutdown_wait_unfinished。这是为了解决 #24451#29914Amos 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,用于在合并过程中分析内存使用情况。 #29681 (Azat Khuzhin).
  • 查询混淆器:clickhouse-format --obfuscate 现在支持更多类型的查询。#29672 (alexey-milovidov)。
  • 修复了一个问题:clickhouse-format --obfuscate 无法处理包含内置字典(regionTo... 函数)的查询。#29667alexey-milovidov)。
  • 修复 JSON 函数对 Nullable 类型的不正确处理。此修复解决了 #29615。将其标记为改进,因为 https://github.com/ClickHouse/ClickHouse/pull/28012 尚未发布。#29659Amos Bird)。
  • 默认提高 listen_backlog(以匹配较新 Linux 内核中的默认值)。#29643 (Azat Khuzhin).
  • 当服务器配置 dictionaries_configmodels_configuser_defined_executable_functions_config 发生更改时,重新加载字典、模型和用户自定义的可执行函数。关闭 #28142#29529Maksim Kita)。
  • 去除对 projection 名称的不必要限制。现在 projection 名称可以以 tmp_ 开头。#29520Amos Bird)。
  • 修复了在包含嵌套子查询的 mutation 中出现的 There is no query or query context has expired 错误。当表为复制表且禁用了 allow_nondeterministic_mutations 设置时,不再允许在 mutation 中使用子查询。#29495 (tavplubix)。
  • 在运行时对 max_concurrent_queries 应用配置变更(无需重启)。#29414Raúl Marín)。
  • 新增了设置 use_skip_indexes#29405 (Maksim Kita)。
  • 为内存 part 添加对 FREEZE 的支持(用于备份)。 #29376 (Mo Xuan).
  • clickhouse-benchmark 透传初始 query_id(此前如果通过 clickhouse-benchmark 运行远程查询,各分片上的查询不会通过 initial_query_id 与初始查询关联)。#29364 (Azat Khuzhin)。
  • 跳过索引 tokenbf_v1ngrambf_v1:新增对键类型为 StringFixedStringArray 数据类型的支持。#29280 (Maksim Kita)。跳过索引 tokenbf_v1ngrambf_v1:新增对键类型为 StringFixedStringMap 数据类型的支持。作者 @lingtaolf。#29220 (Maksim Kita)。
  • 函数 has:新增对 Map 数据类型的支持。#29267 (Maksim Kita)。
  • 为 clickhouse-keeper 添加 compress_logs 设置,用于将 clickhouse-keeper 的(复制状态机)日志压缩为 ZSTD 格式。实现:#26977#29223alesapin)。
  • 添加 external_table_strict_query 设置——即使不兼容,也会强制在查询中将整个 WHERE 表达式传递给外部数据库。 #29206 (Azat Khuzhin).
  • 当使用 ARRAY JOIN 时禁用 projection。在之前的版本中,对 projection 的分析可能会导致 ARRAY JOIN 中的别名失效。#29139Amos Bird)。
  • MsgPack 输入/输出格式中支持更多类型。#29077 (Kruglov Pavel)。
  • 允许在 ORC 输入/输出格式中读写 LowCardinality 列。 #29062 (Kruglov Pavel).
  • system.distributed_ddl_queue 中执行 SELECT 可能会显示不正确的值,该问题已修复。#29061 (tavplubix)。
  • 修复 HTTP 连接在处理未知方法时的行为。解决了 #29050#29057Filatenkov Artur)。
  • clickhouse-keeper:修复 clickhouse-keeper-converter 中的一个 bug,该 bug 在从 ZooKeeper 日志(非快照)中恢复数据时可能导致部分数据丢失。#29030小路)。修复 clickhouse-keeper-converter 中的一个 bug,该 bug 可能导致 ZooKeeper 日志反序列化不正确。#29071小路)。
  • 应用 CREATE ... AS SELECT 查询中的设置(修复:#28810)。#28962Azat Khuzhin)。
  • 在执行 ALTER TABLE ... ON CLUSTER ... REPLACE/MOVE PARTITION FROM/TO ... 时尊重默认数据库设置 #28955 (anneji-dev)。
  • gRPC 协议:允许客户端更改服务端压缩设置。 #28953 (Vitaly Baranov).
  • 在读取用于异步指标的温度传感器时跳过 “no data” 异常。解决了 #28852#28882alexey-milovidov)。
  • 修复了一个逻辑竞态条件,该问题在极少数情况下可能会导致已存在的字典出现 Dictionary not found 错误。#28853 (tavplubix).
  • 放宽用于 If 组合子检查的嵌套函数限制(但禁止嵌套相同的组合子)。 #28828 (Azat Khuzhin).
  • 修复在服务器终止时可能出现的未捕获异常。#28761 (Azat Khuzhin).
  • 如果 mutation/merge 持续时间异常地长,则禁止清理可能被正在执行的 mutation/merge 使用的 tmp 目录。 #28760 (Azat Khuzhin).
  • 允许在使用别名时启用优化 optimize_arithmetic_operations_in_aggregate_functions = 1#28746 (Amos Bird)。
  • ReplicatedMergeTree 实现 detach_not_byte_identical_parts 设置,使其在合并/变更后对非字节级完全一致的部件执行分离而不是删除操作。 #28708 (Azat Khuzhin).
  • MergeTree 实现 max_suspicious_broken_parts_bytes 设置(用于限制所有损坏分片(part)的总大小,默认值为 1GiB)。#28707 (Azat Khuzhin).
  • RabbitMQ 表设置中启用宏展开。 #28683 (Vitaly Baranov)。
  • 恢复了使用多线程读取 Log 引擎表数据的功能。#28125Vitaly Baranov)。
  • 修复 JSON 函数在处理 NULL 列时的异常行为。修复了 #27930#28012Amos Bird)。
  • 允许为跳过索引单独设置与列分开的 Mark/Uncompressed 缓存大小。 #27961 (Amos Bird).
  • 允许将带有 USING 的 JOIN 与其他 JOIN 类型混用。#23881 (darkkeks)。
  • 更新 aws-sdk 子模块,以支持 Yandex Cloud S3 的限流处理。#30646 (ianton-ru)。
  • 修复在处理 gRPC 调用时于查询处理结束后释放 query ID 和 session ID 的问题。#29954 (Vitaly Baranov)。
  • 修复 AccessControlManager 的关闭逻辑,以解决测试偶发失败的问题。#29951Vitaly Baranov)。
  • 修复从 HDFS 读取时触发的断言失败。更新 libhdfs3 库,使其能够在调试构建中运行测试。关闭 #29251。关闭 #27814#29276Kseniia Sumarokova)。

构建 / 测试 / 打包改进

  • 为 Aarch64 机器新增对 FreeBSD 构建的支持。#29952 (MikaelUrankar).
  • ClickHouse 不再需要递归子模块。#30315 (alexey-milovidov).
  • ClickHouse 现在可以使用 Musl 进行静态构建。该功能以实验性质提供,目前不支持构建 odbc-bridgelibrary-bridge、与 CatBoost 的集成以及部分库。#30248 (alexey-milovidov).
  • AArch64Darwin (macOS) 构建启用 ProtobufArrowORCParquet 支持,从而关闭了 #29248#28018#30015 (alexey-milovidov).
  • 添加对 PowerPC(powerpc64le)的交叉编译构建支持,从而关闭了 #9589。为 AArch64 和 PowerPC 启用与 MySQL 交互的支持,从而关闭了 #26301#30010 (alexey-milovidov).
  • 在交叉编译工具链中仅保留必要文件,并将其作为子模块包含(此前是以 tarball 的形式下载)。#29974 (alexey-milovidov).
  • 在 ClickHouse 中为 select 语句解析器实现结构感知模糊测试方法。#30012 (Paul).
  • 为 clang 启用实验性的 constexpr 表达式求值器,以加速模板代码编译。#29668 (myrrc).
  • 新增支持:在不使用新符号的前提下,可使用较新版本的 glibc 进行编译。#29594 (Azat Khuzhin).
  • 通过启用 clang 的优化选项,减小 Debug 构建生成的二进制文件体积。#28736 (flynn).
  • 现在所有用于 CI 的镜像都会放置在单独的 Docker Hub 仓库中。#28656 (alesapin).
  • 改进对使用 clang-13 进行构建的支持。#28046 (Sergei Semin).
  • clickhouse-client 新增打印原始 profile 事件的功能(可用于调试和测试)。#30064 (Azat Khuzhin).
  • 为 clickhouse-server unit 添加时间依赖关系(systemd 和 sysvinit init)。#28891 (Azat Khuzhin).
  • 在符号重新加载时重新加载堆栈跟踪(stacktrace)缓存。#28137 (Amos Bird).

Bug 修复

  • 用于在 UTF-8 字符串中进行不区分大小写搜索的函数(例如 positionCaseInsensitiveUTF8countSubstringsCaseInsensitiveUTF8)在极少数情况下可能会错误地将实际上不匹配的子字符串识别为匹配,该问题已修复。 #30663 (tavplubix).
  • 修复在加密磁盘上读取空文件时的问题。 #30494 (Vitaly Baranov).
  • 修复在分布式查询中,当设置 legacy_column_name_of_tuple_literal = 0 时,将 OR 条件链转换为 IN(由设置 optimize_min_equality_disjunction_chain_length 控制)的问题。#28658 (Anton Popov).
  • 即使将 insert_allow_materialized_columns 设置为 0,也允许在分布式表中使用物化列作为分片键。#28637 (Vitaly Baranov)。
  • 修复在同时设置 TOFROM 且结果集为空时使用 ORDER BY ... WITH FILL 的问题。 #30888 (Anton Popov).
  • 修复在具有两个以上操作数的 AND/OR 表达式中未使用集合索引的问题。修复了 #30416#30887Amos Bird)。
  • 修复在物化带哈希函数的 projection 时发生的崩溃,修复了 #30861。该问题与 https://github.com/ClickHouse/ClickHouse/pull/28560 类似,根本原因都是对“header 为空”这一不变式缺乏正确理解。#30877Amos Bird)。
  • 修复了在 ReplicatedMergeTree 中从 ZooKeeper 路径提取辅助 ZooKeeper 名称时存在的歧义问题。此前,如果 ZooKeeper 路径中包含冒号,服务器在启动时可能会失败并报错 Unknown auxiliary ZooKeeper name。修复了 #29052。此外,之前允许指定不以斜杠开头的 ZooKeeper 路径,但该行为现已弃用,且不再允许使用此类路径创建新表。辅助 ZooKeeper 名称中同样不允许出现斜杠和冒号。#30822tavplubix)。
  • 当 localBackup 因某些原因失败时,清理临时目录。#30797 (ianton-ru).
  • 修复了在非复制 MergeTree 表中,REPLACE/MOVE PARTITION 与后台合并之间的竞争条件,该问题可能导致部分被移动/替换的数据残留在分区中。修复了 #29327#30717tavplubix)。
  • 在 PREWHERE 条件恒为 true 时,修复 PREWHERE 与 WHERE 联用时的行为。 #30668 (Azat Khuzhin).
  • Limit 下推优化可能会引发 Cannot find column 错误。修复了 #30438#30562Nikolai Kochetov)。
  • 在将 isNotNull/isNull 重写为 IS [NOT] NULL 时补全缺失的括号(修复包含 isNotNull(1)+isNotNull(2) 等内容的查询)。 #30520 (Azat Khuzhin).
  • 修复对同一张表执行带标量子查询的 ALTER 操作时导致的死锁,关闭 #30461#30492Vladimir C)。
  • 修复了一个问题:在执行 REPLACE PARTITION 期间,如果会话过期,可能会导致段错误。 #30432 (tavplubix).
  • 在使用聚合 projection 时,包含类似 IN (subquery) 条件的查询可能会返回不正确的结果。已修复为 projection 创建集合的方式。 #30310 (Amos Bird)。
  • 修复在启用 projection 时执行 JOIN 查询时的列别名解析问题。此更改修复了 #30146#30293Amos Bird)。
  • 修复 replaceRegexpAll 函数中的一些问题。#30292 (Memo)。
  • 修复 ComplexKeyHashedDictionary 与 ComplexKeySparseHashedDictionary 在从布局配置中解析 preallocate 选项时的问题。 #30246 (Maksim Kita).
  • 修复 [I]LIKE 函数。关闭 #28661#30244Nikolay Degterinsky)。
  • 修复在 multiIf 中使用 shortcircuit 和 LowCardinality 时发生的崩溃问题。 #30243 (Raúl Marín).
  • 修复 FlatDictionary 和 HashedDictionary 在可为 NULL 属性上的 bytes_allocated 计算。#30238Maksim Kita)。
  • 在多个 JOIN 中允许使用以数字开头的标识符。#30230Vladimir C)。
  • 修复在将 max_read_buffer_size 设置为 0 时从 MergeTree 读取数据的问题(这种配置可能导致抛出 Can't adjust last granuleLOGICAL_ERROR 等异常,甚至造成数据丢失)。 #30192 (Azat Khuzhin).
  • 修复在使用 min_bytes_to_use_direct_iopread_fake_async/pread_threadpool 的问题。#30191 (Azat Khuzhin).
  • 修复 INSERT SELECT 在基于 Nullable 列填充 MATERIALIZED 列时会产生错误填充的问题。 #30189 (Azat Khuzhin).
  • 为函数 initializeAggregation 添加对可空参数的支持。 #30177 (Anton Popov)。
  • 修复在包含 GLOBAL INWITH TOTALS 的查询中出现的 Port is already connected 错误。仅针对 21.9 和 21.10。#30086 (Nikolai Kochetov)。
  • 修复 MergeTree 中 MOVE PARTITION 与合并/变更操作之间的竞态条件。 #30074 (Azat Khuzhin).
  • 在服务器重启后,已删除的 Memory 数据库可能会重新出现,此问题已修复(#29795)。另外新增了 force_remove_data_recursively_on_drop 设置项,作为在删除 Ordinary 数据库时遇到 Directory not empty 错误的变通方案(因为在云环境中无法手动清理残留数据)。#30054tavplubix)。
  • 通过 tuple() 修复示例程序中的崩溃,关闭 #30004#30016flynn)。
  • 尝试关闭 issue:#29965#29976hexiaoting)。
  • 修复 FileCheckerStorageLog/StorageStripeLog 之间可能存在的数据竞争。 #29959 (Azat Khuzhin).
  • 修复 StorageLogLogSink::writeMarks()LogSource 之间的数据竞争问题。 #29946 (Azat Khuzhin).
  • 修复 MergeTree 表并发查询限制中潜在的资源泄漏问题,该问题是在 https://github.com/ClickHouse/ClickHouse/pull/19544 中引入的。#29879Amos Bird)。
  • 修复系统表重建检查逻辑(此前无法检测到枚举值的变更)。 #29857 (Azat Khuzhin).
  • MaterializedMySQL:修复了一个问题:当与 MySQL 的连接丢失时,会导致只能处理事务的一部分。#29837 (Håvard Kvålen)。
  • 避免在极其罕见的情况下出现 Timeout exceeded: elapsed 18446744073.709553 seconds 错误,该错误可能是由内核中的某个 bug 引起。修复了 #29154#29811tavplubix)。
  • 修复在 ATTACH TABLE ... FROM 'path' 查询中,将非字符串字面量用作路径时出现的错误类型转换问题。这可能导致读取未初始化内存。#29790 (alexey-milovidov).
  • 修复在 GROUP BY 过程中对 LowCardinality 的并发访问问题(与 Buffer 表结合使用时可能会导致问题)。#29782 (Azat Khuzhin).
  • 修复了在分布式查询中,当分片混用版本 <= 21.3>= 21.4GROUP BY 键由多个且均为固定大小的列构成,并启用了两级聚合(参见 group_by_two_level_thresholdgroup_by_two_level_threshold_bytes)时,结果中出现具有相同键的多行数据(错误的 GROUP BY)的问题。修复了 #29580#29735Nikolai Kochetov)。
  • 修复了在服务器重启时设置 materialized_postgresql_tables_list 时出现的不正确行为。见 #28529#29686Kseniia Sumarokova)。
  • 在下推优化过程中,过滤谓词中的条件可能会丢失。#29625 (Nikolai Kochetov).
  • 修复在包含别名和短路求值表达式时的 JIT 表达式编译问题。关闭 #29403#29574Maksim Kita)。
  • 修复在 ALTER MODIFY 查询中,当在 DEFAULT 表达式中使用类似 x.y.z... 这样的错误表标识符时可能出现的罕见段错误。修复了 #29184#29573alesapin)。
  • 修复 GROUP BY WITH TOTALS HAVING 中的空指针解引用问题(当 HAVING 中使用的列未被选出时)。 #29553 (Azat Khuzhin)。
  • 当同时对 Join table engine 表进行读写操作时避免发生死锁。 #29544 (Raúl Marín).
  • 修复了 pathStartsWith 检查中的 bug,原因是此前对 std::mismatch 的使用存在问题:The behavior is undefined if the second range is shorter than the first range.#29531Kseniia Sumarokova)。
  • 在 ODBC bridge 中为 Invalid cursor state 错误添加重试机制。该错误是可重试的。关闭 #29473#29518Kseniia Sumarokova)。
  • 修复了在加载 Lazy 数据库时对表名的错误解析。修复了 #29456#29476tavplubix)。
  • 修复在下推 HAVING 谓词的子查询中可能出现的 Block structure mismatch 错误。修复了 #29010#29475Nikolai Kochetov)。
  • 修复 greatest/least 函数中出现的 Cannot capture columns 逻辑错误。关闭 #29334#29454Kruglov Pavel)。
  • RocksDB 表引擎:修复在多次打开数据库时出现的竞争条件(并重新启用一些在 CI 上可以触发该问题的测试)。#29393 (Azat Khuzhin).
  • 修复在配置错误时,replicated access storage 未能正常关闭的问题。 #29388 (Kevin Michel).
  • 由于不具备内存安全性,移除了窗口函数 nth_value。关闭了 #29347#29348alexey-milovidov)。
  • 修复投影部分的垂直合并问题。修复了 #29253。此 PR 还修复了由 https://github.com/ClickHouse/ClickHouse/pull/25165 中引入的若干投影合并/变更相关问题。#29337Amos Bird)。
  • 修复在为 Replicated 数据库添加新副本时 DDL 查询卡住的问题。#29328Kevin Michel)。
  • 修复连接超时问题(send_timeout/receive_timeout)。#29282Azat Khuzhin)。
  • 修复在重新创建或创建新的 ReplicatedMergeTree 副本时,如果某个表的列包含带有大小写不敏感函数的默认表达式,可能出现的 Table columns structure in ZooKeeper is different from local table structure 异常。#29266Anton Popov)。
  • 通过 TCP 向客户端发送常规的 Database doesn't exist 错误(UNKNOWN_DATABASE),而不是 Attempt to read after eofATTEMPT_TO_READ_AFTER_EOF)。#29229 (Azat Khuzhin).
  • 修复在 Avro 输入格式中向类型为 LowCardinality(Nullable) 的列插入数据时出现的段错误。 #29132 (Kruglov Pavel).
  • 在启用服务器间密钥时禁止重用先前的凭据(在通过 Buffer/Kafka 向为该集群配置了服务器间密钥的 Distributed 表执行 INSERT 之前,可能会重用此前为该连接设置的用户)。 #29060 (Azat Khuzhin).
  • 在与字典进行 JOIN 时正确处理 any_join_distinct_right_table_keys,解决 #29007#29014Vladimir C)。
  • 修复在对别名列执行 join 时出现的 “Not found column ... in block” 错误,关闭 #26980#29008Vladimir C)。
  • 修复 GLOBAL IN 子查询中使用的线程数(自从修复 #19414 bug 之后,该子查询一直只在单线程中执行)。#28997Nikolai Kochetov)。
  • 修复当 ORDER BY 包含 WITH FILL 时的不正确优化。关闭 #28908。关闭 #26049#28910alexey-milovidov)。
  • 使用 const 参数修复高阶数组函数中 arrayCompactSIGSEGV 错误以及 arrayDifferencearrayCumSumNonNegativeILLEGAL_COLUMN 错误。 #28904 (Azat Khuzhin).
  • 修复在设置 mutations_sync=2 时等待 mutation 的问题。 #28889 (Azat Khuzhin).
  • 修复在查询外部数据库(如 MySQL)时,在 IN 中使用多列(例如 (k,v) IN ((1, 2)))的问题。#28888Azat Khuzhin)。
  • 修复在短路函数求值中与 LowCardinality 相关的 bug,并关闭 #28884#28887Kruglov Pavel)。
  • 修复从紧凑数据片段读取子列时的问题。#28873 (Anton Popov)。
  • 修复了 DROP PARTREPLACE/MOVE PARTITION 之间的竞争条件,该问题在极少数情况下可能导致副本状态不一致。#28864 (tavplubix)。
  • 修复使用短路求值时的表达式编译。#28821 (Azat Khuzhin).
  • 修复在对所有副本进行硬重启后,ReplicatedMergeTree 副本在极少数情况下可能出现数据不一致的问题。该错误表现为 Part ... intersects (previous|next) part ...#28817 (alesapin)。
  • 更好地检查连接是否可用,并在 RabbitMQ 关闭时捕获任何异常,以防万一。#28797 (Kseniia Sumarokova).
  • 修复 ReplicatedMergeTreeQueue 中的无害竞态条件。按理说用户不应该感知到这一问题,但它可能会导致一些隐蔽的错误。#28734 (alesapin)。
  • 修复在出现异常时,带有部分创建聚合投影的 SELECT 查询可能发生的崩溃问题。#28700 (Amos Bird)。
  • 修复了在创建分布式表时,由于传入参数错误而导致的核心转储问题。#28686 (Zhiyong Wang)。
  • 为 system.processes 表添加 Settings.Names 和 Settings.Values 别名。#28685 (Vitaly).
  • 支持 S2 Geometry 库:修正 s2RectAdds2RectContains 函数所需参数的数量。#28663Bharat Nallan)。
  • 修复在使用 Nullable 或 LowCardinality 主键时发生的无效常量类型转换。 #28636 (Amos Bird).
  • 通过 PREWHERE 修复 “Column is not under aggregate function and not in GROUP BY” 报错(修复:#28461)。#28502Azat Khuzhin)。

ClickHouse 版本 v21.10,2021-10-16

向后不兼容的变更

  • 目前,以下 MergeTree 表级设置:replicated_max_parallel_sendsreplicated_max_parallel_sends_for_tablereplicated_max_parallel_fetchesreplicated_max_parallel_fetches_for_table 已不再起任何作用。它们一直工作得不理想,现已被 max_replicated_fetches_network_bandwidthmax_replicated_sends_network_bandwidthbackground_fetches_pool_size 所取代。 #28404 (alesapin)。

新特性

  • 新增对以 lambda 表达式创建用户自定义函数(UDF)的支持。语法:CREATE FUNCTION {function_name} as ({parameters}) -> {function core}。示例:CREATE FUNCTION plus_one as (a) -> a + 1。作者 @Realist007。#27796 (Maksim Kita) #23978 (Realist007).
  • 新增 Executable 存储引擎和 executable 表函数。它支持以流式方式使用外部脚本进行数据处理。#28102 (Maksim Kita) (ruct).
  • 新增 ExecutablePool 存储引擎。类似于 Executable,但使用的是一个长时间运行的进程池。#28518 (Maksim Kita).
  • 新增 ALTER TABLE ... MATERIALIZE COLUMN 查询。#27038 (Vladimir Chebotarev).
  • s3 表函数增加分区写入支持。#23051 (Vladimir Chebotarev).
  • 为数据导入 / 导出增加对 lz4 压缩格式的支持(在已有的 gzbz2xzzstd 之外)。#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” 与 DateTimeDateTime64 之间的转换函数。参见 #27058#27704 (jasine).
  • 新增 SHA512 函数。#27830 (zhanglistar).
  • 新增 log_queries_probability 设置,允许用户仅将按采样概率选取的一部分查询写入 query_log。修复 #16609#27527 (Nikolay Degterinsky).

实验性功能

  • web 类型的磁盘,用于在 Web 服务器上以静态文件形式存储只读表。参见 #23982#25251Kseniia Sumarokova)。主要用于便于测试共享存储上的操作以及轻松导入数据集。不推荐在 21.11 版本发布前使用。
  • 新增命令 BACKUPRESTORE#21945Vitaly Baranov)。该功能仍在开发中,不打算在当前版本中实际使用。

性能改进

  • 加速 sumIfcountIf 聚合函数。#28272Raúl Marín)。
  • minmax 索引创建虚拟 projection。现在,当启用 allow_experimental_projection_optimization 时,在可能的情况下,查询将使用 minmax 索引而不是读取数据。#26286Amos Bird)。
  • sequenceMatchsequenceCount 中引入两个检查,当序列模式中某些确定性部分在事件列表中缺失时,可以提前退出。此更改解锁了许多之前会因为达到操作上限而失败的查询,并且整体加快了处理流程。#27729Jakub Kuklis)。
  • 利用二元函数(尤其是非零常量除法)的“始终单调”信息增强主键分析。#28302Amos Bird)。
  • 使 hasAll 过滤条件能够利用 bloom filter 数据跳过索引。#27984Braulio Valdivielso Martínez)。
  • 通过延迟表启动过程来加速数据 part 的加载。#28313Amos Bird)。
  • 修复了可能从 WHERE 移动到 PREWHERE 的条件数量过多的问题(该优化由设置 optimize_move_to_prewhere 控制)。#28139lthaooo)。
  • 默认启用 optimize_distributed_group_by_sharding_key#28105Azat Khuzhin)。

改进

  • 在创建 Distributed 表之前检查集群名称,禁止使用错误的集群名称创建表。修复了 #27832#27927tavplubix)。
  • 类似于其他 quantile...Weighted 函数,新增聚合函数 quantileBFloat16Weighted。此更改解决了 #27745#27758Ivan Novitskiy)。
  • 允许创建空属性列表的字典。 #27905 (Maksim Kita).
  • clickhouse-client 中添加有关如何重置密码的交互式说明文档。这在用户安装 ClickHouse、设置密码后马上就忘记密码的场景中非常有用。参见 #27750#27903alexey-milovidov)。
  • 支持在 JSONAsString 输入格式中处理被数组包裹的数据。关闭 #25517#25633Kruglov Pavel)。
  • system.replicas 表添加新列 last_queue_update_exception#26843 (nvartolomei)。
  • 在故障切换时为 MaterializedPostgreSQL 表提供重连支持。关闭 #28529#28614Kseniia Sumarokova)。
  • 在服务器首次启动时生成唯一的服务器 UUID。#20089 (Bharat Nallan).
  • MySQL 引擎新增 connection_wait_timeout 设置项(默认为 5 秒,0 表示不等待)。 #28474 (Azat Khuzhin).
  • 不再允许使用无效参数创建 MaterializedPostgreSQL。关闭 #28423#28430Kseniia Sumarokova)。
  • 在垂直合并时使用实际的临时文件,而不是预定义的 "rows_sources"。这样可以避免在临时磁盘上生成无用目录。 #28299 (Amos Bird).
  • 在服务器配置中新增了 libhdfs3_conf,而不再通过在 clickhouse-server.service 中导出环境变量 LIBHDFS3_CONF 的方式进行配置。该配置用于与 HDFS 的交互。#28268 (Zhichang Yu).
  • 修复删除处于 Temporary 状态的 part 时可能引发的非预期异常(Part %name% doesn't exist)。修复了 #23661#28221 #28221)(Azat Khuzhin)。
  • 修复 zookeeper_log.address(在本 PR 的首个补丁之前,该地址始终为 ::),并减少该列中对 getpeername(2) 的调用次数(由于每次为 zookeeper_log 添加条目时都会调用 getpeername(),因此在 ZooKeeper 客户端中缓存此地址以避免重复调用)。#28212 (Azat Khuzhin).
  • 支持在 [] 运算符中使用的索引与 Map 类型键之间进行隐式转换(例如不同的 Int 类型、StringFixedString)。 #28096 (Anton Popov).
  • 在向 PostgreSQL 表引擎或表函数插入数据时支持使用 ON CONFLICT 子句。修复 #27727#28081 (Kseniia Sumarokova).
  • 放宽 Enum 数据类型的限制,以允许附加兼容数据。关闭 #26672#28028Dmitry Novik)。
  • 添加配置项 empty_result_for_aggregation_by_constant_keys_on_empty_set 来控制在空集合上对常量键进行分组时的行为。用于恢复 #6842 中的旧行为。 #27932Amos 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#27901Amos Bird)。
  • 将默认启用 tcp_keep_alive_timeout#27882 (Azat Khuzhin).
  • 改进在远程服务器异常终止情况下的远程查询取消。#27881 (Azat Khuzhin).
  • 对于大型 S3 对象,使用分段复制上传。 #27858 (ianton-ru)。
  • 允许库字典路径跟随符号链接进行解析。 #27815 (Kseniia Sumarokova).
  • 现在使用 ALTER MODIFY COLUMT 修改为 Nullable(T) 时不再需要执行 mutation。#27787 (victorgao)。
  • 不要静默忽略错误,也不要在 ReadBufferFromS3 中统计延迟。#27484Vladimir Chebotarev)。
  • 改进 ALTER ... MATERIALIZE TTL,使其仅重新计算元数据而不实际执行 TTL 操作。#27019 (lthaooo).
  • 允许在文件末尾(EOF)没有换行符的情况下读取自定义顶级域名列表。#28213 (Azat Khuzhin)。

错误修复

  • 修复从 carbon-clickhouse 读取压缩数据时出现 “attempt to read after end of file” 错误的问题。修复 #26149#28150 (FArthur-cmd)。
  • 修复了在执行包含 ON CLUSTER 子句的 GRANT WITH REPLACE 语句时检查访问权限授予的问题。此 PR 在修复 #27001 的基础上作了改进。#27983 (Vitaly Baranov)。
  • 允许在设置 extremes = 1 时,从类型为 LowCardinality(UUID) 的列中进行查询。#27918 (Vitaly Baranov).
  • 修复在处理负数时的 PostgreSQL 风格类型转换(:: 运算符)。 #27876 (Anton Popov).
  • #26864 之后,修复了 NamedSessionStorage 的关闭逻辑:现在会在销毁全局上下文之前销毁存储在 NamedSessionStorage 中的会话上下文。#27875Vitaly Baranov)。
  • 修复 windowFunnel "strict" 模式中的问题。解决了 #27469#27563achimbab)。
  • 修复读取被截断的 bzip2 压缩包时出现的无限循环问题。 #28543 (Azat Khuzhin).
  • 修复 MaterializedMySQL 内部 DDL 在执行 DROP TABLE 时出现的 UUID 冲突问题。MaterializedMySQL 是一个实验性功能。#28533 (Azat Khuzhin)。
  • 修复在对包含 Nested 列,以及名称中带点且与 Nested 列具有相同前缀的标量列(例如 n.id UInt32, n.arr1 Array(UInt64), n.arr2 Array(UInt64))的表执行查询时出现的 There is no subcolumn 错误。 #28531 (Anton Popov).
  • 修复一个问题,该问题可能在对 ReplicatedVersionedCollapsingMergeTree 执行 ALTER 后导致错误 Existing table metadata in ZooKeeper differs in sorting key expression.。修复了 #28515#28528alesapin)。
  • 修复了在后台处理分布式 DDL 队列时可能出现的 ZooKeeper watch 泄漏问题(影响较小)。已关闭 #26036#28446tavplubix)。
  • 修复 MaterializedPostgreSQL 引擎中对表名缺少引号的问题。关闭问题 #28316#28433Kseniia Sumarokova)。
  • 修复在可为空列上进行 JOIN 时未匹配行的错误行为。关闭 #27691#28349 (vdimir)。
  • 修复在未使用全部键列时的 NOT-IN 索引优化问题。此更改修复了 #28120#28315Amos Bird)。
  • 修复由于新 part 被替换为空 part 而导致 part 相互交叉的问题。#28310 (Azat Khuzhin).
  • 修复在 Merge 表上启用 optimize_read_in_order 设置后,带有 ORDER BY 的查询结果不一致的问题。#28266Anton Popov)。
  • 修复了在类型为 Nullable(LowCardinality) 且将 extremes 设置为 1 的查询中,可能发生的未初始化内存读取问题。修复了 #28165#28205Nikolai Kochetov)。
  • 针对 projections 的多个小修复。详情见 PR 说明。#28178 (Amos Bird)。
  • 修复由于 context/config 重载器关闭顺序不正确而导致的,在关闭时极少发生的段错误。 #28088 (nvartolomei).
  • 修复函数 JSONExtract 在处理类型为 Nullable(String) 的 NULL 值时的行为。此修复解决了 #27929#27930。该问题是在 https://github.com/ClickHouse/ClickHouse/pull/25452 中引入的。#27939Amos Bird)。
  • 针对新的 clickhouse-keeper 工具进行了多项修复。修复了 clickhouse-keeper 中的一个罕见错误,即客户端可能在完整的请求-响应流程之前收到 watch 响应。#28197 (alesapin)。修复了 clickhouse-keeper 中的错误行为,即在对子节点执行 set 请求时会触发列表 watch(getChildren)。#28190 (alesapin)。修复了一个罕见问题,即更改 clickhouse-keeper 设置可能导致日志丢失和服务器挂起。#28360 (alesapin)。修复了 clickhouse-keeper 中的一个错误,在减小 rotate_logs_interval 时可能导致日志持续输出。#28152 (alesapin)。

构建/测试/打包改进

  • 在压力测试中启用 Thread Fuzzer。Thread Fuzzer 是 ClickHouse 的一项功能,可以测试更多线程调度的组合,从而发现更多潜在问题。此更改关闭了 #9813#9814#9515#9516#27538alexey-milovidov)。
  • 为测试环境新增日志级别 test,其详细程度甚至高于默认的 trace#28559alesapin)。
  • 在 CMake 配置阶段输出 git 状态信息。#28047Braulio Valdivielso Martínez)。
  • 临时将 Ubuntu APT 软件仓库切换为镜像 ru.archive.ubuntu.com,因为默认仓库(archive.ubuntu.com)在我们的 CI 中没有响应。#28016Ilya 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),并且参数必须相同。这不会影响某些特殊的聚合函数,如 quantilesequence*,它们只在最终计算时使用参数。#26847 (tavplubix).
  • 在 clickhouse-local 下,总是将带端口的本地地址视为远程地址。#26736 (Raúl Marín).
  • 修复在某些复杂查询中,当列别名与表达式名称相同的情况下,可能发生错误类型转换的问题。修复了 #25447。修复了 #26914。此修复可能引入向后不兼容性:如果存在名称相同但表达式不同的情况,将抛出异常。如果设置了 enable_optimize_predicate_expression,这可能会在一些罕见场景中导致问题。#26639 (alexey-milovidov).
  • 现在,如果标量子查询的类型可以是 Nullable,它总是返回 Nullable 结果。这是必要的,因为在子查询结果为空的情况下,其结果应为 Null。此前,有可能出现类型不兼容错误(类型推导不会执行标量子查询,并且可能使用非 Nullable 类型)。对结果为空且无法转换为 Nullable(例如 ArrayTuple)的标量子查询,现在会抛出错误。修复了 #25411#26423 (Nikolai Kochetov).
  • 引入 here document 语法。例如:SELECT $doc$ VALUE $doc$#26671 (Maksim Kita)。如果查询中存在包含 $ 的标识符,此变更将导致向后不兼容。#28768
  • 现在索引可以处理 Nullable 类型,包括 isNullisNotNull#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)。
  • INTERSECTEXCEPTANYALL 运算符添加支持。 #24757 (Kirill Ershov). (Kseniia Sumarokova).
  • 在虚拟文件系统层面添加对静态数据加密的支持,使用 AES-CTR 算法。#24206Latysheva Alexandra)。(Vitaly Baranov#26733 #26377 #26465
  • 在同义词扩展中新增了用于分词、词干提取、词形还原和搜索的自然语言处理(NLP)函数。#24997Nikolay Degterinsky)。
  • 增加了对 S2 几何库的集成。#24980 (Andr0901). (Nikita Mikhaylov).
  • 新增 SQLite 表引擎、表函数和数据库引擎。 #24194 (Arslan Gumerov). (Kseniia Sumarokova).
  • MySQLPostgreSQLClickHouseJDBCCassandra 字典源添加了对自定义查询的支持。关闭 #1270#26995Maksim Kita)。
  • 通过 ZooKeeper 为用户、角色、行策略、配额和设置配置文件添加共享(副本)存储。#27426 (Kevin Michel)。
  • INTO OUTFILE 新增可自动选择压缩算法的压缩功能。关闭 #3473#27134Filatenkov Artur)。
  • 新增 INSERT ... FROM INFILE,用法类似于 SELECT ... INTO OUTFILE#27655 (Filatenkov Artur)。
  • 添加了 complex_key_range_hashed 字典。修复了 #22029#27629Maksim Kita)。
  • 在 JOIN 的 ON 子句中支持使用表达式。关闭 #21868#24420Vladimir C)。
  • 当客户端连接到服务器时,它会接收服务器已收集的所有警告信息。(可以通过选项 --no-warnings 禁用此行为)。新增 system.warnings 表,用于收集关于服务器配置的警告。#26246 (Filatenkov Artur). #26282 (Filatenkov Artur).
  • 允许在聚合函数参数中使用来自 WITH 子句和 SELECT 子句的常量表达式。关闭 #10945#27531abel-cheng)。
  • 新增函数 tupleToNameValuePairs,用于将具名元组转换为键值对数组。 #27505 (Braulio Valdivielso Martínez).
  • 为导入/导出添加对 bzip2 压缩方法的支持。修复了 #22428#27377Nikolay Degterinsky)。
  • 新增 bitmapSubsetOffsetLimit(bitmap, offset, cardinality_limit) 函数。它会基于 offset 的偏移创建一个 bitmap 的子集,并将结果的基数限制为 cardinality_limit#27234 (DHBin)。
  • system.users 中添加 default_database 列。 #27054 (kevin wan).
  • 在表函数 'cluster' 和 'clusterAllReplicas' 中增加对 cluster 宏的支持。#26913 (polyprogrammist).
  • 新增函数 currentRoles(), enabledRoles(), defaultRoles(). #26780 (Vitaly Baranov).
  • 新增函数 currentProfiles(), enabledProfiles(), defaultProfiles(). #26714 (Vitaly Baranov).
  • 新增用于返回当前查询 (initial_)query_id 的函数。此更改关闭了 #23682#26410Alexey Boykov)。
  • 新增 REPLACE GRANT 功能。 #26384 (Caspian).
  • EXPLAIN 查询现在新增了 EXPLAIN ESTIMATE ... 模式,可显示从 MergeTree 表中读取的行数、marks 和 parts 等信息。修复了 #23941#26131fastio)。
  • 添加了 system.zookeeper_log 表,用于记录 ZooKeeper 客户端的所有操作。实现了 #25449#26129tavplubix)。
  • 为基于 HDFS 存储的 ReplicatedMergeTree 引入零拷贝复制。#25918 (Zhichang Yu)。
  • 允许在 ArrowORCParquet 输入格式中将 Nested 类型以结构体数组的形式插入。#25902 (Kruglov Pavel)。
  • 新增数据类型 Date32(以 Int32 存储数据),支持与 DateTime64 相同的日期范围,支持将 Parquet 的 date32 加载到 ClickHouse 的 Date32。新增函数 toDate32,用法类似 toDate#25774 (LiuNeng)。
  • 允许为用户设置默认数据库。 #25268#25687 (kevin wan).
  • MongoDB 引擎添加了一个可选参数,用于接收连接字符串选项并支持 SSL 连接。修复了 #21189。修复了 #21041#22045Omar Bazaraa)。

实验功能

  • 新增压缩编解码器 AES_128_GCM_SIV,它会对列进行加密而不是压缩。#19896PHO)。该功能将被重写,请不要使用。
  • MaterializeMySQL 重命名为 MaterializedMySQL#26822tavplubix)。

性能改进

  • 通过减少 clock_gettime 系统调用的次数,在 max_execution_time = 0 时提升快速查询的性能。#27325filimonov)。
  • 对与日期时间相关的比较做专门优化,以获得更好的性能。这修复了 #27083#27122Amos Bird)。
  • 在对相同文件进行并发读取时共享文件描述符。在 Linux 上没有明显的性能差异,但在典型服务器上,打开文件的数量将显著(10 到 100 倍)减少,从而简化运维。参见 #26214#26768alexey-milovidov)。
  • 降低需要从包含大量列的表中读取数据的短查询的延迟。#26371Anton Popov)。
  • 在分析查询时不再为索引构建集合。#26365Raúl Marín)。
  • 对具有原生表示的 Nullable 整数类型的 SUM 聚合进行向量化处理(David ManzanaresRaúl Marín)。#26248Raúl Marín)。
  • 编译涉及 Enum 类型列的表达式。#26237Maksim Kita)。
  • 编译聚合函数 groupBitOrgroupBitAndgroupBitXor#26161Maksim Kita)。
  • 在读取空 DEFAULT 列时,通过更准确的块大小预测来优化内存使用。修复了 #17317#25917Vladimir Chebotarev)。
  • 在包含 ORDER BY primary_key 的查询中减少内存使用和读取行数。#25721Anton Popov)。
  • 默认启用 distributed_push_down_limit#27104Azat Khuzhin)。
  • 当 timeZone 是常量值时,使 toTimeZone 保持单调性,以在使用如下 SQL 时支持分区裁剪。#26261huangzhaowei)。

改进

  • 将窗口函数标记为正式可用。移除 allow_experimental_window_functions 设置。#27184 (Alexander Kuzmenkov).
  • 改进对非整分钟时区偏移量的兼容性。#27080Raúl Marín)。
  • 如果 File 表中的文件描述符是普通文件,则允许从中多次读取。这样,如果 stdin 是一个普通文件,例如 clickhouse-local --query "SELECT * FROM table UNION ALL SELECT * FROM table" ... < file,就允许 clickhouse-local 多次从 stdin 读取(通过多个 SELECT 查询或子查询)。这关闭了 #11124。与 (alexey-milovidov) 共同完成。#25960 (BoloniniD)。
  • 删除重复的索引分析,并在投影分析过程中避免潜在的无效 LIMIT 检查。 #27742 (Amos Bird).
  • 启用在 HTTP 请求正文中传递查询参数。#27706Hermano Lustosa)。
  • 禁止在分区表达式中使用 arrayJoin#27648Raúl Marín)。
  • 当身份验证失败时,记录客户端 IP 地址。 #27514 (Misko Lee).
  • 在 GRPC 协议中对二进制数据使用 bytes 类型而非字符串。#27431 (Vitaly Baranov)。
  • 如果未设置 HTTP 端口,而用户却尝试向 TCP 端口发送 HTTP 请求,则返回包含错误信息的响应。#27385 (Braulio Valdivielso Martínez).
  • 为内部使用添加 _CAST 函数,该函数不会保留类型的可空属性,而非内部的 cast 将会根据设置 cast_keep_nullable 来保留可空属性。关闭了 #12636#27382Kseniia Sumarokova)。
  • 添加 log_formatted_queries 设置,以将额外的格式化查询记录到 system.query_log 中。由于 normalizeQuerynormalizeQueryKeepNames 等函数为了提高性能,不会对查询进行解析或格式化,因此这对于标准化查询分析非常有用。 #27380 (Amos Bird)。
  • 添加两个设置 max_hyperscan_regexp_lengthmax_hyperscan_regexp_total_length,用于防止在与 Hyperscan 相关的函数(例如 multiMatchAny)中使用超大的正则表达式。#27378 (Amos Bird)。
  • 位图聚合函数所消耗的内存现在会被计入内存限制中。这修复了 #26555#27252alexey-milovidov)。
  • 为 S3 代理解析器添加 10 秒的缓存。#27216 (ianton-ru)。
  • 将全局互斥锁拆分为针对每个正则表达式构造的独立锁。这有助于避免耗时的正则表达式构造阻塞其他相关线程。#27211 (Amos Bird).
  • 为 PostgreSQL 数据库引擎添加 schema 支持。关闭 #27166#27198Kseniia Sumarokova)。
  • 在 clickhouse-client 中监控内存使用情况。 #27191 (Filatenkov Artur).
  • 尝试即使在查询未能启动时也在 system.query_log 中记录 query_kind#27182 (Amos Bird)。
  • 在表 system.replicas 中新增了列 replica_is_active,用于将副本名称映射到该副本是否处于活动状态。解决了 #27138 问题。#27180Maksim Kita)。
  • 支持在 Web UI 中通过服务器 URI 传递查询设置。 #27177 (kolsys).
  • 新增一个名为 MaxPushedDDLEntryID 的指标,表示当前节点已推送到 ZooKeeper 的最大 DDL 条目 ID。#27174Fuwang Hu)。
  • 改进了 clickhouse-keeper 在创建 znode 时对存在条件和空字符串节点的判断逻辑。#27125 (小路)。
  • Merge JOIN 现在可以正确处理右侧的空集合。#27078 (Vladimir C)。
  • 现在,这些函数可以作为分片级常量使用,这意味着如果在某个分布式表的上下文中执行,它会生成一个普通列;否则,则只会产生一个常量值。典型函数包括:hostName(), tcpPort(), version(), buildId(), uptime() 等。#27020Amos Bird)。
  • 更新了 extractAllGroupsHorizontal —— 现在可以通过可选的第三个参数为每行匹配结果的数量设置上限。#26961Vasily Nemkov)。
  • 通过 system.rocksdb 表暴露 RocksDB 统计信息。从 ClickHouse 配置中读取 RocksDB 相关选项(rocksdb... 键)。注意:ClickHouse 并不依赖 RocksDB,它只是众多可选的集成存储引擎之一。#26821 (Azat Khuzhin)。
  • 更简洁的内部 RocksDB 日志。注意:ClickHouse 并不依赖 RocksDB,它只是众多额外集成的存储引擎之一。此更改解决了 #26252#26789alexey-milovidov)。
  • 更改默认角色只会影响新的会话。#26759Vitaly Baranov)。
  • 在 Docker 中默认禁用 Watchdog。修复了未处理 Ctrl+C 信号的问题。#26757 (Mikhail f. Shiryaev).
  • SET PROFILE 现在也会应用传入 profile 上设置的约束。#26730 (Vitaly Baranov)。
  • 改进对 KILL QUERY 请求的处理。 #26675 (Raúl Marín).
  • mapPopulatesSeries 函数现已支持 Map 类型。#26663Ildus Kurbangaliev)。
  • 修复了在使用 skip_unavailable_shards 时出现的连接尝试次数过多(翻倍)的问题。 #26658 (Azat Khuzhin).
  • 避免 clickhouse-benchmark 在连接失败时挂起(例如出现 EMFILE 错误)。#26656 (Azat Khuzhin)。
  • 允许 Kafka 引擎使用更多线程。#26642 (feihengye).
  • clickhouse-benchmark 增加轮询(round-robin)支持(除统计报告外,其与常规的多主机/端口运行没有区别)。#26607 (Azat Khuzhin)。
  • 可执行字典(executableexecutable_pool)现已支持使用 clickhouse-local 通过 DDL 查询创建。关闭了 #22355#26510Maksim Kita)。
  • mysqlpostgresql 兼容性协议处理程序设置客户端查询类型。 #26498 (anneji-dev).
  • 在分片上对类似 SELECT * FROM dist ORDER BY key LIMIT 10 的查询下推并应用 LIMIT,需设置 distributed_push_down_limit=1。避免对类似 SELECT DISTINCT shading_key FROM dist ORDER BY key 的查询执行 Distinct/LIMIT BY 阶段。现在,在 optimize_distributed_group_by_sharding_key 优化中也会正确遵循 distributed_push_down_limit#26466Azat Khuzhin)。
  • 将 Protobuf 更新到 3.17.3。变更日志可在 https://github.com/protocolbuffers/protobuf/releases 查看。#26424Ilya 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#26322alexey-milovidov)。
  • sleep / sleepEachRow 的 profile 调用添加事件。#26320 (Raúl Marín)。
  • 允许在不同集群之间重用分片连接,这也避免了在使用 cluster 表函数时创建新连接。#26318 (Amos Bird).
  • 通过一个带默认值的参数控制清理旧临时目录的执行周期。#26212#26313 (fastio)。
  • 添加设置项 function_range_max_elements_in_block,用于调节函数 range 生成数据量的安全阈值。此更改关闭了 #26303#26305alexey-milovidov)。
  • 在创建表时检查哈希函数,而不是在采样时检查。为 MergeTree 添加相关设置:如果有人创建了一个具有错误采样列的表但从未使用采样,则可以禁用该设置,从而在启动服务器时不抛出异常。 #26256 (zhaoyu).
  • 添加了 output_format_avro_string_column_pattern 设置,用于将指定的 String 列在 Avro 中作为字符串输出,而不是默认的字节。实现了 #22414#26245Ilya Golshtein)。
  • system.columns 表中新增关于 LogTinyLog 表列大小的信息。此更改解决了 #9001#26241Nikolay Degterinsky)。
  • 在查询 system.detached_parts 表时,如果存在自定义磁盘配置,并且某些磁盘上不存在 detached 目录,则不再抛出异常。修复了 #26078#26236alexey-milovidov)。
  • 检查键中是否使用了非确定性函数,包括 now()today() 等常量表达式。已关闭 #25875。已关闭 #11333#26235alexey-milovidov)。
  • 在 PostgreSQL 表引擎中将 timestamptimestamptz 数据类型转换为 DateTime64#26234 (jasine).
  • 对 projection 应用更激进的 IN 索引分析,以便能选出更优的 projection 候选。 #26218 (Amos Bird).
  • 当对 IN 传入标量函数时,移除 GLOBAL 关键字。在之前的版本中,如果用户写 GLOBAL IN f(x) 会抛出异常。#26217Amos Bird)。
  • 将错误 ID(例如 BAD_ARGUMENTS)添加到异常消息中。这一改动关闭了 #25862#26172alexey-milovidov)。
  • 修复了在使用 --progress 选项运行 clickhouse-local 时输出不正确的问题。进度条在达到 100% 后将被清除,与 clickhouse-client 的行为相同。解决了 #17484#26128 (Kseniia Sumarokova)。
  • 添加 merge_selecting_sleep_ms 设置。 #26120 (lthaooo).
  • 移除带有单块预读的复杂 Linux AIO 用法,并改为使用基于 O_DIRECT 的简单同步 IO。在之前的版本中,如果 max_threads 大于 1,min_bytes_to_use_direct_io 设置可能无法正常生效。使用 direct IO 进行读取(对查询默认禁用、对大型合并默认启用)将以效率较低的方式工作。修复了 #25997#26003alexey-milovidov)。
  • 在执行 REPLACE TABLE 查询时刷新 Distributed 表。解决 #24566 —— 如果在 [CREATE OR] REPLACE TABLE ... AS SELECT 查询中向新表插入数据失败,则不要替换(或创建)该表。解决 #23175#25895 (tavplubix)。
  • system.query&#95;log 中添加 views 列,用于记录查询执行的(物化或实时)视图名称。新增日志表(system.query_views_log),用于记录查询执行期间每个被执行视图的信息。修改视图执行行为:在执行视图时抛出异常的情况下,任何已经开始执行的视图都会继续运行直到完成。此前只有在 parallel&#95;view&#95;processing=true 时才是这种行为,现在在所有情况下都一致。依赖视图现在会向上下文报告读取进度。#25714Raúl Marín)。
  • 在执行完分布式查询后,将异步进行连接清理。新增服务端设置 max_threads_for_connection_collector,用于指定在后台回收连接的工作线程数量。如果连接池已满,则连接将同步清理,但行为与之前略有不同:清理操作会在向客户端发送 EOS 之后进行,查询在收到足够数据后会立即成功返回,且任何异常都会被记录到日志中,而不会再抛给客户端。新增设置 drain_timeout(默认 3 秒)。连接清理在超时后会断开连接。#25674Amos Bird)。
  • 在配置中支持使用多个 include。现在可以从多个来源引入用户配置和远程服务器配置。只需放置带有 from_zkfrom_envincl 属性的 <include /> 元素,它就会被相应的替代内容所替换。#24404 (nvartolomei)。
  • 修复在 insert_distributed_one_random_shard = 1 时向分布式表进行多块数据插入的问题。这是一个边缘特性。标记为改进。#23140 (Amos Bird)。
  • Map 类型的键/值提供对 LowCardinalityFixedString 的支持。#21543 (hexiaoting)。
  • 支持重新加载本地磁盘配置。#19526 (taiyang-li)。

缺陷修复

  • 修复了几个可能导致副本不一致的 bug。#27808 (tavplubix).
  • 修复了 DROP PART 中的一个罕见 bug,该问题可能会导致出现错误 Unexpected merged part intersects drop range#27807 (alesapin).
  • 修复当来自 Kafka 的 NULL(“tombstone”)消息到来时导致某些格式崩溃的问题。修复了 #19255#27794filimonov)。
  • 修复在子查询中使用 UNION DISTINCT 时的列过滤问题。关闭了 #27578#27689Kseniia Sumarokova)。
  • 修复在对由不同非数值类型(例如 DateTimeDateTime64)组成的 LowCardinality Nullable 数组应用 arrayHas 等函数时出现的不正确类型转换问题。在之前的版本中会发生错误的类型转换,在新版本中将改为抛出异常。修复了 #26330#27682alexey-milovidov)。
  • 修复 postgresql 表函数导致连接无法被关闭的问题。关闭 #26088#27662Kseniia Sumarokova)。
  • 修复了另一处会触发 Unexpected merged part ... intersecting drop range ... 错误的问题。#27656tavplubix)。
  • 修复 Distributed 表中带有别名的列相关的错误。#27652 (Vladimir C)。
  • 在将 max_memory_usage* 设置为非零值之后,无法将其重置为 0(表示无限制)。此问题已修复。#27638 (tavplubix)。
  • 修复了在从各个组件构造时间值时发生的下溢问题。关闭 #27193#27605Vasily Nemkov)。
  • 修复在投影物化期间由于某些数据部分缺少列而导致的崩溃问题。此修复解决了 #27512#27528Amos Bird)。
  • 修复度量指标 BackgroundMessageBrokerSchedulePoolTask,之前可能存在拼写错误。#27452Ben)。
  • 修复在分片数为零且包含聚合时的分布式查询。 #27427 (Azat Khuzhin)。
  • /proc/meminfo 不包含 KB 后缀时提供兼容处理。#27361 (Mike Kot)。
  • 修复在启用行级安全且使用 PREWHERE 和 LowCardinality 过滤条件的查询中返回错误结果的问题。修复 #27179#27329Nikolai Kochetov)。
  • 修复了对使用旧语法创建的 MergeTree 表的分区 ID 的错误校验。#27328 (tavplubix).
  • 修复在使用并行格式(CSV/TSV)时的 MySQL 协议问题。 #27326 (Raúl Marín).
  • 修复在包含采样的查询中出现 Cannot find column 错误的问题。该问题是在 #24574 中引入的。此修复解决了 #26522#27301Nikolai Kochetov)。
  • 修复在 PREWHERE 中使用 LowCardinality 的某些查询出现的错误,例如 Expected ColumnLowCardinality, gotUInt8Bad cast from type DB::ColumnVector<char8_t> to DB::ColumnLowCardinality。更重要的是,修复错误消息中缺少空格的问题。修复了 #23515#27298Nikolai Kochetov)。
  • 修复 distributed_group_by_no_merge = 2 搭配 distributed_push_down_limit = 1,或 optimize_distributed_group_by_sharding_key = 1 搭配 LIMIT BYLIMIT OFFSET 时的问题。#27249Azat Khuzhin)。这些是几乎没有人使用的冷门配置组合。
  • 修复在非复制 MergeTree 表中因无效分区导致变更任务卡住的问题。 #27248 (Azat Khuzhin).
  • 在存在歧义的情况下,lambda 函数会优先将名称解析为其参数,而不是其他别名或标识符。#27235Raúl Marín)。
  • 修复合并 JOIN 中的列结构,关闭 #27091#27217Vladimir C)。
  • 在极少数情况下,system.detached_parts 表中可能会包含某些部分的错误信息,此问题已修复。修复了 #27114#27183tavplubix)。
  • 修复 multiSearch* 函数在处理空数组时的未初始化内存问题,关闭 #27169#27181Vladimir C)。
  • 修复 GRPCServer 中的同步问题。此 PR 修复了 #27024#27064Vitaly Baranov)。
  • 修复了 cachecomplex_key_cachessd_cachecomplex_key_ssd_cache 的配置解析。选项 allow_read_expired_keysmax_update_queue_sizeupdate_queue_push_timeout_millisecondsquery_wait_timeout_milliseconds 之前不会为非 cache 类型的字典进行解析。#27032Maksim Kita)。
  • 修复由于与 DROP_RANGE 发生竞态而可能导致的 mutation 堆积问题。 #27002 (Azat Khuzhin).
  • 现在,在类似 ALTER TABLE ... PARTITION ID xxx 的查询中,会对分区 ID 进行正确性校验。修复了 #25718#26963alesapin)。
  • 在某些情况下,修复在使用多个 JOIN 时出现的 "Unknown column name" 错误,并关闭 #26899#26957Vladimir C)。
  • 修复自定义 TLD 读取问题(在缓冲区较小或文件较大时会停止处理)。#26948 (Azat Khuzhin).
  • 修复当 DEFAULT 列引用其他没有 DEFAULT 表达式的非物化列时出现的 Missing columns: 'xxx' 错误。修复 #26591#26900alesapin)。
  • 修复在 library-bridge 中从 library 字典源加载字典键的逻辑。 #26834 (Kseniia Sumarokova).
  • 在应用某些 combinator 时,聚合函数参数可能会丢失,从而导致如下异常:Conversion from AggregateFunction(topKArray, Array(String)) to AggregateFunction(topKArray(10), Array(String)) is not supported。该问题已修复。修复了 #26196#26433#26814tavplubix)。
  • 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)。#26703Raúl Marín)。
  • 修复了窗口函数中可能出现的 nullptr 解引用。修复了 #25276#26668Alexander Kuzmenkov)。
  • 修复在从 3 年前版本的 clickhouse-client 升级时,当 clickhouse-client 历史记录文件为空时的历史文件转换问题。 #26589 (Azat Khuzhin).
  • 修复了 groupBitmapAnd/Or/Xor 在某些情况下显示错误函数名的问题。 #26557 (Amos Bird).
  • 更新 clickhouse-server Docker entrypoint 中对 chown 命令的检查逻辑。此修复解决了在 Kubernetes 上集群 pod(容器组)重启失败(或超时)的问题。#26545 (Ky Li)。
  • 修复在尚未启动 RabbitMQ 时执行 RabbitMQ 关闭操作会导致崩溃的问题,关闭了 #26504#26529Kseniia Sumarokova)。
  • 修复在 CREATE DICTIONARY 查询中使用带引号的字典名称或数据库名称时出现的问题。修复 #26491#26508Maksim Kita)。
  • 修复在重写列别名后出现的列名解析问题。此更改修复了 #26432#26475Amos Bird)。
  • 修复了一些由模糊测试触发的 msan 崩溃。修复了 #22517#26428Nikolai Kochetov)。
  • 修复在 partial_merge_join 关闭时出现的未连接数据块无限流问题 #26325#26374Vladimir C)。
  • 修复以已删除用户身份登录时可能发生的崩溃。此 PR 修复了 #26073#26363Vitaly Baranov)。
  • 修复 optimize_distributed_group_by_sharding_key 在多列表达式分片键场景下的问题(当 optimize_skip_unused_shards=1/allow_nondeterministic_optimize_skip_unused_shards=1 且分片键表达式包含多列时,会产生错误结果)。#26353Azat Khuzhin)。
  • 修复了在丢失副本恢复过程中可能导致副本数据出现不一致的罕见错误。#26321 (tavplubix).
  • 修复了在内部缓冲区末尾存在转义序列时的 zstd 解压缩问题(用于导入/导出采用 zstd 帧格式且与表数据无关的数据)。关闭 #26013#26314Kseniia Sumarokova)。
  • 修复在包含 totalsJOIN 中的逻辑错误,关闭 #26017#26250Vladimir C)。
  • 移除 system.stack_trace 表中 thread_name 列中多余的换行符。此更改修复了 #24124#26210alexey-milovidov)。
  • 修复在同时使用多个 untuple 表达式时可能发生的崩溃问题。#26179alexey-milovidov)。
  • 当 Enum 未为 0 定义对应值时,不要在 Nullable Enum 的 toString 中抛出异常,关闭 #25806#26123Vladimir C)。
  • 修复了 ClickHouse 在查询执行期间发生异常时,通过 MySQL 协议发送的数据包中错误的 sequence_id。该问题可能会导致 MySQL 客户端重置与 ClickHouse 服务器的连接。修复了 #21184#26051tavplubix)。
  • 修复 cutToFirstSignificantSubdomainCustom()/cutToFirstSignificantSubdomainCustomWithWWW()/firstSignificantSubdomainCustom() 对常量返回错误类型、从而导致 optimize_skip_unused_shards 不生效的情况。#26041 (Azat Khuzhin)。
  • 修复在将普通投影与 prewhere 联合使用时可能出现的 header 不匹配问题。此更改修复了 #26020#26038Amos Bird)。
  • 修复了 remote() 在使用未经过函数处理的列作为 sharding_key 时的问题(此前 select * from remote('127.1', system.one, dummy) 会导致 Unknown column: dummy, there are only columns . 错误)。#25824 (Azat Khuzhin)。
  • 修复了从 MaterializeMySQL 进行查询时出现的 Not found column ...Missing column ... 错误。修复了 #23708#24830#25794#25822tavplubix)。
  • 修复 optimize_skip_unused_shards_rewrite_in 在处理非 UInt64 类型时的问题(否则最终可能会选择错误的分片,或抛出 Cannot infer type of an empty tupleFunction tuple requires at least one argument)。 #25798 (Azat Khuzhin).

构建/测试/打包改进

  • 现在我们会在随机时区下运行有状态和无状态测试。修复了 #12439。在 Protobuf 格式中,将 String 读取为 DateTime 和将 DateTime 写为 String 时,现在会考虑时区。在 Arrow 和 Parquet 格式中,将 UInt16 读取为 DateTime 时,现在会先将其视为 Date,然后再根据 DateTime 的时区转换为 DateTime,因为在 Arrow 和 Parquet 中,Date 是以 UInt16 进行序列化的。GraphiteMergeTree 现在在时间取整时会考虑时区。修复了 #5098。作者:@alexey-milovidov。#15408alesapin)。
  • clickhouse-test 支持带有 Jinja2 模板的 SQL 测试。#26579Vladimir C)。
  • 增加了对使用 clang-13 进行构建的支持。关闭 #27705#27714alexey-milovidov)。#27777Sergei Semin
  • 添加了 CMake 选项,以便在构建时启用或禁用特定 CPU 指令集。这与 #17469#27509 相关。#27508alexey-milovidov)。
  • 修复了在使用动态库时辅助程序的链接问题。#26958Raúl Marín)。
  • 将 RocksDB 更新到 2021-07-16 的 master 版本。#26411alexey-milovidov)。

ClickHouse 发布 v21.8,2021-08-12

升级说明

  • 新版本在系统日志表(system.query_logsystem.query_thread_logsystem.processessystem.opentelemetry_span_log)中使用 Map 数据类型。这些表将会自动以新的数据类型创建。为支持旧查询,会创建虚拟列。关闭 #18698#23934#25773hexiaotingsundy-liMaksim Kita)。如果希望从 21.8 版本降级到更早的版本,需要手动清理系统日志表。请查看 /var/lib/clickhouse/data/system/*_log

新功能

  • 新增对 SQL/JSON 标准部分特性的支持。#24148 (l1tsolaiki, Kseniia Sumarokova)。
  • system.asynchronous_metricssystem.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)。
  • mapAddmapSubtract 函数中支持使用 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_logsystem.query_thread_logsystem.processessystem.opentelemetry_span_log)采用 Map 数据类型。这些表将会使用新的数据类型自动创建。会创建虚拟列以兼容旧查询。关闭了 #18698#23934#25773hexiaotingsundy-liMaksim Kita)。
  • 对于具有复杂键且仅包含一个属性的字典,在使用 dictGetdictHas 函数时,允许不将键表达式封装为 tuple。 #26130 (Maksim Kita)。
  • 基于 AggregateFunction 状态实现 bin/hex 函数。#26094zhaoyu)。
  • emptynotEmpty 函数添加对 UUID 类型参数的支持。当 UUID 全为零(nil UUID)时,视为空。修复 #3446#25974zhaoyu)。
  • 在 MySQL 协议中增加对 SET SQL_SELECT_LIMIT 的支持。解决了 #17115 中的问题。#25972Kseniia Sumarokova)。
  • 为网络交互增加更多监控指标:为接收/发送字节添加计数器;为接收/发送添加仪表(gauge)。补充缺失的文档。关闭 issue #5897#25962alexey-milovidov)。
  • 新增设置 optimize_move_to_prewhere_if_final。如果查询包含 FINAL,则只有在 optimize_move_to_prewhereoptimize_move_to_prewhere_if_final 同时启用的情况下,才会启用 move_to_prewhere 优化。修复 #8684#25940Kseniia Sumarokova)。
  • 允许对 JOIN 的表使用复杂的带引号的标识符。关闭了 #17861#25924alexey-milovidov)。
  • Nested 数据类型中添加对 Unicode 组件(如中文、西里尔文)的支持。关闭 #25594#25923alexey-milovidov)。
  • 使 quantiles* 函数可与 aggregate_functions_null_for_empty 一起使用。修复 #25892#25919alexey-milovidov)。
  • 允许参数化聚合函数的参数为任意常量表达式(例如 1 + 2),而不仅仅是字面量常量。还允许在参数化聚合函数内部使用查询参数(例如在 {param:UInt8} 这样的参数化查询中)。修复 #11607#25910 (alexey-milovidov)。
  • 在尝试解析无效的 Date 时正确抛出异常。关闭了 #6481#25909alexey-milovidov)。
  • 在配置中支持多个 include。现在可以从多个来源引入 users 配置和 remote_servers 配置。只需放置带有 from_zkfrom_envincl 属性的 <include /> 元素,ClickHouse 会将其替换为相应的内容。#24404 (nvartolomei)。
  • 支持在查询中使用名为 "null" 的列(该列名必须用反引号或双引号括起来)以及 ON CLUSTER。修复了 #24035#25907alexey-milovidov)。
  • JSONExtract 增加对 LowCardinalityDecimalUUID 的支持。解决 #24606#25900Kseniia Sumarokova)。
  • 将历史记录文件从 readline 格式转换为 replxx 格式。#25888 (Azat Khuzhin)。
  • 修复一个问题,该问题可能在执行 DROP PART 或后台删除空 part 后导致部分之间发生交叠。 #25884 (alesapin).
  • 改进了对 ReplicatedMergeTree 表中丢失数据部件的处理。修复了 ReplicationQueue 中罕见的不一致问题。修复 #10368#25820alesapin)。
  • 允许在工作目录不可读时启动 clickhouse-client。#25817 (ianton-ru).
  • 修复 Merge 存储引擎中的 “No available columns” 错误。#25801 (Azat Khuzhin).
  • MySQL 引擎现在支持在 MySQL 与 ClickHouse 之间互相传递列注释。#25795 (Storozhuk Kostiantyn)。
  • 修复在空结果集上对常量执行 GROUP BY 时行为不一致的问题。关闭 #6842#25786Kseniia Sumarokova)。
  • 在对 ReplicatedMergeTree 执行 DROP PARTITIONTRUNCATE 时,取消当前分区中正在运行的合并操作。修复了 #17151#25684tavplubix)。
  • 为 MaterializeMySQL 增加对 ENUM 数据类型的支持。 #25676 (Storozhuk Kostiantyn).
  • 支持在 JOIN 中使用物化列和别名列,修复 #13274#25634Vladimir C)。
  • 修复 ALTER TABLE ... DETACH 与后台合并之间可能存在的逻辑竞态条件。#25605 (Azat Khuzhin).
  • 使 NetworkReceiveElapsedMicroseconds 指标能正确包含从客户端等待用于 INSERT 的数据的耗时。关闭 #9958#25602alexey-milovidov)。
  • 为 S3 和 HDFS 添加对 TRUNCATE TABLE 的支持。关闭 #25530#25550Kseniia Sumarokova)。
  • 支持通过动态重新加载配置来更改用于执行后台作业(合并、变更、抓取)的线程池线程数。 #25548 (Nikita Mikhaylov).
  • 允许使用 JSONExtract 将非字符串类型的元素以字符串形式提取。对应 #25414#25452Amos Bird)。
  • StorageMergeDatabase 参数中增加对正则表达式的支持。关闭 #776#25064flynn)。
  • Web UI:如果该值看起来像 URL,则自动生成链接。 #25965 (alexey-milovidov)。
  • 使 sudo service clickhouse-server start 命令能在诸如 CentOS 8 这类使用 systemd 的系统上正常工作。关闭 #14298。关闭 #17799#25921alexey-milovidov)。

缺陷修复

  • 修复在某些情况下不正确的 SET ROLE#26707 (Vitaly Baranov).
  • 修复窗口函数中潜在的 nullptr 解引用问题。修复 #25276#26668Alexander Kuzmenkov)。
  • 修正 groupBitmapAnd/Or/Xor 的函数命名错误。修复 #26557Amos Bird)。
  • 修复在关闭 RabbitMQ 时,如果 RabbitMQ 尚未启动会发生的崩溃问题。修复 #26504#26529Kseniia Sumarokova)。
  • 修复在字典名称或数据库名称被加上引号时,CREATE DICTIONARY 查询出现的问题。关闭了 #26491#26508Maksim Kita)。
  • 修复重写列别名后出现的名称解析问题。修复 #26432#26475Amos Bird)。
  • 修复在关闭 partial_merge_join 时出现的无限未连接块流问题 #26325#26374Vladimir C)。
  • 修复以已被删除用户身份登录时可能发生的崩溃。修复 #26073#26363Vitaly Baranov)。
  • 修复 optimize_distributed_group_by_sharding_key 在分片键为多列表达式时的问题(当分片键表达式包含多列并配合 optimize_skip_unused_shards=1 / allow_nondeterministic_optimize_skip_unused_shards=1 使用时,会导致结果不正确)。 #26353 (Azat Khuzhin).
  • CASTDateDateTime(或 DateTime64)时,没有使用 DateTime 类型的时区。这也会影响 DateDateTime 之间的比较。在为 DateDateTime 推断通用类型时,同样没有使用相应的时区。这影响了函数 if 和数组构造表达式的结果。修复了 #24128#24129Maksim Kita)。
  • 修复了在丢失副本恢复过程中出现的罕见 bug,可能导致副本数据不一致。 #26321 (tavplubix).
  • 修复在内部缓冲区末尾存在转义序列时的 zstd 解压缩问题。关闭 #26013#26314Kseniia Sumarokova)。
  • 修复在带 totals 的 JOIN 中的逻辑错误,关闭 #26017#26250Vladimir C)。
  • 移除 system.stack_trace 表中 thread_name 列里多余的换行符。修复 #24124#26210 (alexey-milovidov)。
  • 修复在 LowCardinality 列上使用 joinGet 时的问题,关闭 #25993#26118Vladimir C)。
  • 修复在关闭 validate_polygons 设置时 pointInPolygon 可能发生的崩溃问题。#26113 (alexey-milovidov).
  • 修复在遍历不存在的远程目录时抛出异常的问题。 #26087 (ianton-ru).
  • 修复由于 ZooKeeper 客户端中的 abort 导致的罕见服务器崩溃问题。解决了 #25813#26079alesapin)。
  • 修复在某些情况下对右侧子查询 JOIN 的线程数估计错误。关闭 #24075#26052Vladimir C)。
  • 修复了 ClickHouse 在查询执行期间引发异常时,通过 MySQL 协议发送的数据包中使用的错误 sequence_id。该问题可能导致 MySQL 客户端重置与 ClickHouse 服务器的连接。修复了 #21184#26051tavplubix)。
  • 修复在使用普通投影和 PREWHERE 时可能出现的头信息不匹配问题。修复 #26020#26038Amos Bird)。
  • 修复将具有整数键的 Map 类型格式化为 JSON 时的问题。#25982 (Anton Popov)。
  • 修复在查询分析器堆栈展开过程中可能发生的死锁。修复 #25968#25970Maksim Kita)。
  • 修复在使用错误参数调用 dictGet() 时发生的崩溃。#25913 (Vitaly Baranov)。
  • 修复了 PostgreSQL 引擎中的 scram-sha-256 身份验证。关闭了 #24516#25906Kseniia Sumarokova)。
  • 修复在后台线程池已满时后台任务退避时间过长的问题。修复了 #25836#25893alesapin)。
  • 修复在非默认页面大小情况下的 ARM 异常处理,并修复了 #25512#25044#24901#23183#20221#19703#19028#18391#18121#17994#12483#25854Maksim 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#25822tavplubix)。
  • 修复在非 UInt64 类型上使用 optimize_skip_unused_shards_rewrite_in 时的问题(可能最终会选择错误的分片,或抛出 Cannot infer type of an empty tupleFunction tuple requires at least one argument)。#25798 (Azat Khuzhin).
  • 修复在 ReplicatedMergeTree 表上执行 DROP PART 查询时出现的一个罕见错误,该错误可能会导致出现 Unexpected merged part intersecting drop range 错误信息。 #25783 (alesapin).
  • 修复在使用 GROUP BY 表达式时的 TTL 问题:在某个数据分片中首次执行后会拒绝再次执行 TTL#25743 (alesapin).
  • 允许 StorageMerge 访问带别名的表。修复了 #6051 问题。#25694Kseniia Sumarokova)。
  • 在某些情况下修复了字典连接(dict join)过慢的问题,关闭 #24209#25618Vladimir C)。
  • 修复在对参与 TTL 表达式的列执行 ALTER MODIFY COLUMN 时出现的问题。 #25554 (Anton Popov).
  • 修复在 PREWHERE 中使用非 UInt8 类型时的断言错误,关闭 #19589#25484Vladimir C)。
  • 修复了一些由模糊测试触发的 msan 崩溃。修复了 #22517#26428Nikolai Kochetov)。
  • 更新 clickhouse-server Docker 入口点中的 chown 命令检查逻辑。修复了在 Kubernetes 上出现的“集群 pod(容器组)重启失败(或超时)”错误。#26545 (Ky Li)。

ClickHouse 版本 v21.7,2021-07-09

向后不兼容变更

  • 提高了对显式定义大型集合的查询的性能。新增兼容性设置 legacy_column_name_of_tuple_literal。在将集群从低于 21.7 的版本滚动升级到任意更高版本时,建议将其设置为 true。否则,在升级期间,IN 子句中显式定义集合的分布式查询可能会失败。#25371Anton Popov)。
  • 在 clickhouse-keeper(ZooKeeper 的实验性替代方案)中更改了最大缓冲区大小,此更改在向前/向后兼容性上均不兼容。最好现在(在生产环境之前)完成这项变更,而不是以后。#25421alesapin)。

新特性

  • 支持使用 YAML 格式进行配置,作为 XML 的替代方案。此改动关闭了 #3607#21858BoloniniD)。
  • 提供了一种在数据(可能)仍然存在但 ZooKeeper 元数据丢失时恢复复制表的方法。解决了 #13458#13652Mike Kot)。
  • 在 Arrow/Parquet/ORC 中支持 structmap,并在 Arrow 输入/输出格式中支持字典。新增设置 output_format_arrow_low_cardinality_as_dictionary#24341Kruglov Pavel)。
  • 在字典中新增对 Array 类型的支持。#25119Maksim Kita)。
  • 新增函数 bitPositionsToArray。关闭 #23792。作者 [Kevin Wan] (@MaxWk)。#25394Maksim Kita)。
  • 新增函数 dateName,用于返回类似 'Friday' 或 'April' 的名称。作者 [Daniil Kondratyev] (@dankondr)。#25372Maksim Kita)。
  • 新增 toJSONString 函数,用于将列序列化为其 JSON 表示形式。#25164Amos Bird)。
  • 现在 query_log 新增了两列:initial_query_start_timeinitial_query_start_time_microsecond,用于记录分布式查询(如果有)的起始时间。#25022Amos Bird)。
  • 新增聚合函数 segmentLengthSum#24250flynn)。
  • 新增布尔设置 prefer_global_in_and_join,默认将所有 IN/JOIN 作为 GLOBAL IN/JOIN 执行。#23434Amos Bird)。
  • Join 表引擎新增对 ALTER DELETE 查询的支持。#23260foolchi)。
  • 新增聚合函数 quantileBFloat16,以及对应的 quantilesBFloat16medianBFloat16。这是一个非常简单且快速的分位数估计器,相对误差不超过 0.390625%。此改动关闭了 #16641#23204Ivan Novitskiy)。
  • 实现了在流程分析(flow analysis)中非常有用的 sequenceNextNode() 函数。#19766achimbab)。

实验特性

  • 新增对基于 HDFS 的虚拟文件系统的支持。#11058overshov)(Kseniia Sumarokova)。
  • 现在 clickhouse-keeper(ZooKeeper 的实验性替代方案)支持类似 ZooKeeper 的 digest 类型 ACL。#24448alesapin)。

性能改进

  • 添加了一项优化,将某些函数重写为读取子列,以减少读取数据量。例如,语句 col IS NULL 会被转换为读取子列 col.null。可以通过设置 optimize_functions_to_subcolumns 来启用该优化,目前默认关闭。#24406 (Anton Popov).
  • 将更多列尽可能重写为别名表达式。这可以启用更好的优化,例如投影(projections)。#24405 (Amos Bird).
  • 类型为 bloom_filter 的索引可以用于带有常量数组的 hasAny 函数表达式。修复了问题:#24291#24900 (Vasily Nemkov).
  • 在 RabbitMQ 队列为空时,为重新调度读取重试添加了指数退避机制。(ClickHouse 支持从 RabbitMQ 导入数据。)修复了问题 #24340#24415 (Kseniia Sumarokova).

改进

  • 允许限制复制时的网络带宽。添加了两个 Replicated*MergeTree 设置:max_replicated_fetches_network_bandwidthmax_replicated_sends_network_bandwidth,用于限制表的复制拉取/发送的最大速度。添加了两个服务器级别的设置(在 default 用户配置中):max_replicated_fetches_network_bandwidth_for_servermax_replicated_sends_network_bandwidth_for_server,用于限制所有表的整体复制最大速度。这些设置不会被严格精确地执行。默认禁用。修复了 #1821#24573alesapin)。
  • 为 ODBC 和 Library bridge 设置资源限制和隔离。为 bridge 进程使用单独的 clickhouse-bridge 组和用户。设置 oom_score_adj,使这些 bridge 在发生 OOM 时优先成为 OOM killer 的回收目标。将最大 RSS 限制设置为 1 GiB。修复 #23861#25280 (Kseniia Sumarokova)。
  • 为主 clickhouse 二进制文件新增独立的 clickhouse-keeper 符号链接。现在可以在不启动主 ClickHouse 服务器的情况下运行协调组件。#24059 (alesapin).
  • VIEW 的查询使用全局设置。修复了当对 VIEW 的查询使用本地设置时的行为,此前如果在 CREATE VIEWSELECT 语句中的设置不同,就会导致错误。现在,VIEW 不会再使用这些被修改的本地设置,但你仍然可以在 CREATE VIEW 查询的 SETTINGS 部分传递额外的设置。关闭 #20551#24095Vladimir)。
  • 在服务器启动时,具有错误分区 ID 的数据分片不会被删除,而是始终被标记为分离(detached)。#25070#25166 (Nikolai Kochetov)。
  • 将后台调度线程池大小增加到 128(background_schedule_pool_size 设置)。这样可以避免在 ZooKeeper 连接较慢时复制队列发生阻塞。 #25072 (alesapin)。
  • 新增 MergeTree 设置项 max_parts_to_merge_at_once,用于限制后台单次可合并的 part 数量。该设置不影响 OPTIMIZE FINAL 查询。修复了 #1820#24496alesapin)。
  • 允许在分区剪枝中使用 NOT IN 运算符。#24894 (Amos Bird)。
  • 将类似 127.0.1.1 的 IPv4 地址识别为本地地址。这一改动具有争议性,并据此关闭了 #23504。Michael Filimonov 将测试此功能。#24316 (alexey-milovidov)。
  • 通过实验性功能 MaterializeMySQL 创建的 ClickHouse 数据库,现在包含了来自对应已物化 MySQL 数据库的所有列注释。 #25199 (Storozhuk Kostiantyn).
  • 为 MySQL 存储引擎添加设置(connection_auto_close/connection_max_tries/connection_pool_size)。#24146 (Azat Khuzhin).
  • 提升 Distributed 引擎的启动速度。 #25663 (Azat Khuzhin).
  • 对 Distributed 表进行了改进:在设置 internal_replication=true 时,从 dirname 中去除副本标识(这使得在带有 cluster 的 Distributed 表上可以从任意数量的副本执行 INSERT 操作;此前仅支持最多 15 个副本,更多副本时在为异步数据块创建目录时会因目录名过长(ENAMETOOLONG)而失败)。 #25513 (Azat Khuzhin).
  • LowCardinality 添加了对 Interval 类型的支持。它用于某些表达式的中间结果值。修复了 #21730#25410Vladimir)。
  • sequenceMatchsequenceCount 函数的时间条件中支持使用 == 运算符。例如:sequenceMatch('(?1)(?t==1)(?2)')(time, data = 1, data = 2)。 #25299 (Christophe Kalenzaga)。
  • 新增设置项 http_max_fieldshttp_max_field_name_sizehttp_max_field_value_size#25296Ivan)。
  • 为函数 if 的分支添加对 DecimalInt 类型的支持。关闭了 #20549。关闭了 #10142#25283alexey-milovidov)。
  • clickhouse-client 中更新提示符,并在重新连接时显示一条消息。此更改修复了 #10577#25281alexey-milovidov)。
  • 修复聚合函数 topK 中的内存跟踪问题,从而关闭了 #25259#25260alexey-milovidov)。
  • 修复 IDN 主机(例如 example.рф)的 topLevelDomain,此前此类主机会返回空字符串。#25103 (Azat Khuzhin)。
  • 在运行时检测 Linux 内核版本(用于判断嵌套 epoll 是否可正常工作,这对于 async_socket_for_remote / use_hedged_requests 是必需的,否则远程查询可能会卡住)。#25067 (Azat Khuzhin)。
  • 对于分布式查询,当 optimize_skip_unused_shards=1 时,允许在条件类似 (sharding key) IN (one-element-tuple) 的情况下跳过分片。(已支持包含多个元素的 tuple。单元素的 tuple 之前不起作用,因为它会被解析为字面量)。#24930 (Amos Bird)。
  • 改进了 S3 错误的日志信息,当 key 或 bucket 为空时不再出现双空格。 #24897 (Vladimir Chebotarev).
  • 某些查询需要进行多轮语义分析。在这种情况下,请尝试重用为 IN 已构建的集合。#24874 (Amos Bird)。
  • 在使用 insert_distributed_sync 时应遵循 max_distributed_connections(否则在大型集群上进行同步插入时,可能会耗尽 max_thread_pool_size)。#24754 (Azat Khuzhin)。
  • 避免对标量子查询隐藏类似 Limit for rows or bytes to read exceeded 的错误。 #24545 (nvartolomei).
  • 使 String-to-Int 解析器更加严格,从而让 toInt64('+') 抛出异常。#24475 (Amos Bird)。
  • 如果通过 DDL 查询创建 SSD_CACHE,则必须在 user_files 目录下创建。 #24466 (Maksim Kita)。
  • 添加对在 PostgreSQL 插入查询中指定非默认 schema 的支持。关闭 #24149#24413 (Kseniia Sumarokova).
  • 修复 IPv6 地址解析(例如修复 select * from remote('[::1]', system.one))。#24319 (Azat Khuzhin)。
  • 在多行模式下修复带有子查询的 FROM 子句中的行尾空白,并对查询输出进行轻微调整,使其更易于阅读。#24151Azat Khuzhin)。
  • 对 Distributed 表的改进。增加在失败时拆分分布式批处理的功能(例如由于内存限制或数据损坏),通过 distributed_directory_monitor_split_batch_on_failure 控制(默认关闭)。#23864 (Azat Khuzhin)。
  • 修复 Join 表引擎中的列名冲突问题,并关闭 #20309#23769 (Vladimir)。
  • 在通过 stdin 向 clickhouse-localFile 表引擎以及 clickhouse-client 中的 INSERT 查询传递数据时显示进度。关闭 #18209#23656Kseniia Sumarokova)。
  • clickhouse-copier 进行缺陷修复和功能改进。允许复制具有不同(但兼容)schema 的表。关闭 #9159。新增用于复制 ReplacingMergeTree 的测试。关闭 #22711。支持列级 TTL 和 Data Skipping Indices。在创建内部 Distributed 表时会简单地移除这些设置(底层表仍然保留 TTL 和 skipping indices)。关闭 #19384。允许复制 MATERIALIZED 和 ALIAS 列。在某些场景下这会很有用(例如该列在 PRIMARY KEY 中)。现在可以在任务配置中将 allow_to_copy_alias_and_materialized_columns 属性设置为 true 来启用。关闭 #9177。关闭 [#11007] (https://github.com/ClickHouse/ClickHouse/issues/11007)。关闭 #9514。在任务配置中新增属性 allow_to_drop_target_partitions,用于在移动辅助表之前删除原始表中的分区。关闭 #20957。移除 OPTIMIZE DEDUPLICATE 查询。此前之所以需要这一临时方案,是因为 ALTER TABLE MOVE PARTITION 会被重试多次,而普通 MergeTree 表不支持去重。关闭 #17966。以 JSON 格式将进度写入 ZooKeeper 上 task_path + /status 路径对应的节点。关闭 #20955。支持无参数的 ReplicatedTables。关闭 #24834#23518 (Nikita Mikhaylov)。
  • 在从 S3 读取时的重试之间增加了带退避策略的休眠。 #23461 (Vladimir Chebotarev)。
  • 在对 Distributed 表执行 INSERT 时,遵循 insert_allow_materialized_columns 设置(允许物化列)。#23349 (Azat Khuzhin)。
  • 为分布式查询新增对 LIMIT 下推的支持。 #23027 (Azat Khuzhin).
  • 修复多个 S3 卷下的零拷贝复制问题(修复了 #22679)。#22864ianton-ru)。
  • 当用户向操作系统请求任意可用端口时,解析出实际绑定的端口号,并在日志消息中显示该端口号。#25569 (bnaecker).
  • 修复了在某些情况下 PostgreSQL 数组转换结果为 String 数据类型而不是 n 维数组的问题,原因是 attndims 在部分场景下工作不正确。关闭了 #24804#25538Kseniia Sumarokova)。
  • 修复了 MySQL、PostgreSQL 和 ODBC 中带时区的 DateTime 转换问题。关闭了 #5057#25528Kseniia Sumarokova)。
  • 针对不同的表区分执行 KILL MUTATION(修复意外出现的 Cancelled mutating parts 错误)。 #25025 (Azat Khuzhin).
  • 允许在 bucket 根目录下声明 S3 磁盘(S3 虚拟文件系统是一个正在开发中的实验性功能)。#24898 (Vladimir Chebotarev).
  • 为分布式表支持读取子列(例如 Tuple 的各个组件)。#24472Anton Popov)。
  • MySQL 兼容协议的一项功能:使 user 函数返回正确的输出。解决 #25697#25697sundyli)。

缺陷修复

  • 改进了向后兼容性。在用作分区键时,采用旧版本的取模函数。解决了 #23508#24157Kseniia Sumarokova)。
  • 修复了在低内存服务器上极其罕见出现的 Bug,它可能会导致除非重启否则无法执行合并操作。可能修复了 #24603#24872 (alesapin)。
  • 修复在并发执行 alter move/replace partition 时,复制队列中出现的极为罕见错误 Tagging already tagged part。可能修复了 #22142#24961alesapin)。
  • 修复在通过对其他聚合函数状态进行再次聚合来计算聚合函数状态时可能发生的崩溃问题(这并不是实际的使用场景)。参见 #24523#25015alexey-milovidov)。
  • 修复了在内存极少的服务器上执行查询 SYSTEM RESTART REPLICASYSTEM SYNC REPLICA 无法完成时的处理逻辑。#24457Nikita Mikhaylov)。
  • 修复可能导致 ZooKeeper 客户端在 clickhouse-server 中挂起的缺陷。#24721 (alesapin)。
  • 如果 ZooKeeper 连接丢失,并且在恢复连接后克隆了副本,那么其复制队列中可能会包含过时的条目。修复了当复制队列包含相交虚拟分片时触发的断言失败问题。这种情况在某些数据分片丢失时可能会极少发生。现在改为在日志中打印错误,而不是直接终止进程。#24777 (tavplubix)。
  • 修复在查询计划的表达式下推优化中丢失 WHERE 条件的问题(默认将 query_plan_filter_push_down 设置为 1)。修复 #25368#25370Nikolai Kochetov)。
  • 修复了一个在带 TTL 的合并操作后可能导致数据片段相互重叠的缺陷:Part all_40_40_0 is covered by all_40_40_1 but should be merged into all_40_41_1. This shouldn't happen often.#25549 (alesapin)。
  • 在 ZooKeeper 连接丢失时,ReplicatedMergeTree 表在尝试重新连接之前可能会等待后台操作完成。此问题已修复,现在会强制终止后台操作。#25306 (tavplubix).
  • 修复了在主键中使用数组时,包含 ARRAY JOIN 的查询出现错误 Key expression contains comparison between inconvertible types 的问题。修复了 #8247#25546Anton Popov)。
  • 修复了使用 WITH TOTALSWITH FILL 的查询中错误的总计结果。修复了 #20872#25539Anton Popov)。
  • 修复了在重新加载集群配置的同时查询 system.clusters 时出现的数据竞争问题。 #25737 (Amos Bird)。
  • 解决了在数据库之间移动 Distributed 表时出现的 No such file or directory 错误。修复 #24971#25667tavplubix)。
  • 在极少数情况下,如果源分区为空,REPLACE PARTITION 操作可能会被忽略。该问题现已修复。修复了 #24869#25665tavplubix)。
  • 修复了 Replicated 数据库引擎中的一个错误,该错误在极少数情况下可能导致某个副本跳过排队的 DDL 查询。 #24805 (tavplubix).
  • 修复在未提供查询时 EXPLAIN AST 的空指针解引用问题。#25631 (Nikolai Kochetov).
  • 修复自动删除空 part 时的等待逻辑。该问题可能导致后台任务池被完全占满并使复制卡死。 #23315 (Anton Popov).
  • 修复存储在 S3 虚拟文件系统中的表的还原功能(该功能为实验性特性,尚未准备好用于生产环境)。 #25601 (ianton-ru).
  • 修复在使用 Decimal256Arrow 格式中的空指针(nullptr)解引用问题。为 Arrow 格式增加对 Decimal256 的支持。#25531Kruglov Pavel)。
  • 修复预处理后配置文件名称中多余的下划线。#25431Vitaly Baranov)。
  • clickhouse-copier 工具的修复:当 copier 的任务配置中缺少 sharding_key 时,修复段错误(segfault)。#25419 (Nikita Mikhaylov)。
  • 通过对格式化后的查询进行正确引用,修复了在 DDL 中使用时的 REPLACE 列转换器问题。此更改修复了 #23925#25391Amos Bird)。
  • 修复 quantileDeterministic 函数及类似函数中可能出现的非确定性行为问题。关闭了 #20480#25313alexey-milovidov)。
  • SummingMergeTree 支持 SimpleAggregateFunction(LowCardinality)。修复 #25134#25300Nikolai Kochetov)。
  • 修复导致异常消息 "Cannot sum Array/Tuple in min/maxMap" 的逻辑错误。#25298 (Kruglov Pavel)。
  • 修复在 IN 子句中使用 LowCardinality 参数的查询时出现的错误 Bad cast from type DB::ColumnLowCardinality to DB::ColumnVector<char8_t>(该缺陷出现在 21.6 版本)。修复了 #25187#25290Nikolai Kochetov)。
  • 修复 joinGetOrNull 在非 Nullable 列上的错误行为。修复了 #24261#25288Amos Bird)。
  • 修复大整数中的错误行为和 UBSan 报告。在之前的版本中,CAST(1e19 AS UInt128) 会返回零。#25279 (alexey-milovidov)。
  • 修复了在使用 CSVWithNames 格式插入部分列时出现的错误。修复了 #25129#25169Nikita Mikhaylov)。
  • 不要在带有 FINALSELECT 查询中使用表的投影。目前尚不支持该用法。#25163 (Amos Bird)。
  • 修复在升级到 21.5 后,如果表在分区键中使用了 UUID 时可能出现的数据片段(parts)丢失问题。(不建议在分区键中使用 UUID)。修复了 #25070#25127Nikolai Kochetov)。
  • 修复在包含 cross join 且 joined_subquery_requires_alias = 0 的查询中发生的崩溃问题。修复了 #24011#25082Nikolai Kochetov)。
  • 修复 mapContains 函数中常量 map 的问题,该问题会导致错误 empty column was returned by function mapContains。关闭 #25077#25080Kruglov Pavel)。
  • 不再允许创建包含自引用列(例如 a UInt32 ALIAS a + 1b UInt32 MATERIALIZED b)的表。修复 #24910#24292#25059alesapin)。
  • 修复在使用带有「非空」GROUP BY 键的聚合投影来执行按「空」键进行 GROUP BY 的查询时得到错误的结果的问题。 #25055 (Amos Bird)。
  • 修复 Protobuf 格式中被拆分的嵌套消息的序列化。此 PR 修复了 #24647#25000Vitaly Baranov)。
  • 修复分布式查询的 limit/offset 设置处理方式(在远程节点上忽略)。#24940 (Azat Khuzhin)。
  • 修复 Arrow 格式中可能出现的堆缓冲区溢出问题。#24922 (Kruglov Pavel)。
  • 修复了从 DiskS3 读取文件时可能出现的错误 'Cannot read from istream at offset 0'(S3 虚拟文件系统是尚在开发中的实验性特性,不应在生产环境中使用)。 #24885 (Pavel Kovalenko).
  • 修复在对分布式物化视图执行 JOIN 时出现的“Missing columns”异常。#24870 (Azat Khuzhin)。
  • 在 PostgreSQL 兼容协议中允许使用 NULL 值。解决了 #22622 中的问题。#24857Kseniia Sumarokova)。
  • 修复一个错误:在等待变更时,若变更尚未加载到内存中,可能会向客户端抛出 Mutation was killed 异常。 #24809 (alesapin).
  • 修复了随机生成器状态反序列化中的一个错误,该错误可能导致 AggregateFunction(groupArraySample(N), T)) 等某些数据类型表现出不确定性行为。 #24538 (tavplubix)。
  • 禁用基于其他聚合状态构建 uniqXXXXStates 的操作。 #24523 (Raúl Marín)。随后在真正消除相关问题的根本原因后,重新放开这一限制。 (alexey-milovidov)。
  • 修复 CREATE .. AS SELECT 查询中元组的用法。#24464Anton Popov)。
  • 修复 Buffer 表中总字节数的计算。在当前 ClickHouse 版本中,total_writes.bytes 计数器在缓冲刷新期间减少得过多,这会导致计数器溢出,并在刷新后一段时间内使 totalBytes 返回约 17.44 EB 的值。#24450DimasKovas)。
  • 修正关于 toWeek 函数单调性的错误说明。此更改修复了 #24422。该缺陷最初在 https://github.com/ClickHouse/ClickHouse/pull/5212 中引入,之后被更智能的分区裁剪器暴露出来。#24446Amos Bird)。
  • 在使用 LDAP 管理用户身份验证时,修复了在 LDAP 角色映射/重新映射期间可能发生的潜在死锁问题:当某个 LDAP 组被映射到一个不存在的本地角色时,可能会导致死锁。#24431 (Denis Glazachev)。
  • 在 "multipart/form-data" 消息中,将紧接在 boundary 之前的 CRLF 视为 boundary 的一部分。修复了 #23905#24399Ivan)。
  • 修复在存在相交伪数据片段时执行 DROP PARTITION 的问题。在极少数情况下,可能会存在变更版本号大于当前块号的数据片段。#24321 (Amos Bird)。
  • 修复了在使用 RENAME TABLE 查询将物化视图从 Ordinary 数据库移动到 Atomic 数据库时的一个错误。现在内部表会与物化视图一同移动到新数据库。修复了 #23926#24309tavplubix)。
  • 允许空的 HTTP 头字段。修复 #23901#24285Ivan)。
  • 修复 Memory 表中变更操作(ALTER UPDATE/DELETE)处理不正确的问题。关闭 #24274#24275flynn)。
  • 使 JOIN 输出中的列的 LowCardinality 属性与输入保持一致,关闭 #23351,关闭 #20315#24061Vladimir)。
  • 针对 Kafka 表的修复。修复了故障切换行为中的一个 bug:当 Engine = Kafka 时,如果同一消费者之前的分配为空,则无法启动消费。关闭 #21118#21267filimonov)。

构建 / 测试 / 打包改进

  • 在 CI 中添加 darwin-aarch64(Mac M1 / Apple Silicon)构建 #25560Ivan),并在文档和网站中加入相关链接(alexey-milovidov)。
  • 添加将二进制资源嵌入可执行文件的跨平台支持。在 Illumos 上也可用。#25146bnaecker)。
  • 为压力测试添加与 JOIN 相关的选项,以改进 fuzzing。#25200Vladimir)。
  • 在 OS X 上启用包含 S3 模块的构建 #25217#25218kevin wan)。
  • 添加集成测试用例以覆盖 JDBC bridge。#25047Zhichun Wu)。
  • 集成测试配置对字典进行了特殊处理,移除了剩余的字典手动配置步骤。#24728Ilya Yatsishin)。
  • 为 YAMLParser 类添加 libfuzzer 测试。#24480BoloniniD)。
  • 现在使用 Ubuntu 20.04 来运行集成测试,用于运行集成测试的 docker-compose 版本更新为 1.28.2。环境变量现在会对 docker-compose 生效。重构 test_dictionaries_all_layouts_separate_sources 以允许并行运行。#20393Ilya Yatsishin)。
  • 修复安装脚本中的 TOCTOU 错误。#25277alexey-milovidov)。

ClickHouse 21.6 版本,2021-06-05

不向后兼容的变更

  • uniqState / uniqHLL12State / uniqCombinedState / uniqCombined64StateUUID 类型上会生成不兼容的状态。#33607

升级说明

  • zstd 压缩库已更新到 v1.5.0。复制过程中可能会看到 “checksum does not match” 的消息。这些消息是由于压缩算法更新而预期会出现的,可以忽略。它们仅为提示信息,并不表示存在任何异常行为。
  • compile_expressions 设置现在默认开启。尽管已经在各种场景下进行了大量测试,如果在服务器上发现任何异常行为,可以尝试关闭该设置。
  • UUID 类型的值不能与整数进行比较。例如,不要写 uuid != 0,而应写成 uuid != '00000000-0000-0000-0000-000000000000'

新特性

  • 添加类似 Postgres 的强制类型转换运算符(::)。例如:[1, 2]::Array(UInt8)0.1::Decimal(4, 4)number::UInt16#23871Anton 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)。
  • ArrowParquetORC 格式中支持使用 Array 数据类型进行数据插入和查询。 #21770 (taylor12805).
  • 实现表注释功能。关闭了 #23225#23548 (flynn)。
  • 支持在 clickhouse-local 中使用 DDL 查询创建字典。修复并关闭了 #22354。新增对 DETACH DICTIONARY PERMANENTLY 的支持。为 Atomic 数据库引擎新增对 EXCHANGE DICTIONARIES 的支持。新增通过 RENAME DICTIONARY 在数据库之间迁移字典的支持。#23436 (Maksim Kita)。
  • 为 ClickHouse 添加聚合函数 uniqTheta,以支持 Theta Sketch#23894#22609Ping Yu)。
  • 新增函数 splitByRegexp#24077 (abel-cheng).
  • 新增函数 arrayProduct,该函数接收一个数组作为参数,并返回该数组中所有元素的乘积。关闭 #21613#23782Maksim Kita)。
  • system.stack_trace 中新增 thread_name 列。修复了 #23256#24124abel-cheng)。
  • insert_null_as_default = 1 时,在 INSERT ... SELECTINSERT ... SELECT ... UNION ALL ... 查询中插入默认值而不是 NULL。修复了 #22832#23524Kseniia Sumarokova)。
  • clickhouse-local 添加 --progress 选项以支持进度显示。#23196Egor Savin)。
  • http 字典源中添加对 HTTP 压缩的支持(由 Content-Encoding HTTP 头部确定)。修复了 #8912#23946FArthur-cmd)。
  • 新增了 SYSTEM QUERY RELOAD MODELSYSTEM QUERY RELOAD MODELS。修复了 #18722 问题。#23182Maksim Kita)。
  • EXPLAIN PLAN 查询新增 json 设置项(布尔值,默认 0)。启用后,查询输出将是一行 JSON 结果。建议使用 TSVRaw 格式以避免不必要的转义。 #23082 (Nikolai Kochetov).
  • EXPLAIN PIPELINE 查询新增设置项 indexes(布尔类型,默认禁用)。启用后,会显示已使用的索引,以及每个已应用索引对应被过滤的数据片段和粒度数量。支持 MergeTree* 表。#22352 (Nikolai Kochetov)。
  • LDAP:实现了用户 DN 检测功能,用于在将 Active Directory 组映射到 ClickHouse 角色时使用。#22228 (Denis Glazachev).
  • 新增聚合函数 deltaSumTimestamp,通过存储时间戳在合并时保持顺序,用于对相邻行之间的差值求和。#21888Russ Frank)。
  • 为 S3 新增了安全性较低但在 Docker 环境下能正常工作的 IMDS 凭证提供程序。#21852 (Vladimir Chebotarev)。
  • 恢复 indexHint 函数。此更改针对 #21238。该更改回退了 #9542,并修复了 #9540#21304Amos Bird)。

实验性功能

性能改进

  • 默认启用 compile_expressions 设置。启用该设置后,简单函数和运算符的组合将在运行时使用 LLVM 编译为本机代码。#8482Maksim Kitaalexey-milovidov)。注意:如果遇到问题,可以关闭此选项。
  • 更新 re2 库。提升了正则表达式匹配的性能。同时该 PR 增加了对 gcc-11 的兼容性。#24196Raúl Marín)。
  • ORC 输入格式改为按 stripe 读取,而不是一次性将整个表读入内存,在文件非常大的情况下可以减少内存占用。#23102Chao Ma)。
  • 在查询中将聚合函数 sumcountavg 合并为单个聚合函数。该优化通过 optimize_fuse_sum_count_avg 设置进行控制。通过新的聚合函数 sumCount 实现。该函数返回包含两个字段的元组:sumcount#21337hexiaoting)。
  • zstd 更新到 v1.5.0。压缩性能提升了个位数百分比。#24135Raúl Marín)。注意:在复制中可能会看到 "checksum does not match" 的消息。这些消息是由于压缩算法更新导致的预期行为,可以忽略。
  • 提升 Buffer 表的性能:对 Buffer 引擎不再为 total_bytes/total_rows 获取锁。#24066Azat Khuzhin)。
  • 恢复对 hashed/sparse_hashed 字典的预分配支持。#23979Azat Khuzhin)。
  • 默认启用 async_socket_for_remote(在查询扇出很大的 Distributed 表时减少线程数量)。#23683Nikolai Kochetov)。

功能改进

  • 为 MergeTree 表族添加 _partition_value 虚拟列。它可用于以确定性方式对分区进行剪枝,这是为变更操作实现分区匹配器所必需的。#23673 (Amos Bird)。
  • 为 S3 存储和磁盘新增了 region 参数。#23846 (Vladimir Chebotarev).
  • 允许为不同的日志通道配置不同的日志级别。解决了 #19569#23857filimonov)。
  • 在执行 DateTime 运算且未显式提供时区时,保持其默认(无时区)状态不变。例如,如果对一个无时区的 DateTime 类型值加一秒,结果仍然是无时区的 DateTime。在之前的版本中,默认时区的值会被显式写入返回的数据类型中,因此结果会变为 DateTime('something')。此更改关闭了 #4854#23392alexey-milovidov)。
  • 允许用户在 MySQL 存储引擎中将数据库名指定为空字符串,此时查询将使用默认数据库。在之前的版本中,这只适用于 SELECT 查询;现在也支持 INSERT。此更改关闭了 #19281。这在使用 Sphinx 或其他兼容 MySQL 的外部数据库时会很有用。#23319alexey-milovidov)。
  • 修复了 quantile(s)TDigest。根据 tdunning/t-digest 3.2+ 添加了对单个质心的特殊处理。同时修复了在较早版本算法实现中质心过度压缩的问题。#23314 (Vladimir Chebotarev)。
  • 函数 now64 现在支持可选的时区参数。#24091 (Vasily Nemkov)。
  • 修复在 clickhouse-client 交互模式下,当进度条出现在输出数据中间时,可能会覆盖终端中部分可见数据的问题。关闭了 #19283#23050alexey-milovidov)。
  • 修复 simdjson 在内存分配失败时发生的崩溃。https://github.com/simdjson/simdjson/pull/1567。由于这是一个极其罕见的 bug,将其标记为改进。#24147Amos 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 byhavingorder by 中优先使用列名。这解决了 #23882#24022Amos Bird)。
  • ORDER BY WITH FILL 现已支持 DateTime64#24016 (kevin wan).
  • 支持在 ReplacingMergeTree 中将 DateTime64 作为版本列使用。 #23992 (kevin wan).
  • 在服务器启动时将操作系统名称、内核版本和 CPU 架构等信息记录到日志中。 #23988 (Azat Khuzhin).
  • 支持为 postgresql 字典源指定表结构。关闭 #23958#23980Kseniia Sumarokova)。
  • Enum 元素的名称添加提示(在存在拼写错误时给出名称建议)。关闭 #17112#23919flynn)。
  • 支持统计字典的命中率(找到值的百分比)(参见 system.dictionaries 中的 found_rate)。 #23916 (Azat Khuzhin).
  • 允许通过表设置 rabbitmq_queue_settings_list 添加特定队列配置。(关闭 #23737#23918)。允许用户完全控制 RabbitMQ 的全部初始化:如果表设置 rabbitmq_queue_consume 设为 1,则 RabbitMQ 表引擎将只连接到指定队列,不会执行任何 RabbitMQ 消费端的初始化操作,例如声明 exchange、队列以及绑定关系。(关闭 #21757)。在删除 RabbitMQ 表时增加正确的清理逻辑——删除该表声明的队列以及所有已绑定的 exchange(如果是由该表创建的)。#23887Kseniia Sumarokova)。
  • broken_data_files/broken_data_compressed_bytes 添加到 system.distribution_queue。添加指标 BrokenDistributedFilesToInsert,用于统计已标记为损坏的、异步插入到 Distributed 表的文件数量。 #23885 (Azat Khuzhin).
  • 查询 system.tables 时不再访问 ZooKeeper。#23793 (Fuwang Hu)。
  • OPTIMIZE 查询现在会遵守 lock_acquire_timeout_for_background_operations 设置。#23623 (Azat Khuzhin).
  • 可以通过新的 SYSTEM RESTART DISK SQL 命令在运行时更改 S3 磁盘设置。#23429Pavel Kovalenko)。
  • 如果用户错误地将 max_distributed_connections 设置为零,每次对 Distributed 表的查询都会抛出一个异常,其消息中包含 "logical error"。但这实际上是预期行为,而不是逻辑错误,因此该异常消息并不准确。它还在我们的 CI 环境中触发了用于确保不会发生任何逻辑错误的检查。现在,如果 max_distributed_connections 被错误配置为零,我们会将其视作最小可能值(一)。 #23348 (Azat Khuzhin)。
  • 默认禁用 min_bytes_to_use_mmap_io#23322 (Azat Khuzhin).
  • 通过 join_use_nulls 支持 LowCardinality 的可空性,并关闭 #15101#23237vdimir)。
  • 新增了将 MergeTree 数据分片恢复到 S3 磁盘的 detached 目录中的功能。 #23112 (Pavel Kovalenko).
  • 在 S3 上的 HTTP 连接中断时进行重试。 #22988 (Vladimir Chebotarev).
  • 为 MySQL 表引擎、字典源以及 MaterializeMySQL 的小批量数据读取新增 external_storage_max_read_rowsexternal_storage_max_read_rows 设置。#22697TCeason)。
  • MaterializeMySQL(实验性功能):此前由于 SQL 语法不兼容,不支持 MySQL 5.7.9 版本。现在将 MySQL 参数校验交给 MaterializeMySQL 处理。#23413 (TCeason)。
  • 支持在分布式表中读取子列。 #24472 (Anton Popov).
  • 修复在 CREATE .. AS SELECT 查询中对元组(tuple)的使用。#24464 (Anton Popov)。
  • Kafka 表新增对 Parquet 格式的支持。#23412Chao Ma)。

缺陷修复

  • 在分区键和主键中使用时沿用旧版本的取模函数。修复了 #23508#24157Kseniia Sumarokova)。这是之前版本中造成向后不兼容的原因。
  • 修复了执行查询 SYSTEM RESTART REPLICASYSTEM SYNC REPLICA 时可能陷入无限处理状态的问题。该问题是在内存极少的服务器上被发现的。#24457 (Nikita Mikhaylov).
  • 修复 toWeek 函数单调性错误。此修复解决了 #24422。该缺陷最初在 #5212 中被引入,后来被更智能的分区裁剪逻辑暴露出来。#24446Amos Bird)。
  • 修复在存在相交的伪分片时执行 drop partition 的问题。在极少数情况下,可能会出现其变更版本号大于当前块号的分片。 #24321 (Amos Bird).
  • 修复了在通过 RENAME TABLE 查询将物化视图从 Ordinary 数据库移动到 Atomic 数据库时的一个错误。现在内部表会随物化视图一起移动到新的数据库。修复了 #23926#24309tavplubix)。
  • 允许客户端请求中包含空的 HTTP 头部。修复了 #23901#24285Ivan)。
  • max_threads 设置为 1,以修复 Memory 表的 mutation 失败问题。关闭了 #24274#24275flynn)。
  • 修复了 Memory 表实现中的拼写错误,该缺陷是在 #15127 中引入的。修复了 #24192#24193张中南)。
  • 修复在查询执行期间 HDFS 无法访问时导致的服务器异常终止问题。关闭 #24117#24191Kseniia Sumarokova)。
  • 修复在使用常量条件更新 Nested 列时发生的崩溃。#24183 (hexiaoting).
  • 修复在高负载下 RBAC 中可能出现的竞争条件问题。此 PR 修复了 #24090#24134#24176Vitaly Baranov)。
  • 修复了一个罕见的错误,该错误可能导致表只被部分初始化却仍然可以处理写入请求(insert/alter 等)。现在此类表将处于只读模式。#24122 (alesapin)。
  • 修复了一个问题:在使用 SELECT xxx FINAL 时,EXPLAIN PIPELINE 显示了错误的管线。(hexiaoting
  • 修复了在 WHERE 子句中使用常量 DateTime 值而不是 DateTime64 列的问题。 #24100 (Vasily Nemkov).
  • 修复 merge JOIN 中的崩溃,关闭 #24010#24013vdimir)。
  • 某些 ALTER PARTITION 查询可能会在复制队列中导致 Part A intersects previous part BUnexpected merged part C intersecting drop range D 错误。该问题已修复,修复了 #23296#23997 (tavplubix)。
  • 修复外部 GROUP BY 与溢出行情况下产生的 SIGSEGV 段错误(即类似 SELECT FROM GROUP BY WITH TOTALS SETTINGS max_bytes_before_external_group_by>0, max_rows_to_group_by>0, group_by_overflow_mode='any', totals_mode='before_having' 的查询)。#23962 (Azat Khuzhin)。
  • 修复在源数据存在重复键时 CACHE 字典键相关指标的统计问题(会导致 DictCacheKeysRequestedMiss 溢出)。#23929Azat Khuzhin)。
  • 修复 PostgreSQL 引擎的连接池实现。解决 #23897#23909Kseniia Sumarokova)。
  • 修复在 GROUP BY 中以及聚合函数被包裹在普通函数中时使用 distributed_group_by_no_merge = 2 的问题(此前在 #23546 中被破坏)。当尝试将 distributed_group_by_no_merge = 2 与窗口函数一起使用时抛出异常。对包含窗口函数的查询禁用 optimize_distributed_group_by_sharding_key#23906Azat 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#23805Nikolai Kochetov)。
  • 修复 CLEAR COLUMN 在被物化视图引用时不起作用的问题。关闭 #23764#23781flynn)。
  • 修复在使用 Values 格式从 HDFS 读取数据时出现的堆内存 use-after-free 问题。 #23761 (Kseniia Sumarokova).
  • 避免在向 Distributed 执行 INSERT 时,如果发生异常,可能出现的 "Cannot schedule a task" 错误。#23744 (Azat Khuzhin).
  • 修复了在恢复过期的 ReplicatedMergeTree 副本时的一个缺陷。如果在副本宕机期间执行了 ALTER 查询,该过期副本可能会忽略部分元数据更新。 #23742 (tavplubix)。
  • 修复 JoinWITH TOTALS 的一个错误,关闭 #17718#23549vdimir)。
  • 修复在进行了 filter-pushdown 优化后,使用 UNION 的查询可能出现的 Block structure mismatch 错误。修复了 #23029#23359Nikolai Kochetov)。
  • 在启用 optimize_skip_unused_shards_rewrite_in 设置时添加类型转换。这修复了 MSan 报错。#23219 (Azat Khuzhin)。
  • 在更新嵌套子列时补充缺失的检查,关闭 issue #22353#22503hexiaoting)。

构建/测试/打包改进

  • 支持在 Illumos 上进行构建。#24144。增加对基于 Solaris 的操作系统进行构建的支持。#23746 (bnaecker).
  • 为哈希表添加更多基准测试,包括来自 Google 的 Swiss Table(在我们的特定使用场景中,其性能反而比 ClickHouse 哈希映射更慢)。#24111 (Maksim Kita).
  • 将 librdkafka 从 1.6.0-RC3 更新到 1.6.1。#23874 (filimonov).
  • 始终显式启用 asynchronous-unwind-tables。这可能会修复 AArch64 上的查询分析器。#23602 (alexey-milovidov).
  • 避免在构建过程中可能对 locale 和文件系统顺序产生依赖,从而实现可重现构建。#23600 (alexey-milovidov).
  • 移除构建过程中的一个不确定性来源。现在在不同时间点进行的构建将生成字节级完全一致的二进制文件。部分解决了 #22113#23559 (alexey-milovidov).
  • 添加用于对 (Zoo)Keeper 进行基准测试的简单工具。#23038 (alesapin).

ClickHouse 发行版 21.5,2021-05-20

向后不兼容的变更

  • 更改整数与浮点数之间的比较逻辑:当整数无法在浮点数据类型中被精确表示时,比较行为会发生变化。在新版本中,由于会出现舍入误差,比较将返回 false。示例:9223372036854775808.0 != 9223372036854775808,因为数值 9223372036854775808 无法被精确表示为浮点数(并且 9223372036854775808.0 被舍入为 9223372036854776000.0)。但在之前的版本中,该比较会返回数字相等,因为如果将浮点数 9223372036854776000.0 转换回 UInt64,将得到 9223372036854775808。作为对比,Python 编程语言也会将这些数字视为相等。但这种行为取决于 CPU 型号(某些超出范围的数字在 AMD64 和 AArch64 上会得到不同结果),因此我们使比较更加精确。只有在整数可以在浮点类型中被精确表示时,才会将 int 和 float 视为相等。#22595 (alexey-milovidov)。
  • 移除了对单个 Tuple 参数使用 argMinargMax 的支持。该实现无法保证内存安全。该特性是误加的,并且会让用户产生困惑。这些函数未来可以以不同的名称重新引入。此变更修复了 #22384 并回滚了 #17359#23393 (alexey-milovidov)。

新特性

  • 新增函数 dictGetChildren(dictionary, key)dictGetDescendants(dictionary, key, level)。函数 dictGetChildren 返回所有子节点的索引数组,是 dictGetHierarchy 的逆变换。函数 dictGetDescendants 返回在递归应用 dictGetChildren level 次后得到的所有后代节点。level 为 0 等价于无限层级。并提升了 dictGetHierarchydictIsIn 函数的性能。修复 #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#23000alexey-milovidov)。
  • 提高了从本地文件以外的数据源(例如 URL)读取 ArrowStream 输入格式时的性能。#22673nvartolomei)。
  • 通过原生协议与 localhost 交互时(使用 clickhouse-client 或在分布式查询中服务器之间通信),默认禁用压缩。这可以提升某些导入/导出操作的性能。修复了 #22234#22237alexey-milovidov)。
  • 在分布式查询中,从 IN 子句右侧排除不属于当前分片的值(受 optimize_skip_unused_shards_rewrite_in 控制,默认启用,同时仍然需要开启 optimize_skip_unused_shards)。#21511Azat Khuzhin)。
  • 改进了在使用 File-like 表引擎以及 Parquet、Arrow 或 ORC 等列式格式时读取列子集的性能。修复了 #issue:20129#21302keenwolf)。
  • 允许像 21.1 版本之前那样将更多条件下推到 PREWHERE(通过调整内部启发式规则实现)。如果下推的条件数量不足,可能导致性能变差。#23397Anton Popov)。
  • 提高了 ODBC 连接的性能,并修复了积压列表中的所有遗留问题。使用 nanodbc 库替代 Poco::ODBC。修复了 #9678。为 ODBC 表引擎添加了对 DateTime64 和 Decimal* 的支持。修复了 #21961。修复了西里尔文文本被截断的问题。修复了 #16246。为 odbc bridge 添加了连接池。#21972Kseniia Sumarokova)。

改进

  • max_uri_size(HTTP 接口中 URL 的最大大小)默认提高到 1 MiB。此更改解决了 #21197#22997alexey-milovidov)。
  • background_fetches_pool_size 设置为 8,对于存在频繁小批量插入或 ZooKeeper 集群较慢的生产环境来说更合适。 #22945 (alexey-milovidov).
  • FlatDictionary 新增了 initial_array_sizemax_array_size 选项。#22521 (Maksim Kita)。
  • 新增设置 non_replicated_deduplication_window,用于非复制 MergeTree 插入去重。 #22514 (alesapin)。
  • 在配置重新加载时更新 CatBoost 模型配置的路径。#22434Kruglov Pavel)。
  • 在字典中新增了对 Decimal256 类型的支持。Decimal256 为实验性功能。修复了 #20979#22960Maksim Kita)。
  • 默认启用 async_socket_for_remote(对分布式查询使用更少的 OS 线程)。#23683Nikolai Kochetov)。
  • 修复了 quantile(s)TDigest。根据 tdunning/t-digest 3.2+ 对仅包含单个点的质心添加了特殊处理。同时修复了此前算法实现中质心过度压缩的一个错误。 #23314 (Vladimir Chebotarev).
  • 将函数名 unhex 调整为不区分大小写,以提升与 MySQL 的兼容性。 #23229 (alexey-milovidov)。
  • 为数组元素类型不同时的泛型场景实现函数 arrayHasAnyarrayHasAllhasindexOfcountEqual。在之前的版本中,函数 arrayHasAnyarrayHasAll 会返回 false,而 hasindexOfcountEqual 会抛出异常。同时在 has 及类似函数中增加了对 Decimal 和大整数类型的支持。此改动修复了 #20272#23044alexey-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 表新增仅在后台刷新缓冲区的功能。#22986Azat Khuzhin)。
  • 从包含 NULL 的 MergeTree 表中进行带 WHERE 条件的查询时,在少数情况下会抛出异常。此更改修复了该问题并关闭了 #20019#22978alexey-milovidov)。
  • 修复 Poco HTTP 客户端在 AWS 上的错误处理。#22973 (kreuzerkrieg)。
  • 使 ReplicatedMergeTree 遵循 max_part_removal_threads#22971 (Azat Khuzhin).
  • 修复当 MergeTree 设置 inactive_parts_to_throw_insert = 0 且 inactive_parts_to_delay_insert > 0 时的一个隐蔽边缘情况。 #22947 (Azat Khuzhin).
  • dateDiff 现在也适用于 DateTime64 参数(即使参数值超出 DateTime 范围)#22931Vasily Nemkov)。
  • MaterializeMySQL(实验性特性):新增了在不报错的情况下复制包含视图的 MySQL 数据库的支持,这是通过忽略这些视图来实现的。#22760Christian)。
  • 通过 PostgreSQL 协议允许 RBAC 行策略。已关闭 #22658。PostgreSQL 协议在配置中默认启用。#22755Kseniia Sumarokova)。
  • 添加指标,用于跟踪等待 Buffer 层锁所花费的时间。 #22725 (Azat Khuzhin).
  • 允许在 VIEW 定义中使用 CTE。此更改解决了 #22491 问题。#22657Amos Bird)。
  • 如果先前的程序在终端中留下了垃圾输出,则在 clickhouse-client 中清除屏幕剩余内容并重新显示光标。此更改关闭了 #16518#22634alexey-milovidov)。
  • 使 round 函数在非 x86_64 平台上的行为保持一致。采用将 0.5 舍入到最接近的偶数(银行家舍入)规则。 #22582 (alexey-milovidov).
  • 正确校验由 Distributed 表发送的数据块的结构。#22325 (Azat Khuzhin).
  • 允许将 Kafka 错误写入 Kafka 引擎的虚拟列,并通过 kafka_handle_error_mode 设置进行控制。 #21850 (fastio).
  • visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String} 添加别名 simpleJSONExtract/simpleJSONHas。解决了 #21383#21519fastio)。
  • 为库字典源新增 clickhouse-library-bridge。关闭问题 #9502#21509 (Kseniia Sumarokova)。
  • 当某列被物化视图引用时,禁止删除该列。修复 #21164#21303flynn)。
  • 支持动态更新服务器间凭证(可在不停机的情况下轮换凭证)。 #14113 (johnskopis)。
  • 为 Kafka 存储添加 ArrowArrowStream 消息格式的支持。 #23415 (Chao Ma).
  • 修复了异常信息中缺失的分号。该异常信息可能会让用户觉得不够友好。 #23208 (alexey-milovidov).
  • 修复了部分关于 LowCardinality 类型的异常信息中缺失的空格。#23207 (alexey-milovidov)。
  • 之前在 Markdown 表格单元格中,某些值被设置为居中对齐。现在不再如此。#23096 (alexey-milovidov).
  • 从 clickhouse-client 的建议提示中移除非必要细节。关闭 #22158#23040alexey-milovidov)。
  • 修正了 system.dictionaries 中 sparse_hashed 字典的 bytes_allocated 字段的计算。#22867Azat Khuzhin)。
  • 修复了从 MergeTree 反向读取时近似总行数统计不准确的问题。#22726 (Azat Khuzhin)。
  • 修复了允许将字典配置为使用指向自身的 ClickHouse 源,从而导致无限循环的问题。关闭 #14314#22479Maksim Kita)。

缺陷修复

  • 针对对冲请求进行了多项修复。修复了在启用 use_hedged_requests 设置且查询中使用 GLOBAL IN/JOIN 时出现的错误 Can't initialize pipeline with empty pipe,对应 #23431#23805Nikolai Kochetov)。修复了对冲连接中的竞态条件问题,该问题会导致崩溃,对应 #22161#22443Kruglov Pavel)。修复了在启用 async_socket_for_remote 时,如果从远程查询接收到 unknown packet 可能导致的崩溃问题,对应 #21167#23309Nikolai Kochetov)。
  • 修复了在禁用 input_format_with_names_use_header 设置时会导致丢弃所有 CSVWithNames 格式输入数据的问题。此更改修复了 #22406#23202Nikita Mikhaylov)。
  • 修复了远程 JDBC bridge 连接超时的问题。关闭了 #9609#23771Maksim Kitaalexey-milovidov)。
  • 修正在指定 update_fieldcomplex_key_hashed 的初始加载逻辑。关闭 #23800#23824Maksim Kita)。
  • 修复了在同时启用 PREWHERE 和行级策略过滤且结果为空时发生的崩溃。 #23763 (Amos Bird).
  • 在向 Distributed 表执行 INSERT 时,如果发生异常,避免可能出现 “Cannot schedule a task” 错误。 #23744 (Azat Khuzhin).
  • 在聚合函数 mannWhitneyUTest 中,当两个样本的取值完全相同时,现在会抛出异常。这修复了 #23646#23654Nikita Mikhaylov)。
  • 修复了通过 HTTP 插入数据时会触发异常的服务器故障。此修复解决了 #23512 中的问题。#23643Nikita Mikhaylov)。
  • 修复了对某些包含转义序列的 LIKE 表达式的错误解析。#23610 (alexey-milovidov)。
  • 修复了 restart / stop 命令会挂起的问题。修复了 #20214#23552filimonov)。
  • 修复了在包含多个 JOIN 的 SELECT 查询中 COLUMNS 匹配器的行为。关闭 #22736#23501Maksim 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#23456Maksim Kita)。
  • 修复了一个错误:在重置计数器之后,deltaSum 聚合函数会产生错误的结果。#23437Russ Frank)。
  • 修复了在使用多磁盘配置创建 ReplicatedMergeTree 表失败时出现的 Cannot unlink file 错误。此修复关闭了 #21755#23433tavplubix)。
  • 修复了在基于虚拟列进行分区裁剪时生成不兼容常量表达式的问题。该修复对应于 https://github.com/ClickHouse/ClickHouse/pull/21401#discussion_r611888913#23366Amos Bird)。
  • 修复了在将 join_algorithm 设置为 'auto' 并与 Dictionary 执行 Join 时发生的崩溃。关闭 #23002#23312 (Vladimir)。
  • 在进行分区裁剪时,不要放宽 NOT 条件。这修复了 #23305#21539#23310Amos Bird)。
  • 修复了在旧数据块后台清理过程中出现的极其罕见的竞态条件。如果某个数据块距离去重窗口结束过近,可能会导致该数据块未被去重。#23301 (tavplubix)。
  • 修复了在创建和删除 ReplicatedMergeTree 表之间出现的极其罕见的(分布式)竞态条件。该问题可能在尝试创建复制表时导致类似 node doesn't exist 的异常。修复了 #21419#23294tavplubix)。
  • 修复了通过 DDL 创建简单键字典时,当主键不是第一个字段时的错误。修复了 #23236#23262Maksim Kita)。
  • 修复了当表中存在许多较长列名时通过 ODBC 读取数据的问题。关闭了 #8853#23215Kseniia Sumarokova)。
  • MaterializeMySQL(实验性功能):修复了在对键列设置条件时,从 MaterializeMySQL 查询出现的 Not found column 错误。修复 #22432#23200tavplubix)。
  • 修正当子查询被优化为常量时的别名处理问题。修复 #22924。修复 #10401#23191Maksim Kita)。
  • 如果在默认 profile 中启用了 data_type_default_nullable 设置,服务器可能无法启动,现已修复。修复了 #22573#23185 (tavplubix)。
  • 修复了在关闭时由于当前连接数统计错误而导致的崩溃。#23154Vitaly Baranov)。
  • 修复了在将 物化视图 从 Atomic 数据库分离并重新附加后,从该视图查询时出现的 Table .inner_id... doesn't exist 错误。#23047 (tavplubix)。
  • 修复当子查询使用 untuple 时可能发生的错误 Cannot find column in ActionsDAG result。修复 #22290#22991Nikolai Kochetov)。
  • 修复对包含可空值的 Map 类型常量列的处理。#22939 (Anton Popov)。
  • 修复了 DateTime64 上的 formatDateTime() 和 "%C" 格式说明符的问题,并修复了 toDateTime64() 在处理大值和非零 scale 时的行为。 #22937 (Vasily Nemkov).
  • 修复了在将 mannWhitneyUTestrankCorr 与窗口函数一起使用时发生的崩溃问题。此修复解决了 #22728#22876Nikita Mikhaylov)。
  • LIVE VIEW(实验性功能):修复了在 TemporaryLiveViewCleaner 中并发执行 DROP/CREATE TEMPORARY LIVE VIEW 操作时可能出现的挂起问题,参见#22858Vitaly Baranov)。
  • 修复了在过滤列参与聚合时 HAVING 子句下推的问题。#22763 (Anton Popov).
  • 修复了在发生 OOM 异常时可能导致 ZooKeeper 请求挂起的问题。修复了 #22438#22684Nikolai Kochetov)。
  • 修复了 ReplicatedMergeTree 表引擎在多个副本上等待 mutation 的机制。此前,mutation/alter 查询可能会在变更实际在其他副本上执行之前就结束。 #22669 (alesapin).
  • 修复了在 SELECT 子句未包含列时,带有嵌套类型的 Log 表抛出异常的问题。#22654 (Azat Khuzhin).
  • 修复辅助 AWS 请求无限期等待的问题。#22594 (Vladimir Chebotarev)。
  • 修复了在客户端过早关闭连接时发生的崩溃 #22579#22591 (nvartolomei)。
  • Map 数据类型(实验性功能):修复了在分布式查询中函数 map 的不正确格式化方式问题。 #22588 (foolchi).
  • 修复了在 TSV 格式中反序列化末尾没有换行符的空字符串的问题。此更改关闭了 #20244。在不升级版本的前提下,可采用的变通方案是将 input_format_null_as_default 设为 0。在旧版本中该值默认为 0。#22527alexey-milovidov)。
  • 修复了 Merge Join 算法中对 LowCardinality 类型列的错误类型转换问题。关闭 #22386,关闭 #22388#22510Vladimir)。
  • 在读取时,tokenbf_v1 全文索引中可能发生缓冲区溢出。多余的字节不会被使用,但读取操作在极少数情况下可能导致崩溃。已修复该问题,关闭了 #19233#22421alexey-milovidov)。
  • 不再限制 HTTP 分块大小。修复 #21907#22322Ivan)。
  • 修复了一个错误:在启用 optimize_aggregation_in_order 且表中存在大量数据片段时,会导致数据聚合不充分。在启用 optimize_aggregation_in_order 时略微提升了聚合性能。#21889Anton Popov)。
  • 检查是否将表函数视图当作列来使用。这补充了 #20350。#21465 (Amos Bird)。
  • 修复在包含 JOIN 和聚合的查询中,使用 Merge 引擎的表出现的 “unknown column” 错误。修复 #18368#22226#21370Vladimir)。
  • 修复了下推优化中的名称冲突问题。该问题会导致 FULL JOIN 之后的 WHERE 过滤不正确。关闭 #20497#20622Vladimir)。
  • 修复了一个极少出现的 bug:在使用 quorum_parallel=1 进行 quorum 插入操作时,由于去重导致其实际上并不真正满足「quorum」语义。#18215filimonov - 报告,alesapin - 修复)。

构建 / 测试 / 打包改进

ClickHouse 版本 21.4

ClickHouse 版本 21.4.1 2021-04-12

不兼容变更

  • 函数 toStartOfIntervalFunction 现在会将小时区间对齐到午夜(在之前的版本中,它们是对齐到 Unix 纪元起点)。例如,toStartOfInterval(x, INTERVAL 11 HOUR) 会把每一天分成三个区间:00:00:00..10:59:5911:00:00..21:59:5922:00:00..23:59:59。这种行为更符合实际需求。此变更关闭了 #9510#22060alexey-milovidov)。
  • graphite 汇总配置中的 AgePrecision 应当随保留周期逐级递增。现在会对此进行检查,错误的配置会抛出异常。#21496Mikhail f. Shiryaev)。
  • 修复 cutToFirstSignificantSubdomainCustom() / firstSignificantSubdomainCustom() 针对存在于自定义顶级域列表中的 3 级及以上域名返回错误结果的问题。对于匹配这些自定义顶级域的输入域名,此前会错误地将三级域名视为第一个有效子域名。现在已修复。如果该函数被用于例如分片键,此变更可能会引入不兼容。#21946Azat Khuzhin)。
  • system.dictionaries 中的列 keys 被替换为列 key.nameskey.types。现在,从 system.dictionaries 表中读取 key.nameskey.typesattribute.namesattribute.types 列不再需要先加载字典。#21884Maksim Kita)。
  • 现在,正在处理 ALTER TABLE ATTACH PART[ITION] 命令的副本会先在它们自己的 detached/ 目录中查找数据,然后才从其他副本获取。作为实现细节,在复制日志中引入了一个新的命令 ATTACH_PART。数据分片(parts)通过校验和进行查找和比较。#18978Mike Kot)。注意
    • 在集群升级期间,ATTACH PART[ITION] 查询可能无法工作。
    • 在新版本中执行 ALTER ... ATTACH 查询之后,将无法回滚到较旧的 ClickHouse 版本,因为旧服务器无法处理复制日志中的 ATTACH_PART 记录。
  • 在此版本中,空的 <remote_url_allow_hosts></remote_url_allow_hosts> 将会阻止对所有远程主机的访问,而在之前版本中它不起任何作用。如果你希望保留旧行为并且在配置文件中包含空的 remote_url_allow_hosts 元素,请将其删除。#20058Vladimir 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#22044Amos Bird)。
  • 新增函数 dictGetChildren(dictionary, key)dictGetDescendants(dictionary, key, level)。函数 dictGetChildren 返回所有子节点索引组成的数组,是 dictGetHierarchy 的逆变换。函数 dictGetDescendants 返回在将 dictGetChildren 递归应用 level 次后得到的所有后代节点。level 为 0 时等价于无限层级。关闭 #14656#22096Maksim Kita)。
  • 新增 executable_pool 字典源。关闭 #14528#21321Maksim Kita)。
  • 新增了 dictionary 表函数,其工作方式与 Dictionary 引擎相同。修复了 #21560#21910 (Maksim Kita).
  • 支持将 Nullable 类型用于 PolygonDictionary 属性。#21890 (Maksim Kita)。
  • 函数 dictGetdictHas 对于使用 DDL 创建的字典,在未显式指定数据库名时会使用当前数据库名。修复了 #21632#21859Maksim Kita)。
  • 新增函数 dictGetOrNull。其工作方式与 dictGet 相同,但在字典中未找到键时返回 Null。修复了问题 #22375#22413Maksim Kita)。
  • ComplexKeyCacheSSDCacheSSDComplexKeyCache 字典中新增了异步更新功能。在 CacheComplexKeyCacheSSDCacheSSDComplexKeyCache 字典中新增了对 Nullable 类型的支持。为 dictGetdictGetOrDefault 函数新增了一次获取多个属性的支持。修复了 #21517#20595Maksim Kita)。
  • RangeHashedDictionary 增加对 dictHas 函数的支持。修复 #6680#19816Maksim Kita)。
  • 添加函数 timezoneOf,用于返回 DateTimeDateTime64 数据类型的时区名称。此更改并未关闭 #9959。修复函数命名中的不一致问题:添加别名 timezonetimeZone,以及 toTimezonetoTimeZonetimezoneOftimeZoneOf#22001alexey-milovidov)。
  • CREATE/ALTER USER 命令新增了可选子句 GRANTEES。该子句用于指定哪些用户或角色可以从此用户处接收授权,前提是此用户自身也已被授予所有所需的访问权限且带有 grant 选项。默认使用 GRANTEES ANY,这意味着具有 grant 选项的用户可以向任意对象授予权限。语法:CREATE USER ... GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]#21641 (Vitaly Baranov)。
  • system.clusters 中新增列 slowdowns_count。在使用对冲请求时,该列表示由于某个副本响应过慢而切换到其他副本的次数。同时在 system.clusters 中显示 errors_count 的实际值。#21480Kruglov Pavel)。
  • MergeTree* 引擎添加 _partition_id 虚拟列,允许通过 _partition_id 对分区进行剪枝。添加 partitionID() 函数用于计算分区 ID 字符串。#21401 (Amos Bird).
  • 添加函数 isIPAddressInRange,用于判断某个 IPv4 或 IPv6 地址是否位于给定的 CIDR 网络前缀范围内。 #21329 (PHO).
  • 新增了 SQL 命令 ALTER TABLE 'table_name' UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'。该命令用于正确地从所有磁盘上删除已“冻结”的分区。#21142 (Pavel Kovalenko).
  • 支持 JOIN 中键类型的隐式转换。 #19885 (Vladimir)。

实验特性

  • 为浮点类型的窗口函数支持 RANGE OFFSET 窗口帧。实现 lagInFrame/leadInFrame 窗口函数,它们与 lag/lead 类似,但会遵循窗口帧设置。当窗口帧为 between unbounded preceding and unbounded following 时,它们是等价的。修复了 #5485#21895Alexander Kuzmenkov)。
  • 针对基于 S3 存储的 ReplicatedMergeTree 支持零拷贝复制。#16240ianton-ru)。
  • 增加了将已有 S3 磁盘迁移到具备备份/恢复能力的 schema 的功能。#22070Pavel Kovalenko)。

性能改进

  • clickhouse-local 以及其他所有场景中支持并行格式化。#21630Nikita Mikhaylov)。
  • 支持对 CSVWithNamesTSVWithNames 格式进行并行解析。修复了 #21085#21149Nikita Mikhaylov)。
  • 为从 64 MiB 起的文件区间启用基于 mmap 的读取 I/O(设置项 min_bytes_to_use_mmap_io)。这可能带来中等程度的性能提升。#22326alexey-milovidov)。
  • 为通过 min_bytes_to_use_mmap_io 设置进行读取的文件添加缓存。当该设置值较小时,这可以通过避免频繁的 mmap/munmap 调用以及随之产生的缺页异常,带来显著(2 倍及以上)的性能提升。请注意,mmap I/O 存在一些主要缺点,使其在生产环境中的可靠性较差(例如在磁盘故障时可能出现挂起或 SIGBUS;内存使用更难控制)。尽管如此,在基准测试中它表现良好。#22206alexey-milovidov)。
  • 在使用 codec NONE 时避免不必要的数据拷贝。请注意,codec NONE 基本上没什么用——推荐始终使用压缩(默认是 LZ4)。与常见看法相反,禁用压缩未必会提升性能(甚至可能产生相反效果)。NONE codec 在某些场景中有用:- 当数据不可压缩时;- 用于合成基准测试。#22145alexey-milovidov)。
  • max_rows_to_group_by 较小且 group_by_overflow_mode='any' 时加速 GROUP BY#21856Nikolai Kochetov)。
  • 优化类似 SELECT ... FINAL ... WHERE 的查询性能。现在在包含 FINAL 的查询中,允许将排序键中的列下推到 PREWHERE#21830foolchi)。
  • 通过将 memcpy 替换为另一种实现提升性能。修复了 #18583#21520alexey-milovidov)。
  • 提升按排序键顺序进行聚合时的性能(启用设置 optimize_aggregation_in_order 时)。#19401Anton Popov)。

改进

  • 为 PostgreSQL 表/数据库引擎和字典源添加连接池,从而修复 #21444#21839Kseniia Sumarokova)。
  • postgres 存储 / 表函数添加对非默认表结构的支持。修复了 #21701#21711Kseniia Sumarokova)。
  • 为 Postgres 字典源增加副本优先级支持。 #21710 (Kseniia Sumarokova).
  • 引入一个新的 MergeTree 设置 min_bytes_to_rebalance_partition_over_jbod,用于以均衡的方式将新的 part 分配到 JBOD 卷上的不同磁盘。#16481Amos Bird)。
  • system.query_log 中对应的查询在 query_kind 列中新增了 GrantRevokeSystem 取值。#21102 (Vasily Nemkov).
  • 允许单独自定义用于复制的 HTTP 连接的超时时间,使其独立于其他 HTTP 超时时间。 #20088 (nvartolomei).
  • 在服务器写入数据块时发生异常的情况下,为客户端提供了更清晰的异常信息。在先前版本中,客户端可能会收到具有误导性的消息,例如 Data compressed with different methods#22427 (alexey-milovidov)。
  • 修复在获取分片失败后可能出现的错误 Directory tmp_fetch_XXX already exists。如果临时拉取目录已存在则将其删除。修复了 #14197#22411nvartolomei)。
  • 修复 range 函数在使用 UInt256 参数时的 MSan 报告(对大整数的支持仍为实验性特性)。关闭 #22157#22387alexey-milovidov)。
  • system.processes 表中添加 current_database 列。该列表示查询当前所在的数据库。#22365Alexander 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#22063alexey-milovidov)。
  • 将使用的 simdjson 版本更新为 0.9.1。此更新修复了 #21984。见 #22057Vitaly Baranov)。
  • CONNECTION_ID()VERSION() 函数添加了不区分大小写的别名,从而修复了 #22028#22042Eugene Klimov)。
  • windowFunnel 函数新增 strict_increase 选项,从而让每个事件只被计算一次(解决 #21835)。 #22025Vladimir)。
  • 如果 MergeTree 表的分区键不包含 DateDateTime 列,但恰好包含一列 DateTime64 列,则在 system.partssystem.parts_columns 表中的 min_timemax_time 列中公开其取值。向 system.parts_columns 表添加 min_timemax_time 列(此前与 system.parts 表存在不一致)。解决了 #18244#22011alexey-milovidov)。
  • clickhouse-copier 中新增对 replication_alter_partitions_sync=1 设置的支持,以便将分区从辅助表移动到目标表。缩短了默认超时时间。修复 #21911#21912turbo jason)。
  • 在 system 表中显示 EmbeddedRocksDB 表的数据目录路径。#21903tavplubix)。
  • 添加 profile 事件 HedgedRequestsChangeReplica,将读取数据的超时单位从秒改为毫秒。 #21886 (Kruglov Pavel)。
  • DiskS3(正在开发中的实验性特性)。修复了在目标目录非空且使用缓存磁盘的情况下无法移动目录的错误。#21837Pavel Kovalenko)。
  • 在 Web UI 中改进了对 ArrayMap 数据类型的格式化显示。#21798 (alexey-milovidov).
  • 仅在其配置被更新时才更新集群。#21685 (Kruglov Pavel).
  • 在分布式 DDL 查询中传播查询和会话设置。将 distributed_ddl_entry_format_version 设置为 2 以启用此功能。新增 distributed_ddl_output_mode 设置。支持的模式:nonethrow(默认)、null_status_on_timeoutnever_throw。对 Replicated 数据库引擎进行了其他修复和改进。#21535tavplubix)。
  • 如果 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 中整数键的支持。#21157Anton Popov)。
  • MaterializeMySQL:在连接丢失时尝试重新连接到 MySQL。#20961 (Håvard Kvålen)。
  • 支持在更多情况下将 CROSS JOIN 重写为 INNER JOIN#20392 (Vladimir)。
  • 在启用 optimize_on_insert 设置时,不再在 INSERT 时创建空分片。修复了 #20304#20387Kruglov Pavel)。
  • MaterializeMySQL:为 _version 列添加 minmax 跳过索引。 #20382 (Stig Bakken).
  • clickhouse-format 新增选项 --backslash,用于在格式化查询的每一行末尾添加反斜杠。 #21494 (flynn)。
  • 现在在尝试对已覆盖部分执行变更操作时,ClickHouse 将不再抛出 LOGICAL_ERROR 异常。修复了 #22013#22291 (alesapin)。

缺陷修复

  • HedgedConnections 中,在取消数据包接收器之前先从 epoll 中移除 socket,以防止潜在的竞态。修复了 #22161#22443Kruglov Pavel)。
  • 在并行解析例程中补充缺失的内存统计逻辑。之前的版本中,当结果集包含非常大的数据块时,可能会导致 OOM。本变更关闭了 #22008#22425alexey-milovidov)。
  • 修复在 SELECT 语句使用常量 WHERE 条件且源表中存在列名为数字的列时可能引发的异常。 #22270 (LiuNeng).
  • 使用 use_hedged_requests=0async_socket_for_remote=1 修复查询取消问题。#22183 (Azat Khuzhin).
  • 修复 InterserverIOHTTPHandler 中未捕获异常。 #22146 (Azat Khuzhin).
  • 在配置中未包含 http_port 时修复 Docker entrypoint。 #22132 (Ewout)。
  • 修复在 JOIN 配合 TOTALSarrayJoin 使用时出现的 Invalid number of rows in Chunk 错误。关闭 #19303#22129Vladimir)。
  • 修复用于从 Kafka 轮询消息的后台线程池名称。使用线程池配置错误的 Kafka 引擎将不会从消息队列中消费消息。 #22122 (fastio)。
  • 修复了 ReplicatedMergeTree 表引擎中 OPTIMIZEALTER 查询在等待时的问题。现在即使表被分离或重启,查询也不会再挂起。#22118 (alesapin).
  • 针对存在缺陷的 Linux 内核禁用 async_socket_for_remote/use_hedged_requests#22109 (Azat Khuzhin).
  • Docker entrypoint:当 LOG_PATH 为空时避免对当前目录 . 执行 chown。修复 #22100#22102filimonov)。
  • 函数 decryptAEAD 模式下未对加密数据的最小长度进行检查。此更改关闭了 #21897#22064alexey-milovidov)。
  • 在极少数情况下,CollapsingMergeTree 的合并可能会生成包含 index_granularity + 1 行的 granule。为此,在 #18928 中添加的内部检查(影响 21.2 和 21.3)可能会失败,并报错 Incomplete granules are not allowed while blocks are granules size。该错误会阻止分片进行合并。#21976Nikolai Kochetov)。
  • 回滚了可能在加载哈希类型外部字典时导致内存使用量显著增加的更改 #15454,从而解决了 #21935#21948Maksim Kita)。
  • 防止对冲连接出现重叠(Unknown packet 9 from server 错误)。#21941Azat Khuzhin)。
  • 修复了在某些情况下读取 Content-Type 为 "multipart/form-data" 的 HTTP POST 请求时出现的问题。 #21936 (Ivan).
  • 修复在查询包含窗口函数且启用了按主键顺序读取优化时出现的错误 ORDER BY 结果。修复了 #21828#21915Alexander Kuzmenkov)。
  • 修复首次执行 catboost 模型时的死锁问题。关闭 #13832#21844Kruglov Pavel)。
  • 修复了在将 WHEREHAVING 条件下推到 GROUP BY 之前时可能出现的查询结果不正确甚至崩溃的问题。修复了 #21773#21841Nikolai Kochetov)。
  • WriteBufferFromS3 中改进错误处理和日志。 #21836 (Pavel Kovalenko).
  • 修复在使用两层聚合时,带有组合器 Distinct 的聚合函数中可能出现的崩溃问题。这是对 #18365 的后续修复。该问题只能在生产环境中复现。#21818Amos Bird)。
  • 修复标量子查询的索引分析。该修复解决了在 #18896 中引入的 #21717 问题。#21766Amos Bird)。
  • 修复 ReplicatedMerge 表引擎的一个错误:当 Decimal 列的大小(32 位或 64 位)未发生变化时,ALTER MODIFY COLUMN 查询不会更改该列的类型。#21728alesapin)。
  • 修复在 ReplicatedMergeTree 上并发执行 OPTIMIZEDROP 时可能出现的无限期等待问题。 #21716 (Azat Khuzhin).
  • 修复 arrayElement 函数在 Map 类型上处理常量整数参数时的问题。#21699 (Anton Popov)。
  • 修复在使用 access_to_key_from_attributesip_trie 访问不存在的属性时导致的 SIGSEGV。 #21692 (Azat Khuzhin).
  • 服务器现在会仅在 DDLWorker 和字典初始化完成后才开始接受连接。 #21676 (Azat Khuzhin).
  • 为类型为 Join 的表的键添加类型转换(此前可能会导致 SIGSEGV)。 #21646 (Azat Khuzhin).
  • 修复在启用 async_socket_for_remote=1 时分布式请求无法正确取消的问题(例如对多个分片执行带有 limit 的简单查询,即 select * from remote('127.{2,3}', system.numbers) limit 100)。#21643Azat Khuzhin)。
  • 修复 fsync_part_directory 在水平合并中的问题。#21642 (Azat Khuzhin)。
  • 在针对外部数据库引擎(MySQL、PostgreSQL)的查询中,从 WHERE 子句中移除关联表中未知的列。关闭 #14614、关闭 #19288(重复)、关闭 #19645(重复)。#21640Vladimir)。
  • 如果在向 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#21498flynn)。
  • 修复在配置更新后 S3 表仍然保留旧凭证的问题。 #21457 (Grigory Pervakov).
  • 修复了 Poco 中 SecureSocket 内部 SSL 对象上的竞争条件问题。#21456Nikita Mikhaylov)。
  • 修复 KafkaAvro 格式解析问题。修复了 #21437#21438Ilya Golshtein)。
  • 修复 secure socket 中接收和发送超时以及非阻塞读取的问题。 #21429 (Kruglov Pavel).
  • 已修复 force_drop_table 标志位对 MATERIALIZED VIEW 不生效的问题。修复了 #18943#20626tavplubix)。
  • 修复 PredicateRewriteVisitor 中的名称冲突问题。该问题会在 FULL JOIN 之后导致 WHERE 过滤错误。关闭 #20497#20622Vladimir)。

构建/测试/打包改进

  • 为 ClickHouse Keeper 添加 Jepsen 测试。#21677 (alesapin)。
  • 在 CI 中并行执行无状态测试。依赖于 #22181#22300 (alesapin)。
  • SQLancer 的 CI 运行中启用状态检查。#22015Ilya Yatsishin)。
  • 针对 PowerPC 构建进行了多项准备:在 ppc64le 上启用内置的 openldap。#22487Kfir Itzhak)。在 ppc64le 上启用使用 Clang 编译。#22476Kfir Itzhak)。修复在 ppc64le 上编译 boost 的问题。#22474Kfir Itzhak)。修复 ppc64le 上关于内部 CMake 变量 CMAKE_ASM_COMPILE_OBJECT 未设置的 CMake 错误。#22469Kfir Itzhak)。修复 Fedora/RHEL/CentOS 在 ppc64le 上找不到 libclang_rt.builtins 的问题。#22458Kfir Itzhak)。在 ppc64le 上启用使用 jemalloc 进行构建。#22447Kfir Itzhak)。修复 ClickHouse 的配置内嵌以及 cctz 的时区内嵌在 ppc64le 上的问题。#22445Kfir Itzhak)。修复在 ppc64le 上的编译问题,并改为在 ppc64le 上使用正确的指令指针寄存器。#22430Kfir Itzhak)。
  • aarch64 上重新启用 S3(AWS)库。#22484Kfir Itzhak)。
  • 在 Docker 容器中添加 tzdata,因为读取 ORC 格式数据时需要它。此更改修复了 #14156#22000alexey-milovidov)。
  • clickhouse-server 镜像的 Dockerfile 新增 2 个参数:deb_locationsingle_binary_location#21977filimonov)。
  • 通过在使用 clang-tidy 时启用断言,允许在 release 构建中使用 clang-tidy。 #21914 (alexey-milovidov).
  • 在 CMake 脚本中添加对 llvm-12 可执行文件名称的搜索。对隐式常量转换进行处理以消除 clang 警告。更新子模块以使用 CMake 3.19 进行构建。在 readpassphrase 库中屏蔽宏展开时的递归。将 clang 中已弃用的 -fuse-ld 替换为 --ld-path#21597 (Ilya Yatsishin).
  • docker/test/testflows/runner/dockerd-entrypoint.sh 更新为使用 Yandex dockerhub-proxy,因为 Docker Hub 启用了非常严格的镜像拉取频率限制 #21551 (vzakaznikov)。
  • 修复 macOS 共享库的构建。#20184 (nvartolomei).
  • zookeeper-dump-tree 添加 ctime 选项,该选项用于导出节点的创建时间。#21842 (Ilya).

ClickHouse 版本 21.3(LTS)

ClickHouse 发布 v21.3,2021-03-12

向后不兼容变更

  • 现在不再允许使用旧语法在带有表级 TTL 的情况下创建 MergeTree 表,因为该 TTL 会被忽略。不过仍然可以附加(ATTACH)旧表。#20282 (alesapin).
  • 现在所有不区分大小写的函数名都会被重写为其规范形式。这是投影查询路由(即将推出的特性)所必需的。#20174 (Amos Bird).
  • 修复了在表达式为函数且与 ORDER BY 键相同的情况下创建 TTL 的问题。现在允许在带有 GROUP BYTTL 中为主键列设置自定义聚合方式。向后不兼容变更:对于那些不在 GROUP BY 中且未显式设置聚合方式的主键列,在 TTL 过期时现在会应用函数 any,而不是此前的 max。此外,如果你使用带有 WHEREGROUP BY 的 TTL,在进行滚动升级时的合并阶段可能会遇到异常。#15450 (Anton Popov).

新特性

  • 添加文件引擎设置:engine_file_empty_if_not_existsengine_file_truncate_on_insert#20620 (M0r64n)。
  • 添加聚合函数 deltaSum,用于对相邻行之间的差值求和。#20057 (Russ Frank)。
  • system.part_log 表中新增 event_time_microseconds 列。#20027 (Bharat Nallan)。
  • 新增 timezoneOffset(datetime) 函数,该函数返回与 UTC 的偏移量(单位为秒)。此更改关闭了 #issue:19850#19962 (keenwolf)。
  • 添加设置 insert_shard_id,用于支持从分布式表向指定分片插入数据。#19961 (flynn)。
  • 更新 reinterpretAs 函数以支持大整数。修复 #19691#19858 (Maksim Kita)。
  • 在 S3 客户端中添加对服务端加密的客户密钥(Server Side Encryption Customer Keys,x-amz-server-side-encryption-customer-(key/md5) 头)的支持。参见该链接。关闭 #19428#19748 (Vladimir Chebotarev)。
  • executable 字典源添加 implicit_key 选项。如果记录到来的顺序与输入键的顺序相同,则可避免为每条记录输出键。实现 #14527#19677 (Maksim Kita)。
  • 添加配额类型 query_selectsquery_inserts#19603 (JackyWoo)。
  • 添加函数 extractTextFromHTML#19600 (zlx19950903), (alexey-milovidov)。
  • 使用 MergeTree* 引擎的表现在新增两个用于查询并发控制的表级设置。设置 max_concurrent_queries 用于限制与该表相关的并发执行查询的数量。设置 min_marks_to_honor_max_concurrent_queries 指示仅当查询读取的 mark 数量至少达到该值时才应用前一个设置。#19544 (Amos Bird)。
  • 新增 file 函数,用于从 user_files 目录中以 String 形式读取文件。这与 file 表函数不同。该功能实现了 #issue:18851#19204 (keenwolf)。

实验性功能

  • 添加实验性的 Replicated 数据库引擎。它会在多个主机之间复制 DDL 查询。 #16193 (tavplubix).
  • 引入对窗口函数的实验性支持,可通过设置 allow_experimental_window_functions = 1 启用。该实现目前处于早期的 alpha 质量阶段,尚不适合在生产环境中使用,并且在未来的版本中可能会发生向后不兼容的变更。有关支持的功能列表,请参阅文档#20337 (Alexander Kuzmenkov).
  • 为 DiskS3 添加备份/恢复元数据文件的功能。 #18377 (Pavel Kovalenko).

性能改进

  • 为远程查询启用对冲请求。启用 use_hedged_requests(默认关闭)时,允许为一次查询与不同副本建立多个连接。如果现有与副本的连接在 hedged_connection_timeout 内未成功建立,或者在 receive_data_timeout 内未收到任何数据,则会启用新的连接。查询会使用第一个发送非空进度包的连接(或在 allow_changing_replica_until_first_data_packet 开启时,使用第一个发送数据包的连接);其他连接会被取消。支持 max_parallel_replicas > 1 的查询。#19291Kruglov Pavel)。这可以在超大规模集群上显著降低尾部延迟。
  • 当表定义了行级安全表达式时,现已支持 PREWHERE(并启用相应的优化)。 #19576 (Denis Glazachev).
  • 设置 distributed_aggregation_memory_efficient 默认启用,可降低内存占用并提升分布式查询性能。#20599alexey-milovidov)。
  • 改进对多个定长键执行 GROUP BY 时的性能。 #20472 (alexey-milovidov).
  • 通过采用更严格的别名规则提升聚合函数的性能。 #19946 (alexey-milovidov).
  • 在极端场景下(读取速度约为 50 GB/秒),通过简化流水线,从而在流水线调度中减少锁竞争,加速从 Memory 表中读取数据。#20468alexey-milovidov)。
  • 部分重写 HTTP 服务器,以减少对收发数据的拷贝次数。这在通过 HTTP 插入长记录时最高可带来约 1.5 倍的性能提升。 #19516 (Ivan).
  • Memory 表新增 compress 设置。启用后,表将占用更少的 RAM。在某些机器和数据集上,它在执行 SELECT 时也可能更快,但并非总是如此。此更改关闭了 #20093。注意:Memory 表可能比 MergeTree 更慢的原因包括:(1) 缺少压缩 (2) 块大小固定 (3) 缺少索引和 PREWHERE……#20168alexey-milovidov)。
  • 聚合代码略有改进。#20978 (alexey-milovidov)。
  • 重新添加 intDiv/modulo 的特化实现以提升性能。修复了 #21293。该回归问题是在 https://github.com/ClickHouse/ClickHouse/pull/18145 中引入的。#21307Amos Bird)。
  • 在对 Memory 表执行 INSERT SELECT 时不要过度合并数据块。在之前的版本中,执行 INSERT SELECT 后会在 Memory 表中产生低效的数据存储格式。本更改关闭了 #13052#20169alexey-milovidov)。
  • 修复了至少一处 DataType 解析器在某些情况下可能具有指数级复杂度的问题(由模糊测试发现)。从而关闭了 #20096#20132alexey-milovidov)。
  • do_not_merge_across_partitions_select_final 设置为 1,且单个 part 的级别大于 0 时,对带 FINAL 的 SELECT 查询进行并行化处理。#19375 (Kruglov Pavel)。
  • 在查询 system.partssystem.parts_columns 时仅填充请求的列。关闭问题 #19570#21035Anmol Arora)。
  • avg 聚合函数内部的算术表达式进行代数优化。关闭 #20092#20183flynn)。

改进

  • 表函数的压缩方法现已支持不区分大小写。同时修复了此前仅检查大写形式的 LZMA 压缩方法。#21416Vladimir Chebotarev)。
  • 新增两个设置,用于在非活动 part 过多时延迟插入或在插入时报错。当服务器无法足够快地清理这些 part 时,这非常有用。 #20178 (Amos Bird)。
  • 为 MySQL 客户端提供更好的兼容性:1. MySQL JDBC 2. mycli。 #21367 (Amos Bird)。
  • 如果某列被物化视图引用,则禁止删除该列。修复了 #21164#21303flynn)。
  • MySQL 字典数据源现在会在遇到意外的连接失败(在查询期间与 MySQL 服务器的连接丢失)时进行重试,这种情况有时会在 SSL/TLS 连接中发生。 #21237 (Alexander Kazakov).
  • 可用性改进:DateTime64 解析更加一致:现在可以识别以缩放整数形式指定的、带子秒精度的 Unix 时间戳(例如使用 1111111111222 而不是 1111111111.222)。这关闭了 #13194#21053alexey-milovidov)。
  • 在使用 distributed_group_by_no_merge 时,仅在发起方对已排序的数据块执行合并。 #20882 (Azat Khuzhin).
  • 在加载 mysql source 的配置时,ClickHouse 现在会对具有相同优先级的副本列表进行随机打乱,以确保在选择 mysql endpoint 时遵循轮询策略。此更改解决了 #20629#20632Alexander Kazakov)。
  • 函数 'reinterpretAs(x, Type)' 重命名为 'reinterpret(x, Type)'。#20611 (Maksim Kita)。
  • 为 RabbitMQ 引擎增加对 vhost 的支持 #20576#20596 (Kseniia Sumarokova)。
  • 改进了由 Array 与 Tuple 组合的数据类型的序列化。改进了枚举数据类型到 protobuf 枚举类型的匹配。修复了 Map 数据类型的序列化。现在会为被省略的值自动设置默认值。#20506Vitaly Baranov)。
  • 修复了分布式 DDL 任务执行与 DDL 队列清理之间的竞争条件。现在在存在活跃 worker 时,ZooKeeper 中的 DDL 任务不会被移除。修复了 #20016#20448tavplubix)。
  • 使 FQDN 和其他与 DNS 相关的功能在 Alpine 镜像中能够正常工作。#20336 (filimonov).
  • 不允许对被显式禁用的函数进行提前常量折叠。#20303 (Azat Khuzhin).
  • 之前,即使整数值无法被 Decimal 类型容纳,从整数到 Decimal 类型的隐式转换也可能会成功。现在会抛出 ARGUMENT_OUT_OF_BOUND#20232 (tavplubix).
  • 无锁 SYSTEM FLUSH DISTRIBUTED#20215Azat Khuzhin)。
  • 将 count(constant) 和 sum(1) 规范统一为 count()。这是进行投影查询路由所必需的。#20175 (Amos Bird)。
  • 在 bitmap 函数中支持所有内置整数类型。 #20171 (Amos Bird)。
  • CacheDictionaryComplexCacheDictionarySSDCacheDictionarySSDComplexKeyDictionary 更新为改用 LRUHashMap 作为底层索引结构。#20164Maksim Kita)。
  • 现在可以在启动时通过提供 CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT 来配置 access_management 设置,默认值为禁用(0),与之前的默认值相同。#20139 (Marquitos)。
  • 修复 toDateTime64(toDate()/toDateTime())DateTime64 类型上的行为 —— 实现 DateTime64 的范围钳制以与 DateTime 的行为保持一致。 #20131 (Azat Khuzhin).
  • 配额改进:SHOW TABLES 在配额统计中现在被视为一次查询,而不是两次查询。SYSTEM 查询现在会消耗配额。修复在配额消耗中对区间结束时间的计算。#20106 (Vitaly Baranov)。
  • system.zookeeper 表提供对 path IN (set) 表达式的支持。#20105 (小路).
  • system.tables 中显示 MaterializeMySQL 表的完整信息。 #20051 (Stig Bakken)。
  • 修复了可执行字典中的数据竞态问题,该问题仅在被误用时才可能出现(例如脚本在返回数据时忽略其输入)。 #20045 (alexey-milovidov).
  • 现在可以在 mysql replica 的 config 部分通过参数“opt_reconnect”来控制 MYSQL_OPT_RECONNECT 选项的值。#19998 (Alexander Kazakov)。
  • 如果用户调用 JSONExtract 函数并指定 Float32 类型,则允许向结果类型进行不精确的转换。例如,JSON 中的数字 0.1 是双精度的,在 Float32 中不可精确表示,但用户仍然希望得到这个值。之前的版本在非 Nullable 类型时返回 0,在 Nullable 类型时返回 NULL,用于表明转换是不精确的。该逻辑在语义上是 100% 正确的,但会让用户感到意外并引发疑问。此更改解决了 #13962#19960alexey-milovidov)。
  • 如果块结构不匹配,则在向 Distributed 表执行 INSERT 时添加块结构转换。 #19947 (Azat Khuzhin).
  • system.distributed_ddl_queue 表的改进。重启后将 MaxDDLEntryID 初始化为上一次的值。在此 PR 之前,MaxDDLEntryID 会一直保持为 0,直到处理新的 DDLTask。#19924 (Amos Bird)。
  • system.parts 中显示 MaterializeMySQL 表。#19770Stig Bakken)。
  • Buffer profile 添加独立的配置指令。#19721 (Azat Khuzhin).
  • 将与 JOIN 无关的条件移到 WHERE 子句中。 #18720#19685 (hexiaoting)。
  • 增加了根据异步发送时待处理字节数对写入 Distributed 的 INSERT 进行限流的功能(为 Distributed 引擎新增了 bytes_to_delay_insert/max_delay_to_insertbytes_to_throw_insert 设置)。#19673Azat Khuzhin)。
  • 修复了一些在析构函数中可能会忽略写入错误的罕见情况。#19451 (Azat Khuzhin).
  • 在致命错误时的堆栈跟踪中打印内联帧。#19317 (Ivan).

Bug 修复

  • 修复对 ZooKeeper 的重复重连问题,以及单个 ClickHouse 服务器可能出现两个活动会话的问题。这两个问题均由 #14678 引入。 #21264 (alesapin).
  • 修复在向包含 LowCardinality 列的表中以 Values 格式插入数据时出现的错误 Bad cast from type ... to DB::ColumnLowCardinality。修复了问题 #21140 #21357Nikolai Kochetov)。
  • 修复在非复制的 MergeTree 表引擎中,当 ALTER DELETE 变更操作的谓词中引用该表本身时产生的死锁问题。修复了 #20558#21477alesapin)。
  • 修复分布式查询在故障情况下出现的 SIGSEGV 问题。#21434 (Azat Khuzhin).
  • 现在,ALTER MODIFY COLUMN 查询将会正确地应用对分区键、跳过索引、TTL 等的更改。修复了 #13675#21334alesapin)。
  • 修复在使用 join_use_nulls 与从子查询中联接 TOTALS 时的错误。此更改关闭了 #19362#21137#21248vdimir)。
  • 修复在对包含 UNION 的查询执行 EXPLAIN 时发生的崩溃问题。修复了 #20876#21170#21246flynn)。
  • 现在只有在支持变更操作的表引擎(MergeTree 系列、Memory、MaterializedView)上才允许执行 mutation。其他引擎将返回更清晰的错误信息。修复了 #21168#21183alesapin)。
  • 修复了 #21112。修复了一个在执行 INSERT 查询时可能导致数据重复的问题(如果某个回调到达得稍有延迟)。#21138Kseniia Sumarokova)。
  • 修复 input_format_null_as_defaultNullable 类型上不生效的问题。修复了 #21116#21121Amos Bird)。
  • 修复了与将 Tuple 强制转换为 Map 相关的问题。关闭 #21029#21120 (hexiaoting)。
  • 修复在删除使用自定义(非默认)ZooKeeper 集群的 Replicated*MergeTree 表时出现的元数据泄漏问题。#21119 (fastio)。
  • 修复在 joinGet 中使用 LowCardinality 键时的类型不匹配问题,从而修复了 #21114#21117Amos Bird)。
  • 修复:在需要为 Replicated(*)MergeTree 引擎指定其他参数时,default_replica_pathdefault_replica_name 配置项会失效的问题。#21060 (mxzlxy)。
  • 在格式化特意构造的超出范围的 DateTime64 类型值时,可能发生内存越界访问。修复了 #20494。修复了 #20543#21023alexey-milovidov)。
  • 阻止对 storage join 的并行写入。#21009 (vdimir).
  • 修复了在执行 ALTER MODIFY COLUMN 时会创建注定失败的 mutation 的问题。 #21007 (Anton Popov).
  • 关闭了 #9969。修复了 Brotli HTTP 压缩错误,该错误会在数据量较大、结构稍复杂且使用 JSON 输出格式时复现。将 Brotli 更新到最新版本,以包含“修复环形缓冲区中对未初始化数据的罕见访问”的补丁。#20991Kseniia Sumarokova)。
  • 修复在取消查询时出现的 'Empty task was returned from async task queue' 错误。#20881 (Azat Khuzhin).
  • 在使用 MySQL 5.7 客户端连接 ClickHouse 服务器时,USE database; 查询无法使用,此问题已修复。修复了 #18926#20878tavplubix)。
  • 修复在聚合函数中同时使用 -Distinct-State 组合子时的用法问题。#20866 (Anton Popov).
  • 修复包含 UNION DISTINCTLIMIT 子句的子查询问题。关闭 #20597#20610flynn)。
  • 修复了在查询中查找不存在的键时字典行为不一致的问题。 #20578 (Nikita Mikhaylov).
  • 修正标量子查询和索引子查询所使用的线程数量(在 #19007 之后始终只使用单线程)。修复了 #20457#20512#20550Nikolai Kochetov)。
  • 修复从远程查询接收到未知数据包时可能发生的崩溃(该问题是在 #17868 中引入的)。#20547Azat Khuzhin)。
  • 在解析异步 INSERT 的目录名时添加适当的检查(修复 SIGSEGV)。 #20498 (Azat Khuzhin).
  • 修复 transform 函数在以浮点数为键时不能正常工作的问题。关闭 #20460#20479flynn)。
  • 修复在将 WITH 别名传播到子查询时导致的无限循环问题。修复了 #20388#20476Amos Bird)。
  • 修复在 HTTP 客户端断开连接时服务器异常退出的问题。 #20464 (Azat Khuzhin).
  • 修复在 JOIN 子句包含来自 SELECT 的常量且 join_use_nulls=1 时出现的 LOGICAL_ERROR#20461 (Azat Khuzhin).
  • 检查表达式列表中是否使用了表函数 view,如使用则抛出错误。此更改修复了 #20342#20350Amos Bird)。
  • 避免在 RANGE_HASHED() 字典中出现无效解引用。 #20345 (Azat Khuzhin).
  • 使用 join_use_nulls=1 修复空指针解引用问题。 #20344 (Azat Khuzhin).
  • 修复了不同 scale 的两个 Decimal 常量之间二元运算结果不正确的问题。修复了 #20283#20339Maksim Kita)。
  • 修复 ReplicatedMergeTree 表引擎家族中失败后台任务重试过于频繁的问题。该问题可能导致日志过于冗长并增加 CPU 负载。修复 #20203#20335alesapin)。
  • *CollapsingMergeTreeReplacingMergeTree 表引擎的版本列操作限制为仅允许执行 DROPRENAME#20300 (alesapin).
  • 修复了在 JSON 数据损坏时尝试将整个文件读入内存、从而导致内存分配器抛出异常的行为。修复了 #19719#20286Nikita Mikhaylov)。
  • 修复在对不支持垂直合并的 MergeTree 表引擎族执行垂直合并时抛出的异常。修复了 #20259#20279alesapin)。
  • 修复在关闭阶段重新加载配置时偶发的服务器崩溃。修复了 #19689#20224alesapin)。
  • 修复在 INSERT SELECT 中使用 CTE 时的问题。修复了 #20187#20195#20211Amos Bird)。
  • 已修复 #19314。详见 #20156Ivan)。
  • 修复 toMinute 函数,使其可以正确处理特殊时区。#20149 (keenwolf)。
  • 修复在执行包含 if 函数且 then/else 分支结果为 Tuple 类型(该 Tuple 类型中必须包含 Array 或其他复杂类型)的查询时出现的服务器崩溃问题。修复 #18356#20133alesapin)。
  • MongoDB 表引擎现在只会在需要读取数据时才建立连接。ATTACH TABLE 将不再尝试进行连接。#20110Vitaly Baranov)。
  • 修复 StorageJoin 中的错误。 #20079 (vdimir)。
  • 修复在对负数以较小除数进行取模运算时,由于结果数据类型不足以容纳负结果而导致的问题。此更改关闭了 #20052#20067alexey-milovidov)。
  • MaterializeMySQL:修复对更新多个表的语句的复制问题。#20066 (Håvard Kvålen).
  • 在初始化脚本执行期间,防止在 Docker 中出现 “Connection refused” 错误。 #20012 (filimonov).
  • EmbeddedRocksDB 是一项实验性存储。修复了类型检查不完善的问题,并简化了代码。由此关闭 #19967#19972alexey-milovidov)。
  • 修复函数 fromModifiedJulianDay 在参数类型为 Nullable(T) 且其底层整数类型为除 Int32 之外的任意类型时出现的段错误(segfault)。#19959 (PHO)。
  • 修复 BloomFilter 索引崩溃问题。修复了 #19757#19884Maksim Kita)。
  • 当启用 system.text_log 时,可能会出现死锁。已修复 #19874#19875alexey-milovidov)。
  • 修复在存在包含 dictGet() 默认表达式的表时服务器启动失败的问题。允许在不加载字典的情况下获取 dictGet() 的返回类型。#19805 (Vitaly Baranov).
  • 修复在仅执行 select 查询时 clickhouse-client 异常中止的问题。 #19790 (taiyang-li).
  • 修复了在启动多个 clickhouse-copier 时,将分片移动到目标表可能会失败的问题。#19743 (madianjun).
  • 执行 ON CLUSTER 查询的后台线程可能会挂起,等待已被删除的复制表执行某些操作。该问题已修复。 #19684 (yiguolei).

构建 / 测试 / 打包改进

  • 允许全局启用 AVX2 优化的 ClickHouse 构建。这在现代 CPU 上能带来轻微的性能收益。不推荐用于生产环境,目前也不会作为官方构建提供支持。#20180 (alexey-milovidov).
  • 修复了一些由 Coverity 发现的问题。参见 #19964#20010 (alexey-milovidov).
  • 允许在 gdb 下使用已修改的二进制文件启动。在之前的版本中,如果在启动前在 gdb 中设置断点,服务器会因为完整性校验失败而拒绝启动。#21258 (alexey-milovidov).
  • 为 Kafka 中不同压缩方法添加测试。#21111 (filimonov).
  • 修复了 test_storage_kerberized_hdfs 测试中的端口冲突问题。#19974 (Ilya Yatsishin).
  • 在集成测试中启动 Docker 失败时,将 stdoutstderr 打印到日志中。在此 PR 之前,这种情况下只有一条非常简短的错误信息,不利于问题排查。#20631 (Vitaly Baranov).

ClickHouse 发行版 21.2

ClickHouse 发行版 v21.2.2.8-stable,2021-02-07

向后不兼容变更

  • 禁止对浮点参数使用按位函数(bitAndbitOr 等)。现在必须先将其显式转换为整数类型。 #19853 (Azat Khuzhin).
  • 禁止对浮点数使用 lcm/gcd#19532 (Azat Khuzhin).
  • 修复 OPTIMIZE TABLE/合并操作的内存跟踪;在执行 OPTIMIZE TABLE/合并操作时计入查询内存限制和采样。 #18772 (Azat Khuzhin).
  • 不允许使用浮点列作为分区键,参见 #18421#18464 (hexiaoting).
  • 不再支持在类型定义中使用多余的括号,例如:Array((UInt8))

新特性

  • 新增 PostgreSQL 表引擎(支持 select/insert 操作并支持多维数组),并可作为表函数使用。新增 PostgreSQL 字典源。新增 PostgreSQL 数据库引擎。#18554 (Kseniia Sumarokova).
  • 数据类型 Nested 现在支持任意层级的嵌套。新引入了复杂类型的子列,例如 Array 中的 size0Nullable 中的 nullTuple 元素的名称,这些子列可以在不读取整个列的情况下单独读取。#17310 (Anton Popov).
  • FlatDictionaryHashedDictionaryComplexKeyHashedDictionaryDirectDictionaryComplexKeyDirectDictionaryRangeHashedDictionary 添加了对 Nullable 的支持。#18236Maksim Kita)。
  • 添加了一个名为 system.distributed_ddl_queue 的新表,用于显示 DDL worker 队列中的查询。 #17656 (Bharat Nallan)。
  • 新增支持将来自 LDAP 用户目录的用户的 LDAP 组名称及通用属性值映射到本地角色。 #17211 (Denis Glazachev).
  • cluster 表函数新增对 INSERT INTO 的支持,并且对于 remotecluster 两个表函数,支持通过指定分片键在各节点间分发数据。关闭 #16752#18264 (flynn)。
  • 添加函数 decodeXMLComponent,用于解码 XML 转义字符。例如:SELECT decodeXMLComponent('Hello,&quot;world&quot;!') #17659#18542nauta)。
  • 新增函数 parseDateTimeBestEffortUSOrZeroparseDateTimeBestEffortUSOrNull#19712 (Maksim Kita).
  • 新增 sign 数学函数。#19527 (flynn)。
  • 在 system.query_log 中添加有关查询中使用到的功能(函数、表引擎等)的信息。 #18495#19371 (Kseniia Sumarokova)。
  • 函数 formatDateTime 支持使用 %Q 修饰符将日期格式化为季度。 #19224 (Jianmei Zhang).
  • 在 Play UI 中增加对 MetaKey+Enter 快捷键绑定的支持。#19012 (sundyli)。
  • 为 map 数据类型新增三个函数:1. mapContains(map, key) 用于检查 map 的键中是否包含第二个参数 key。2. mapKeys(map) 以 Array 格式返回所有键。3. mapValues(map) 以 Array 格式返回所有值。 #18788 (hexiaoting).
  • 新增与 #18494 相关的 log_comment 设置项。 #18549 (Zijie Lu)。
  • argMinargMax 函数添加对元组参数的支持。 #17359 (Ildus Kurbangaliev).
  • 支持 EXISTS VIEW 语法。#18552 (Du Chuan)。
  • 添加 SELECT ALL 语法,关闭 #18706#18723 (flynn)。

性能改进

  • 通过减少 stat 系统调用次数来加快 part 删除。这恢复了之前的一项优化,并提供了更安全的 IDisk 接口,修复了 #19065#19086alexey-milovidov)。
  • WITH 语句中声明的别名现在可以在索引分析中被正确使用。类似 WITH column AS alias SELECT ... WHERE alias = ... 的查询现在可以使用索引。#18896Amos Bird)。
  • 新增 optimize_alias_column_prediction(默认开启),它将:- 在分区剪枝和使用二级索引跳过数据时,正确考虑 WHERE 子句中的列别名;- 对于 optimize_trivial_count 的简单 count 查询,正确考虑 WHERE 子句中的列别名;- 对于 optimize_aggregation_in_order/optimize_read_in_order,在 GROUP BY/ORDER BY 中正确考虑列别名。#16995sundyli)。
  • 提升聚合函数 sum 的速度。改进仅在合成基准测试中可见,实际意义不大。#19216alexey-milovidov)。
  • 更新 libc++ 并使用另一种 ABI 以提供更好的性能。#18914Danila Kutenin)。
  • 在逻辑等价时,将 sumIf()sum(if()) 函数重写为 countIf() 函数。#17041flynn)。
  • 对 S3 连接使用连接池,由 s3_max_connections 设置控制。#13405Vladimir Chebotarev)。
  • 增加对 zstd long 选项的支持,以便对字符串列进行更高效的压缩,从而节省空间。#17184ygrek)。
  • 通过移除每次连接时对配置的访问,略微降低服务器延迟。#19863alexey-milovidov)。
  • 降低 Buffer 引擎多层之间的锁竞争。#19379Azat Khuzhin)。
  • 支持将查询计划中的 Filter 步骤拆分为 Expression + Filter 组合。配合 Expression + Expression 合并优化(#17458),可以将某些表达式的执行延后到 Filter 步骤之后。#19253Nikolai Kochetov)。

改进

  • 只要还能从 table 中选择至少一列,现在就可以执行 SELECT count() FROM table。此 PR 修复了 #10639#18233Vitaly Baranov)。
  • 与远程 MySQL 服务器交互时,将字符集设置为 utf8mb4,以修复 #19795#19800alexey-milovidov)。
  • S3 表函数现在支持 auto 压缩模式(自动检测)。这解决了 #18754#19793Vladimir Chebotarev)。
  • formatReadableTimeDelta 函数在处理无穷大参数时正确输出结果。在先前版本中,这些参数会被隐式转换为取决于具体实现的整数值。#19791 (alexey-milovidov)。
  • 当无法精确确定区域时,表函数 S3 将使用全局区域,从而解决了 #10998#19750Vladimir Chebotarev)。
  • 在分布式查询中,如果启用了 async_socket_for_remote 设置,当表中使用了嵌套层级非常深的数据类型(例如 Array(Array(Array(...more...))))时,至少在调试构建配置下有可能导致栈溢出。此更改修复了 #19108。该更改引入了轻微的向后不兼容性:类型定义中的多余括号不再支持,例如:Array((UInt8))#19736alexey-milovidov)。
  • 为消息代理(RabbitMQ 和 Kafka)添加单独的资源池。#19722 (Azat Khuzhin).
  • 修复在非复制 MergeTree 中罕见出现的 max_number_of_merges_with_ttl_in_pool 限制被突破的问题(可以分配更多带 TTL 的合并任务)。#19708 (alesapin).
  • Dictionary:改进了在解析属性时的错误消息。 #19678 (Maksim Kita).
  • 新增一个选项,用于在读取时禁用校验和验证。绝不应在生产环境中使用。请不要指望通过禁用它获得任何好处。它仅可用于实验和基准测试。该设置仅适用于 MergeTree 系列表。对于其他表引擎以及通过网络接收数据时,始终会验证校验和。根据我的观察,性能差异要么不存在,要么低于 0.5%。 #19588 (alexey-milovidov)。
  • 支持在函数 multiIf 中使用常量结果。#19533 (Maksim Kita)。
  • 为 Map 数据类型启用 length/empty/notEmpty 函数,其返回 Map 中键的数量。#19530 (taiyang-li)。
  • clickhouse-benchmark 新增 --reconnect 选项。指定该选项后,将在每次请求前重新建立连接,用于测试场景。#19872 (alexey-milovidov)。
  • 支持新的 .debug 文件位置。这修复了问题 #19348#19520Amos Bird)。
  • toIPv6 函数解析 IPv4 地址。 #19518 (Bharat Nallan).
  • http_referer 字段添加到 system.query_logsystem.processes 等。由此解决了 #19389#19390alexey-milovidov)。
  • 通过将更多函数改为大小写不敏感并添加别名来提升对 MySQL 的兼容性。#19387 (Daniil Kondratyev)。
  • 为 MergeTree 部件(Wide/Compact/InMemory)类型添加指标。 #19381 (Azat Khuzhin)。
  • 允许使用任意 UID 运行 Docker。 #19374 (filimonov).
  • 修复 IPv4 数据类型在 Pretty 格式中的数值对齐错误。此前这些数值被右对齐,而不是左对齐。此更改关闭了 #19184#19339alexey-milovidov)。
  • 允许在无需重启的情况下更改 max_server_memory_usage。已关闭 #18154#19186 (alexey-milovidov)。
  • 在之前的版本中,当使用某些 NaN 参数调用函数 bar 时抛出的异常可能稍有误导性。此更改修复了 #19088#19107alexey-milovidov)。
  • 在 clickhouse-server 镜像中,将 clickhouse 用户及其用户组的 UID/GID 明确设置为固定值 101。#19096 (filimonov)。
  • 修复了在插入包含超长字符串的数据时出现的 PeekableReadBuffer: Memory limit exceed 错误,解决了 #18690#18979tavplubix)。
  • Docker 镜像:对 clickhouse-server 入口脚本进行了多项改进。 #18954 (filimonov).
  • 添加 normalizeQueryKeepNamesnormalizedQueryHashKeepNames,使在规范化查询时不会将较长的名称替换为 ?。这有助于更好地分析复杂的查询日志。#18910 (Amos Bird)。
  • 在发送之前,在发送端对分布式批次的每个数据块执行校验和检查(在读取文件时即可验证校验和,无需对文件进行二次读取),从而避免在接收端发生 INSERT 操作卡住(例如当发送端的 .bin 文件被截断时)。同时,避免在批量 INSERT 时对 .bin 文件进行两次读取(此前为在压缩合并时计算行数/字节数所必需,现在这些信息已包含在头部,并保留了向后兼容性)。 #18853 (Azat Khuzhin).
  • 修复在包含聚合函数状态的表之间执行 RIGHT 和 FULL JOIN 时出现的问题。在之前的版本中会抛出与 cloneResized 方法相关的异常。 #18818 (templarzq).
  • 添加了基于前缀的 S3 端点设置。#18812 (Vladimir Chebotarev)。
  • 为 bitmapTransform、bitmapSubsetInRange、bitmapSubsetLimit、bitmapContains 函数新增对 [UInt8, UInt16, UInt32, UInt64] 参数类型的支持。此更改修复了 #18713#18791sundyli)。
  • 允许对 CTE(Common Table Expressions,公用表表达式)进行进一步的别名定义。当 enable_global_with_statement = 1 时,将 CSE(Common Subexpressions Elimination,公共子表达式消除)传播到同一层级的子查询。修复了 #17378。修复了 https://github.com/ClickHouse/ClickHouse/pull/16575#issuecomment-753416235#18684Amos Bird)。
  • 将 librdkafka 更新到 v1.6.0-RC2。修复 #18668#18671filimonov)。
  • 在出现意外异常时,自动重启负责执行分布式 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#18373Amos Bird)。
  • 修复在启动服务器时,当表包含带有 dictGet() 默认表达式的列时出现的问题。允许在不加载字典的情况下获取 dictGet() 的返回类型。#19805 (Vitaly Baranov).
  • 修复执行使用 if 函数且 then/else 分支结果为 Tuple 类型的查询时导致的服务器崩溃问题。Tuple 类型必须包含 Array 或其他复杂类型。修复 #18356#20133alesapin)。
  • MaterializeMySQL(实验性功能):修复对多个表进行更新的语句的复制问题。#20066Håvard Kvålen)。
  • 在执行初始化脚本期间,防止在 Docker 中出现“Connection refused”错误。#20012 (filimonov).
  • EmbeddedRocksDB 是一种实验性存储引擎。修复了缺少适当类型检查的问题,并简化了代码。此更改关闭了 #19967#19972alexey-milovidov)。
  • 修复函数 fromModifiedJulianDay 在参数类型为 Nullable(T)(其中 T 为除 Int32 之外的任意整型)时发生的段错误。 #19959 (PHO)。
  • 函数 greatCircleAngle 在之前的版本中会返回不准确的结果。这修复了 #19769#19789alexey-milovidov)。
  • 修复一个罕见的问题:在数据损坏后,某些复制操作(如 mutation)无法处理部分数据。修复了 #19593#19702alesapin)。
  • 执行 ON CLUSTER 查询的后台线程可能会在等待已删除的复制表执行某些操作时挂起。该问题已修复。#19684 (yiguolei).
  • 修复列描述的反序列化错误。该问题会导致无法对包含名为 \ 的列的表执行 INSERT 操作。#19479 (alexey-milovidov)。
  • 在某个文件中出现空数据块时,将分布式批处理标记为损坏状态。#19449 (Azat Khuzhin)。
  • 修复了一个极其罕见的问题,它可能会在执行 DROP/DETACH/REPLACE/MOVE PARTITION 之后导致 mutation 挂起。该问题在大多数场景下已通过 #15537 得到部分修复。#19443tavplubix)。
  • 修复了可能出现的错误 Extremes transform was already added to pipeline。已修复 #14100#19430Nikolai Kochetov)。
  • 修复在带有非零默认值(例如某些 Enum)的 JOIN 类型中的默认值处理。关闭 #18197#19360vdimir)。
  • 在遇到 EOF 时,不要将用于分布式发送的文件标记为损坏。#19290 (Azat Khuzhin).
  • 修复 async_socket_for_remote 的管道文件描述符泄漏问题。 #19153 (Azat Khuzhin).
  • 修复以 ORC 格式从文件进行无限循环读取的问题(在 #10580 中引入)。修复了 #19095#19134Nikolai Kochetov)。
  • 修复了 MergeTree 数据写入器中的问题,该问题可能导致标记大小超过固定粒度大小。修复了 #18913#19123alesapin)。
  • 修复启动 Bug:当 ClickHouse 无法从 LowCardinality(Nullable(...)) 读取压缩编解码器并抛出异常 Attempt to read after EOF 时会导致启动失败的问题。修复了 #18340#19101alesapin)。
  • 简化 tupleHammingDistance 的实现。支持任意长度相同的元组。修复 #19029#19084Nikolai Kochetov)。
  • 确保 groupUniqArray 在处理 Enum 类型参数时返回正确的类型。此更改修复了 #17875 中的问题。#19019alexey-milovidov)。
  • 修复在将 LowCardinality 参数与函数 ignore 一起使用时可能出现的 Expected single dictionary argument for function 错误。修复 #14275#19016Nikolai Kochetov)。
  • 修复向使用 TinyLog 引擎的表中插入 LowCardinality 列时的问题。修复了 #18629#19010Nikolai Kochetov)。
  • 修复 JOIN 中的一个小问题:JOIN 试图物化常量列,但我们的代码假定这些列会在其他地方再进行物化。#18982 (Nikita Mikhaylov)。
  • 禁用 optimize_move_functions_out_of_any,因为此优化在所有情况下并不总是正确。此更改从而关闭了 #18051。此更改从而关闭了 #18973#18981alexey-milovidov)。
  • 修复可能由于合并查询计划中的 Expression 步骤而引发的异常 QueryPipeline stream: different number of columns。修复了 #18190#18980Nikolai Kochetov)。
  • 修复了在关闭时极少见的死锁问题。#18977 (tavplubix)。
  • 修复了在服务器内存耗尽时出现的罕见崩溃问题。 #18976 (tavplubix).
  • 修复在执行 ALTER TABLE ... DROP PART 'part_name' 查询时会删除整个分区所有去重块的不正确行为。修复 #18874#18969alesapin)。
  • 修复了问题 #18894:添加了检查,以避免当长列别名('table.column' 样式,通常由 Looker 等 BI 工具自动生成)与长表名相等时抛出异常。#18968 (Daniel Qin)。
  • 修复错误 Task was not found in task queue(仅会在远程查询且 async_socket_for_remote = 1 时出现)。#18964 (Nikolai Kochetov).
  • 修复了包含某些转义文本的 mutation 语句(例如 ALTER ... UPDATE e = CAST('foo', 'Enum8(\'foo\' = 1'))被错误序列化的问题。修复了 #18878#18944alesapin)。
  • ATTACH PARTITION 将重置所有 mutation。 #18804#18935 (fastio)。
  • 修复 bitmapOrCardinality 中可能导致 nullptr 解引用的问题。此更改关闭了 #18911#18912sundy-li)。
  • 修复了在尝试将 NULLNullable(String) CASTNullable(Decimal(P, S)) 时出现的 Attempt to read after eof 错误。现在,当 CAST 函数无法从可为空字符串解析出十进制数时,会返回 NULL。修复了 #7690#18718Winter Zhang)。
  • 修复 MySQL 引擎中的数据类型转换问题。 #18124 (bo zeng).
  • 修复在仅执行 select 时 clickhouse-client 异常中止的问题。#19790taiyang-li)。

构建/测试/打包改进

ClickHouse 发行版 21.1

ClickHouse 发行版 v21.1.3.32-stable,2021-02-03

Bug 修复

  • 修复 BloomFilter 索引导致的崩溃。修复 #19757#19884Maksim Kita)。
  • 修复了在将谓词下推到 UNION DISTINCT 子查询时发生的崩溃问题。修复了 #19855#19861Amos Bird)。
  • 修复按 UInt8 类型中大于 127 的值进行过滤的问题。#19799 (Anton Popov).
  • 在之前的版本中,向函数 arrayEnumerateUniq 传入异常的参数可能会导致崩溃或陷入无限循环。此更改修复了 #19787#19788alexey-milovidov)。
  • 修复在对算术类型与字符串类型进行精确比较时出现的栈溢出问题。#19773 (tavplubix).
  • 修复在 WHEREPREWHERE 中使用嵌套列名时导致的崩溃。对应修复 #19755#19763Nikolai Kochetov)。
  • 修复 bitmapAndnot 函数中的段错误。解决了 #19668#19713Maksim Kita)。
  • 某些使用大整数的函数可能会导致段错误。大整数功能仍处于实验阶段。本次更改关闭了 #19667#19672alexey-milovidov)。
  • 修复函数 neighbor 在处理 LowCardinality 参数时返回错误结果的问题。修复了 #10333#19617Nikolai 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#19472alexey-milovidov)。
  • 如果将空字符串作为 IV 传入,加解密函数中可能会发生未初始化内存读取。此修复关闭了 #19391#19397alexey-milovidov)。
  • 修复 Uber H3 库中可能出现的缓冲区溢出问题。详见 https://github.com/uber/h3/issues/392。此更改关闭了 #19219#19383alexey-milovidov)。
  • 修复 system.parts 表中的 _state 列(此前由于顺序不正确,查询该列时会触发 LOGICAL_ERROR)。 #19346 (Azat Khuzhin)。
  • 修复了在物化视图与其目标表结构不同时进行聚合时可能出现的错误结果或段错误。修复了 #18063#19322tavplubix)。
  • 修复错误 Cannot convert column now64() because it is constant but values of constants are different in source and result。作为对 #7156 的延续。#19316Nikolai Kochetov)。
  • 修复在处理 ReplicatedMergeTree 表时,并发执行 ALTERDROP 查询可能导致挂起的问题。#19237 (alesapin).
  • 修复了通过 HTTP 接口使用 TemplateCustomSeparated 格式插入数据时出现的 There is no checkpoint 错误。对应修复:#19021#19072 (tavplubix)。
  • 在分析阶段,如果无法计算子查询的结果,则禁用对子查询的常量折叠。 #18446 (Azat Khuzhin).
  • 在执行 MOVEREPLACE PARTITION 操作后,或者在少数情况下执行 DETACHDROP PARTITION 后,Mutation 可能会因为等待某个不存在的 part 而挂起。该问题已修复。 #15537 (tavplubix)。

ClickHouse 发行版 v21.1.2.15-stable 2021-01-18

向后不兼容变更

  • 设置 input_format_null_as_default 现在默认启用。#17525 (alexey-milovidov).
  • 对来自配置文件的 profile 设置检查约束条件。如果 users.xml 中包含不满足相应约束的设置,服务端将无法启动。#18486 (tavplubix).
  • 限制通过 ALTER MODIFY SETTING 修改影响数据 part 的存储设置(write_final_markenable_mixed_granularity_parts)。#18306 (Amos Bird).
  • insert_quorum_parallel 默认设置为 1。与“顺序”仲裁写入相比,它要方便得多。但如果你依赖顺序一致性,则应将该设置改回 0。#17567 (alexey-milovidov).
  • 移除 sumburConsistentHash 函数。关闭了 #18120#18656 (alexey-milovidov).
  • 移除了聚合函数 timeSeriesGroupSumtimeSeriesGroupRateSum,因为我的一位朋友说它们从来没有正常工作过。这修复了 #16869。如果你曾经成功使用过这些函数,请发送邮件至 [email protected]#17423 (alexey-milovidov).
  • 禁止 toUnixTimestamp(Date())(之前它只返回 DateUInt16 表示)。#17376 (Azat Khuzhin).
  • 允许在 avgavgWeighted 函数中使用扩展整数类型(Int128Int256UInt256)。同时允许在 avgWeighted 函数中为值和权重使用不同类型(整数、十进制、小数点浮动类型)。这是一个向后不兼容的变更:现在 avgavgWeighted 函数始终返回 Float64(如文档所述)。在此变更之前,对 Decimal 参数的返回类型也是 Decimal#15419 (Mike).
  • 表达式 toUUID(N) 不再可用。请替换为 toUUID('00000000-0000-0000-0000-000000000000')。进行此变更的原因是在 N 非零时,toUUID(N) 的结果并不直观。
  • 具有不正确“密钥用法(key usage)”的 SSL 证书将被拒绝。在之前的版本中,这些证书仍然可以使用。参见 #19262
  • 从默认配置中移除了对替换文件(/etc/metrika.xml)的 incl 引用(<remote_servers><zookeeper><macros><compression><networks>)。如果你使用了替换文件并依赖这些隐式引用,则在升级前应通过添加带有 incl="..." 属性的相应部分,将它们手动、显式地加回去。参见 #18740 (alexey-milovidov)。

新特性

  • 在 ClickHouse 中实现 gRPC 协议。#15111Vitaly Baranov)。
  • 允许使用多个 ZooKeeper 集群。 #17070 (fastio).
  • 实现了 REPLACE TABLECREATE OR REPLACE TABLE 语句。#18521 (tavplubix)。
  • 实现对 UNION DISTINCT 的支持,并默认将普通的 UNION 子句视为 UNION DISTINCT。新增设置 union_default_mode,可将其视为 UNION ALL,或要求显式指定模式。 #16338 (flynn)。
  • 添加了函数 accurateCastOrNull。解决了 #10290。在 x IN (subquery) 表达式中添加了类型转换。解决了 #10266#16724Maksim Kita)。
  • IP Dictionary 直接支持 IPv4 / IPv6 类型。#17571 (vdimir)。
  • IP Dictionary 现已支持按键查询。解决了 #18241#18480vdimir)。
  • 为数据导入和导出增加 *.zst 压缩/解压缩支持。这样可以在 file() 函数中使用 *.zst,并在 HTTP 客户端中使用 Content-Encoding: zstd。此更新关闭了 #16791 #17144 (Abi Palagashvili)。
  • 新增了 mannWitneyUTeststudentTTestwelchTTest 聚合函数。对 rankCorr 进行了部分重构。#16883Nikita Mikhaylov)。
  • 新增函数 countMatches/countMatchesCaseInsensitive#17459 (Azat Khuzhin).
  • 实现 countSubstrings()/countSubstringsCaseInsensitive()/countSubstringsCaseInsensitiveUTF8()(用于统计子串出现次数)。 #17347 (Azat Khuzhin).
  • 在 system.query_log 中添加有关使用到的数据库、表和列的信息。新增 query_kindnormalized_query_hash 字段。#17726 (Amos Bird)。
  • 添加了设置 optimize_on_insert。启用后,会对 INSERT 插入的数据块执行与对该数据块进行合并时(例如 Replacing、Collapsing、Aggregating 等)相同的转换。该设置默认启用。此设置可能会影响物化视图和 MaterializeMySQL 的行为(参见详细说明)。修复了 #10683#16954Kruglov Pavel)。
  • 针对 HDFS 的 Kerberos 身份验证。 #16621 (Ilya Golshtein).
  • 支持 SHOW SETTINGS 语句来显示 system.settings 中的参数,同时也支持 SHOW CHANGED SETTINGS 以及 LIKE/ILIKE 子句。#18056 (Jianmei Zhang)。
  • 函数 position 现在支持 POSITION(needle IN haystack) 语法,以提升 SQL 兼容性。此更改解决了 #18701。... #18779Jianmei Zhang)。
  • 现在,我们为 MergeTree 系列的表新增了一个存储设置项 max_partitions_to_read,用于限制单个查询中可访问的最大分区数量。同时还添加了一个用户设置 force_max_partition_limit,用于强制执行该限制。#18712Amos Bird)。
  • 为已插入的 part 在 system.part_log 中添加 query_id 列。解决 #10097#18644flynn)。
  • 允许在 CREATE TABLE AS SELECT 语句中显式指定列。示例:CREATE TABLE t1 (x String) ENGINE = Memory AS SELECT 1;#18060Maksim Kita)。
  • 新增了 arrayMinarrayMaxarrayAvg 聚合函数。#18032 (Maksim Kita).
  • 实现了 ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ... 查询。该查询会使用提供的表结构创建一个新表,并从 user_files 中指定的目录中附加表数据。#17903 (tavplubix)。
  • 为 StorageMemory 添加对 mutation 的支持。关闭了 #9117#15127flynn)。
  • 新增对语法 EXISTS DATABASE name 的支持。#18458Du Chuan)。
  • MySQL 类似,支持内置函数 isIPv4StringisIPv6String#18349Du Chuan)。
  • 添加新设置 insert_distributed_one_random_shard = 1,以便在没有分布键的情况下向多分片的分布式表插入数据。#18294 (Amos Bird)。
  • min_compress_block_sizemax_compress_block_size 设置项添加到 MergeTreeSettings,这些设置项的优先级高于全局设置,并在配置后生效。关闭 13890#17867 (flynn)。
  • 新增对 64 位 Roaring 位图的支持。#17858 (Andy Yang).
  • 扩展了 OPTIMIZE ... DEDUPLICATE 语法,以允许显式指定(或使用星号/列转换函数隐式指定)用于检查重复数据的列列表。... #17846 (Vasily Nemkov).
  • 新增了函数 toModifiedJulianDayfromModifiedJulianDaytoModifiedJulianDayOrNullfromModifiedJulianDayOrNull。这些函数在前推公历日期与修正儒略日数之间进行转换。 #17750 (PHO)。
  • 支持使用自定义 TLD 列表:新增函数 firstSignificantSubdomainCustomcutToFirstSignificantSubdomainCustom#17748 (Azat Khuzhin).
  • 为原生 TCP 接口新增对 PROXYv1 协议的支持。允许将配额键设为代理转发的 IP 地址(同时适用于 PROXYv1 提供的地址以及来自 HTTP 接口的 X-Forwarded-For 头)。当你仅通过可信代理(例如 Cloudflare)对外提供 ClickHouse 访问,但又希望按照用户的原始 IP 地址来统计其资源使用时,这将非常有用。修复了 #17268#17707alexey-milovidov)。
  • 现在,clickhouse-client 支持打开 EDITOR 来编辑命令。按 Alt-Shift-E#17665Amos Bird)。
  • 添加函数 encodeXMLComponent,用于对字符进行转义,以便将字符串放入 XML 文本节点或属性中。#17659 (nauta)。
  • 引入 DETACH TABLE/VIEW ... PERMANENTLY 语法,使得在重启后该表不会自动重新附加(只能通过显式请求)。该表仍然可以使用简写语法 ATTACH TABLE 重新附加。实现了 #5555。修复了 #13850#17642filimonov)。
  • 在 MergeTree 表中添加总行数、总字节数和分片数量的异步指标。这修复了问题 #11714#17639flynn)。
  • 为 SQL 之外的分页添加 limitoffset 设置:#16176 它们对于构建 API 很有用。对于 SELECT 查询,这两个设置的效果等同于在外面再包一层:select * from (your_original_select_query) t limit xxx offset xxx;#17633hexiaoting)。
  • 提供一个新的聚合组合子:-SimpleState,用于在查询中构建 SimpleAggregateFunction 类型。它对于定义 AggregatingMergeTree 引擎的物化视图很有用,同时也将使投影受益。#16853 (Amos Bird)。
  • clickhouse-clientclickhouse-local 新增了 queries-file 参数。#15930 (Maksim Kita)。
  • clickhouse-benchmark 添加了 query 参数。#17832 (Maksim Kita)。
  • EXPLAIN AST 现在支持 SELECT 以外的查询。#18136 (taiyang-li).

实验特性

  • 增加了用于计算文本 n-gram 和 shingles 的 minHash 与 simHash 的函数,用于半重复数据查找。同时新增函数 bitHammingDistancetupleHammingDistance#7649 (flynn).
  • 新增数据类型 Map。参见 #1841。Map 的首个版本仅支持键和值为 String 类型。#15806 (hexiaoting).
  • 实现了一个基于 ANTLR4 runtime 并由 EBNF 语法生成的替代 SQL 解析器。#11298 (Ivan).

性能改进

  • 新的 IP Dictionary 实现,具有更低的内存占用、在部分场景下更佳的性能,并修复了一些缺陷。#16804 (vdimir)。
  • 数据导出的并行格式化功能。#11617 (Nikita Mikhaylov)。
  • LDAP 集成:在 LDAP 服务器连接配置中新增 verification_cooldown 参数,用于在可配置的时间段内缓存成功的 “bind” 尝试。#15988 (Denis Glazachev).
  • clickhouse-local 添加 --no-system-table 选项,以在不加载系统表的情况下运行。这样可以避免在启动时初始化 DateLUT,该过程可能会耗费可观的时间(数十毫秒)。#18899 (alexey-milovidov)。
  • AggregateFunctionWindowFunnelData 中将 PODArray 替换为 PODArrayWithStackMemory,以提高 windowFunnel 函数的性能。 #18817 (flynn).
  • 在对 Distributed 表执行同步 INSERT 时,不再向分片发送空数据块。由此关闭了 #14571#18775alexey-milovidov)。
  • 针对 StorageMemory 进行了读取优化。#18052 (Maksim Kita)。
  • 使用 Dragonbox 算法替代 ryu 来将浮点数转换为字符串。这大幅提升了浮点数到字符串转换的性能。#17831 (Maksim Kita)。
  • 加速 IPv6CIDRToRange 的实现。 #17569 (vdimir).
  • 添加 remerge_sort_lowered_memory_bytes_ratio 设置项(如果重新归并后的内存使用量未按该比例得到降低,则会禁用重新归并)。#17539 (Azat Khuzhin).
  • 改进了在主键中使用 SimpleAggregateFunction(String) 时 AggregatingMergeTree 的性能。#17109 (Azat Khuzhin)。
  • 现在 -If 组合器已被去虚拟化,count 也已正确向量化。此更改对应于 这个 PR#17043Amos Bird)。
  • 修复在存在大量 MergeTree 表时,从 Merge 表读取的性能问题。修复了 #7748#16988Anton Popov)。
  • 提升了函数 repeat 的性能。 #16937 (satanson).
  • 略微提升浮点数解析性能。 #16809 (Maksim Kita).
  • OPTIMIZE TABLE ... FINAL 添加跳过已合并分区的功能。 #15939 (Kruglov Pavel).
  • 集成 Daniel Lemire 的 fast_float 以解析浮点数。#16787Maksim Kita)。目前尚未启用,因为其性能仍然低于 ClickHouse 中现有的粗略浮点数解析器。
  • 修复 max_distributed_connections(影响 prefer_localhost_replica = 1max_threads != max_distributed_connections)。 #17848 (Azat Khuzhin).
  • 在向 S3 发送数据时自适应选择单分片或多分片上传方式。单分片上传由新的设置 max_single_part_upload_size 控制。#17934Pavel Kovalenko)。
  • PipelineExecutor 中增加对异步任务的支持。为远程查询引入初步的异步套接字支持。#17868 (Nikolai Kochetov).
  • 允许在列大小未知的情况下,在 compact 部件上使用 optimize_move_to_prewhere 优化。#17330 (Anton Popov).

改进

  • 避免在使用 TinyLogLog 表引擎的表上执行 INSERT SELECT 向自身写入时发生死锁。修复了 #6802。修复了 #18691。修复了 #16812。修复了 #14570#15260alexey-milovidov)。
  • 支持类似 MySQLSHOW CREATE VIEW name 语法。#18095 (Du Chuan)。
  • 允许所有 Decimal * Float 或反向形式的查询,包括聚合查询(例如 SELECT sum(decimal_field * 1.1)SELECT dec_col * float_col),结果类型为 Float32 或 Float64。#18145Mike)。
  • 改进精简版 Web UI:添加历史记录;添加分享功能;避免不同请求之间的竞态条件;添加请求进行中和就绪状态指示器;添加 favicon;在 textarea 未获得焦点时也能检测 Ctrl+Enter。 #17293 #17770 (alexey-milovidov).
  • clickhouse-server 没有向 ZooKeeper 服务器发送 close 请求。 #16837 (alesapin).
  • 避免在内存限制过低(max_memory_usage = 1 / max_untracked_memory = 1)的情况下导致服务器异常终止。#17453 (Azat Khuzhin)。
  • 修复在不同事件具有相同时间戳时 windowFunnel 函数结果的不确定性问题。#18884 (Fuwang Hu)。
  • Docker:在 clickhouse-server Docker 镜像中,将 clickhouse 用户和用户组的 uid/gid 显式设置为固定值 101。#19096 (filimonov)。
  • Distributed 表的异步 INSERT:新增了两个设置(类似于 MergeTree 系列):- fsync_after_insert - 对每次插入执行 fsync,这会降低插入性能。- fsync_directories - 在所有操作(写入、重命名等)完成后,对临时目录(仅用于异步 INSERT)执行 fsync。#18864Azat Khuzhin)。
  • SYSTEM KILL 命令现在可以在 Docker 中正常工作。已关闭 #18847#18848alexey-milovidov)。
  • 在执行 FETCH PARTITION 时展开 ZooKeeper 路径中的宏。#18839 (fastio)。
  • 对所有副本应用 ALTER TABLE <replicated_table> ON CLUSTER MODIFY SETTING ...,因为这类 ALTER 命令不会在副本之间复制。#18789 (Amos Bird)。
  • 允许列转换器 EXCEPT 接受字符串作为正则表达式匹配器。这解决了 #18685#18699Amos Bird)。
  • 修复 SummingMergeTree 中的 SimpleAggregateFunction。现在它的行为与 AggregateFunction 一致。在之前的版本中,值会被直接相加,而不考虑具体的聚合函数。本次修复对应 #18564#8052#18637Amos Bird)。再次修复在 SummingMergeTree 中使用 SimpleAggregateFunction 的相关问题。本次修复对应 #18676#18677Amos Bird)。
  • 修复了在函数 bar 的最后一个参数为 NaN 时,分配器内部触发的断言错误。现在会抛出一个普通的 ClickHouse 异常。修复了 #17876#18520Nikita Mikhaylov)。
  • 修复易用性问题:在某些工具中,异常消息后缺少换行符。 #18444 (alexey-milovidov).
  • 新增支持:可以在 LowCardinality(Type)Type 之间相互转换主键和分区键列的类型。同时新增支持:可以将主键列类型从 EnumX 转换为 IntX 类型。修复 #5604#18362alesapin)。
  • 实现对 untuple 的字段访问。 #18133#18309 (hexiaoting)。
  • 允许从 CSV 中解析 Array 字段,如果它是以字符串形式表示,并且该字符串中包含按嵌套 CSV 方式序列化的数组。例如:"[""Hello"", ""world"", ""42"""" TV""]" 将被解析为 ['Hello', 'world', '42" TV']。允许从 CSV 中以不带外层括号的字符串形式解析数组。例如:"'Hello', 'world', '42"" TV'" 将被解析为 ['Hello', 'world', '42" TV']#18271 (alexey-milovidov).
  • 改进 MergeTree wide parts 的自适应粒度计算。#18223 (alesapin).
  • 现在 clickhouse install 也可以在 Mac 上运行了。此前的问题是该平台上没有 procfs。#18201Nikita Mikhaylov)。
  • 改进了 SHOW ... 查询语法的提示。#18183 (Du Chuan).
  • 数组聚合函数 arrayMinarrayMaxarraySumarrayAvg 新增对 Int128Int256UInt256 的支持。#18147 (Maksim Kita)。
  • 在 Set 和 Join 存储设置中添加 disk#18112Grigory Pervakov)。
  • 访问控制:现在表函数 merge() 要求当前用户对其读取数据的每个表都具有 SELECT 权限。此 PR 修复了 #16964#18104 #17983Vitaly Baranov)。
  • 临时表在系统表 system.tablessystem.columns 中现在只在创建它们的会话中可见。内部数据库 _temporary_and_external_tables 现在在这些系统表中被隐藏;临时表则显示为数据库名为空且已设置 is_temporary 标志的表。#18014Vitaly Baranov)。
  • 修复在终端窗口大小发生变化时 clickhouse-client 的渲染问题。#18009 (Amos Bird)。
  • 当客户端断开连接时,将相关事件的日志级别从 Warning 降低为 Information。 #18005 (filimonov)。
  • 强制从文件系统中移除 DiskS3 的空或异常元数据文件。S3 为实验性功能。#17935Pavel Kovalenko)。
  • 访问控制:allow_introspection_functions=0 会禁止使用自省函数,但不再禁止为这些函数授予权限(被授权用户需要将 allow_introspection_functions 设置为 1 才能自己使用这些权限)。类似地,allow_ddl=0 会禁止使用 DDL 命令,但不再禁止为这些命令授予权限。#17908Vitaly Baranov)。
  • 可用性改进:列名提示。#17112#17857fastio)。
  • 当两个 Merge 表尝试相互读取对方的数据时,增加诊断信息。 #17854 (徐炘).
  • 支持在使用 ClickHouse Docker 镜像运行脚本时覆盖超时时间值。 #17818 (Guillaume Tassery).
  • 检查 system 日志表的引擎定义语法,以避免某些配置错误。需要注意的是,这种检查不涉及语义层面,这意味着诸如不存在的列或表达式函数之类的错误,只有在表真正创建时才会被发现。#17739 (Du Chuan)。
  • 在初始化 RabbitMQ 表时,如果没有连接,将不再抛出异常(会在后台自动重新连接)。 #17709 (Kseniia Sumarokova).
  • 在 Buffer 刷新时不要忽略服务器内存限制。#17646 (Azat Khuzhin).
  • 切换到来自 ClickHouse-Extras 的已打补丁 RocksDB 版本,以修复 use-after-free 错误。#17643Nikita Mikhaylov)。
  • 为并行解析的异常消息添加了偏移量。这修复了 #17457#17641Nikita Mikhaylov)。
  • 不要在 INSERT 查询执行过程中抛出“Too many parts”错误。#17566 (alexey-milovidov).
  • 允许在 ALTER 查询的 UPDATE 语句中使用查询参数。修复 #10976#17563alexey-milovidov)。
  • 查询混淆器:避免在标识符名称中使用某些 SQL 关键字。#17526 (alexey-milovidov)。
  • 通过服务器指标导出当前由 DDLWorker 执行的最大 DDL 条目,可用于检查 DDLWorker 是否在某处卡住。 #17464 (Amos Bird)。
  • 导出所有服务器上当前线程的异步指标。这对于排查类似此问题的故障非常有用。#17463Amos Bird)。
  • 当将 asterisk_include_materialized_columnsasterisk_include_alias_columns 设置为开启时,在通配符查询中包含诸如 MATERIALIZED / ALIAS 等动态列。#17462 (Ken Chen)。
  • 允许在 config.xml 中使用 <ttl> 属性为系统日志表配置 TTL,以删除旧条目。#17438Du Chuan)。
  • 现在,通过 MySQL 和 PostgreSQL 协议到达服务器的查询具有各自不同的接口类型(可在表 system.query_loginterface 列中查看):MySQL 为 4,PostgreSQL 为 5,不再使用之前统一的 1,而 1 现仅用于原生协议。#17437Vitaly 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#17253Amos Bird)。
  • 为发往 S3 存储的请求添加 HTTP 重定向次数限制(s3_max_redirects)。#17220ianton-ru)。
  • -OrNull 组合器与 -If-Merge-MergeState-State 组合器一起使用时,应将 -OrNull 放在最前面。#16935 (flynn)。
  • 支持配置 HTTP 代理和 HTTPS S3 端点。 #16861 (Pavel Kovalenko).
  • 为 S3 客户端添加了对通过环境变量、~/.awsAssumeRole 进行身份验证的正确支持。#16856Vladimir Chebotarev)。
  • 新增更多 OpenTelemetry span,并添加一个将 span 数据导出到 Zipkin 的示例。 #16535 (Alexander Kuzmenkov).
  • 缓存字典:在获取缓存字典时彻底消除回调和加锁。在查询过程中,键不再被划分为「未找到」和「已过期」,而是统一存储在同一个 map 中。#14958 (Nikita Mikhaylov)。
  • 修复实验性特性 fsync_part_directory/fsync_after_insert/in_memory_parts_insert_sync 一直未生效的问题。 #18845 (Azat Khuzhin).
  • 允许在 MaterializeMySQL 引擎的嵌套数据库中使用 Atomic 引擎。#14849 (tavplubix)。

缺陷修复

  • 修复在极少数情况下服务器可能会停止接受新连接的问题。 #17542 (Amos Bird, alexey-milovidov).
  • 修复在分析带有常量参数的二元函数索引时出现的问题,该问题会导致错误的查询结果。此修复解决了 #18364#18373Amos Bird)。
  • 修复在索引比较两端类型不一致时可能出现的错误索引分析。此修复解决了 #17122#17145Amos Bird)。
  • 在合并时禁用基于 AIO 的写入,因为这在极其罕见的情况下可能导致主键列数据损坏。#18481 (alesapin)。
  • 限制从宽格式 part 合并到紧凑格式 part。在垂直合并的情况下,这可能会生成损坏的结果 part。#18381 (Anton Popov).
  • 修复在发生读退避(日志中出现消息 <Debug> MergeTreeReadPool: Will lower number of threads)时,从 MergeTree* 读取可能导致查询结果不完整的问题。该问题是在 #16423 中引入的。本修复解决了 #18137#18216Nikolai Kochetov)。
  • 修复 rocksdb 库中的 use-after-free Bug。 #18862 (sundyli).
  • 修复以 ORC 格式从文件进行无限循环读取的问题(该问题是在 #10580 中引入的)。修复了 #19095#19134Nikolai Kochetov)。
  • 修复 MergeTree 数据写入器中的一个 bug,该 bug 可能导致标记大小超过固定粒度大小。修复了 #18913#19123alesapin)。
  • 修复了一个启动时的错误:ClickHouse 无法从 LowCardinality(Nullable(...)) 中读取压缩编解码器并抛出异常 Attempt to read after EOF。修复了 #18340#19101alesapin)。
  • 限制对使用旧语法创建的 MergeTree 表执行 MODIFY TTL 查询。此前这些查询会返回成功,但实际上不会产生任何效果。#19064Anton Popov)。
  • 确保 groupUniqArray 在处理 Enum 类型参数时返回正确的类型。此更改关闭了 #17875#19019alexey-milovidov)。
  • 修复在将 LowCardinality 类型的参数传递给 ignore 函数时,可能出现的 Expected single dictionary argument for function 错误。修复了 #14275#19016Nikolai Kochetov)。
  • 修复了在使用 TinyLog 引擎的表中插入 LowCardinality 列时的问题。修复了 #18629#19010Nikolai Kochetov)。
  • Join 会尝试将 const 列物化,但我们的代码希望它们出现在其他位置。#18982 (Nikita Mikhaylov).
  • 禁用 optimize_move_functions_out_of_any,因为此优化并不总是正确的。此更改关闭了 #18051。此更改关闭了 #18973#18981alexey-milovidov)。
  • 修复在合并查询计划中的 Expression 步骤时可能引发的异常 QueryPipeline stream: different number of columns。修复了 #18190#18980Nikolai Kochetov)。
  • 修复了在关闭过程中极少出现的死锁。#18977 (tavplubix)。
  • 修复了在执行 ALTER TABLE ... DROP PART 'part_name' 查询时错误地移除整个分区所有去重块的问题。修复了 #18874#18969alesapin)。
  • Attach partition 现在会重置 mutation。 #18804#18935 (fastio)。
  • 修复 bitmapOrCardinality 中可能导致空指针解引用的问题,从而关闭了 #18911#18912sundyli)。
  • 修复 clickhouse-local 在关闭期间可能发生的卡死问题。此更改修复了 #18891#18893alexey-milovidov)。
  • 对于外部数据库(MySQL、ODBC、JDBC)的查询,如果存在 x IN table 形式的表达式,会被错误重写。该修复修正了 #9756#18876alexey-milovidov)。
  • 修复 *If 组合器在一元函数和 Nullable 类型下的行为问题。#18806 (Azat Khuzhin).
  • 修复这样一个问题:当全局将 network_compression_method 设置为非默认值时,异步分布式 INSERT 可能会被服务器拒绝。这修复了问题 #18741#18776alexey-milovidov)。
  • 修复了在尝试将 NULLNullable(String) CASTNullable(Decimal(P, S)) 时出现的 Attempt to read after eof 错误。现在当函数 CAST 无法从可空字符串解析出 Decimal 值时,会返回 NULL。修复了 #7690#18718Winter Zhang)。
  • 修复了一个较小的日志问题。#18717 (sundyli).
  • 修复使用旧语法创建的 ReplicatedMergeTree 表中删除空数据部分的行为。修复了 #18582#18614Anton Popov)。
  • 修复此前在不同情况下发生的日期溢出 Bug。严格将 Date 的取值上限限制为 "2106-02-07",并将大于 "2106-02-07" 的日期转换为值 0。#18565 (hexiaoting)。
  • 为从 MySQL 复制添加对 FixedString 数据类型的支持。从 MySQL 复制是一个实验性功能。该补丁修复了 #18450,同时也修复了 #6556#18553awesomeleo)。
  • 修复在对包含 RIGHTFULL 连接的子查询结果使用 ORDER BY 时可能出现的 Pipeline stuck 错误。#18550 (Nikolai Kochetov)。
  • 修复一个缺陷:在终止对应的 mutation 后,可能会导致 ALTER 查询挂起。由线程模糊测试工具发现。#18518 (alesapin)。
  • parseDateTimeBestEffort 函数中对 12AM(凌晨 12 点)提供了正确的解析支持。修复了 #18402#18449vladimir-golovchenko)。
  • 修复了在对类型为 Nullable(String) 的参数调用 toType(...) 函数(如 toDatetoUInt32 等)时出现的 value is too short 错误。现在此类函数在解析出错时会返回 NULL,而不再抛出异常。修复了 #7673#18445tavplubix)。
  • 修复 SHOW TABLES 的意外行为。#18431 (fastio)。
  • 修复 -SimpleState 组合器生成的参数和返回类型不兼容的问题。 #18404 (Amos Bird).
  • 修复在并发使用 SetJoin 表以及从 system.tables 中进行查询时可能出现的竞态条件。#18385 (alexey-milovidov)。
  • 修复 system.settings_profile_elements 表的填充。此 PR 解决了 #18231#18379Vitaly Baranov)。
  • 修复在使用两级聚合时,带有 Distinct 组合器的聚合函数中可能发生的崩溃。修复了 #17682#18365Anton Popov)。
  • 修复了在具有 IPv4/IPv6 双栈的机器上,服务器无法访问 clickhouse-odbc-bridge 进程的问题;修复了使用格式错误的查询执行 ODBC 字典更新时和/或导致 odbc-bridge 进程崩溃的问题;可能关闭了 #14489#18278Denis Glazachev)。
  • 访问控制:如果用户至少拥有对表中任意一列的访问权限,现在即可执行 SELECT count() FROM table。此 PR 修复了 #10639#18233Vitaly Baranov)。
  • 访问控制:现在 SELECT JOIN 需要对每个被 JOIN 的表都拥有 SELECT 权限。此 PR 修复了 #17654#18232Vitaly Baranov)。
  • 修复 Enum 与 Int 类型之间的键值比较问题。该修复解决了 #17989#18214Amos Bird)。
  • 从 MySQL 进行复制(实验性功能)。修复 #18186,修复 #16372,修复 MaterializeMySQL 数据库引擎中唯一键转换问题。#18211 (Winter Zhang)。
  • 修复同时使用 WITH FILLWITH TIES 的查询存在的不一致性问题 #17466#18188 (hexiaoting)。
  • 修复在最后一列解析出错时仍插入带默认值行的问题。修复了 #17712#18182Jianmei Zhang)。
  • 修复在尝试设置 settings profile 时出现 Unknown setting profile 错误的问题。#18167tavplubix)。
  • 修复执行 MODIFY COLUMN ... REMOVE TTL 查询时未真正删除列 TTL 的错误。#18130alesapin)。
  • 修复了解析 S3 URL 时出现的 std::out_of_range: basic_string 错误。#18059 (Vladimir Chebotarev)。
  • 修正 DateTime64Date 的比较行为。修复了 #13804#11222 问题。... #18050Vasily Nemkov)。
  • 从 MySQL 进行复制(实验性功能):修复 #15187,修复 #17912,并支持在 MaterializeMySQL 中转换 MySQL 前缀索引。#17944 (Winter Zhang)。
  • 当使用 logger.size 参数并将其设置为大于 2^32 的数值来配置服务器日志轮转时,日志不会被正确轮转。此问题已修复。#17905 (Alexander Kuzmenkov).
  • 当查询包含 ARRAY JOIN 时(因此该查询实际上并非“简单”查询),针对简单查询的优化会产生错误结果。 #17887 (sundyli).
  • 修复 topK 聚合函数中可能导致段错误的问题,从而关闭了 #17404#17845Maksim Kita)。
  • WAL(实验性功能):如果禁用了 in_memory_parts_enable_wal,则不要从 WAL 恢复数据片段。#17802 (detailyang)。
  • 关于最大可删除表大小的异常消息显示不正确。 #17764 (alexey-milovidov).
  • 修复了在向 Distributed 表插入数据时,由于空间不足可能导致的段错误。 #17737 (tavplubix).
  • 修复了 ClickHouse 无法重新建立与 MySQL 服务器连接的问题。#17681 (Alexander Kazakov).
  • Windows:修复了在 Windows Subsystem for Linux 上运行的 ClickHouse 中,在 Atomic 数据库执行 RENAME 查询时出现的 Function not implemented 错误。修复了 #17661#17664tavplubix)。
  • 在执行 ON CLUSTER 查询且 pool_size > 1 时,可能由于竞态条件而错误地判断集群是否为环形(交叉)复制集群。该问题已修复。#17640 (tavplubix)。
  • 修复在服务器以守护进程模式运行时 system.stack_trace 表为空的问题。#17630 (Amos Bird)。
  • 对于 MergeTree 表,现在可以在后台记录异常 fmt::v7::format_error。修复了 #17613#17615alexey-milovidov)。
  • 在交互式模式下使用 clickhouse-client 执行多行查询时,单行注释会被错误地扩展到整个查询的末尾。此更改修复了 #13654#17565alexey-milovidov)。
  • 修复了当对应的 mutation 在其他副本上被终止时导致 ALTER 查询挂起的问题。修复了 #16953#17499alesapin)。
  • 修复在 ClickHouse 低估 mark 缓存大小时的内存统计问题。当存在大量包含 mark 的小文件时,可能会出现该问题。#17496 (alesapin)。
  • 修复在启用设置 optimize_redundant_functions_in_order_by 时对 ORDER BY 的处理。#17471 (Anton Popov).
  • 修复由于错误优化导致在使用 DISTINCT 后仍可能出现的重复行。修复了 #17294#17296li chengxiang)。#17439Nikolai Kochetov)。
  • 修复了 MergeTree 表 后台任务中高 CPU 占用的问题。#17416 (tavplubix)。
  • 修复了在从包含 LowCardinality 类型的 JOIN 表读取数据时可能发生的崩溃。修复了 #17228#17397Nikolai Kochetov)。
  • 从 MySQL 进行复制(实验性特性):修复了 #16835,尝试解决与 MySQL SHOW 语句之间表头不匹配的问题。#17366Winter Zhang)。
  • 通过谓词优化器修复非确定性函数相关问题。这修复了 #17244#17273Winter Zhang)。
  • 修复在使用 LIMIT 的 Distributed 查询中可能出现的 Unexpected packet Data received from client 错误。 #17254 (Azat Khuzhin).
  • 修复了当子查询中存在常量列时 set 索引失效的问题。修复了 #17246#17249Amos Bird)。
  • clickhouse-copier:针对非分区表的修复 #15235#17248 (Qi Chen)。
  • 修复了存储在 S3 磁盘上的数据分片可能无法正常工作的变更操作(实验性功能)。 #17227 (Pavel Kovalenko).
  • 修复了函数 fuzzBits 中的一个缺陷,相关问题:#16980#17051hexiaoting)。
  • 修复仅带 OFFSET 子句的查询中 optimize_distributed_group_by_sharding_key 的问题。#16996 (Azat Khuzhin).
  • 修复在 Merge 表上对 Distributed 表执行 JOIN 时的查询问题。#16993Azat Khuzhin)。
  • 修复涉及单调函数的 ORDER BY 优化。修复 #16107#16956Anton Popov)。
  • 修复在比较具有不同 scale 的 DateTime64 类型时的错误。修复 #16655 ... #16952Vasily Nemkov)。
  • 修复在启用设置 optimize_aggregators_of_group_by_keys 时,GROUP BYJOIN 相关的优化问题。修复了 #12604#16951Anton Popov)。
  • SHOW ACCESS 查询进行了一个小修正。 #16866 (tavplubix).
  • 修复在启用 optimize_trivial_count_query 设置并使用分区谓词时的执行行为。#16767Azat Khuzhin)。
  • 通过 MySQL 线协议返回 INSERT 查询所影响的行数。之前 ClickHouse 始终返回 0,现已修复此问题。修复了 #16605#16715Winter Zhang)。
  • 修复了 select_sequential_consistency 在优化后的简单计数查询和 system 表中导致的不一致行为。#16309 (Hao Chen)。
  • REPLACE 列转换器在不存在的列上操作时抛出错误。#16183 (hexiaoting).
  • 若 RIGH|FULL JOIN 的 ON 表达式不是等值连接(equi-join),则抛出异常。 #15162 (Artem Zuikov).

构建/测试/打包方面的改进

  • 为 ClickHouse 二进制文件添加了简单的完整性检查。它有助于检测由故障硬件导致的数据损坏(例如存储介质上的位衰减或内存中的位翻转)。#18811 (alexey-milovidov)。
  • OpenSSL 替换为 BoringSSL,从而避免与 sanitizers 相关的问题。修复了 #12490。修复了 #17502。修复了 #12952#18129alexey-milovidov)。
  • 简化 Sys/V init 脚本。该脚本在 Ubuntu 12.04 及更早版本中无法正常工作。#17428 (alexey-milovidov).
  • ./clickhouse install 脚本进行了多项改进。#17421 (alexey-milovidov)。
  • 现在 ClickHouse 可以充当一个假的 ZooKeeper。当前的存储实现只是一个内存哈希表,服务器仅部分支持 ZooKeeper 协议。#16877 (alesapin)。
  • 修复 TestKeeperStorage(ZooKeeper 的 mock)中对失效列表 watch 删除的处理。 #18065 (alesapin).
  • 添加用于故障注入的 SYSTEM SUSPEND 命令,可用于方便地执行故障转移测试。此更改关闭了 #15979#18850 (alexey-milovidov)。
  • 在使用 lld 链接 ClickHouse 时生成构建 ID。发现在我的机器上,lld 默认不会生成它。构建 ID 用于崩溃报告和内部分析。 #18808 (alexey-milovidov)。
  • 修复代码风格检查中的 shellcheck 错误。 #18566 (Ilya Yatsishin).
  • 将时区信息更新为 2020e 版本。 #18531 (alesapin)。
  • 修复 codespell 警告。将代码风格检查拆分为独立部分。更新代码风格检查的 Docker 镜像。#18463 (Ilya Yatsishin).
  • 在文档中新增对冲突标记遗留情况的自动检查。#18332alexey-milovidov)。
  • 为无状态测试启用 Thread Fuzzer 以检查其不稳定性。#18299 (alesapin).
  • 不要使用非线程安全的函数 strerror#18204 (alexey-milovidov).
  • 更新 anchore/scan-action@main 工作流操作(其分支已从 master 迁移到 main)。#18192 (Stig Bakken)。
  • 现在 clickhouse-test 在执行数据库 DROP/CREATE 操作时带有超时控制。#18098 (alesapin)。
  • 为无状态测试启用对 Pytest 框架的实验性支持。#17902 (Ivan)。
  • 现在我们在集成测试中使用最新版本的 Docker daemon。#17671alesapin)。
  • 在启用 Sentry 时,将官方构建信息以及内存、CPU 和可用磁盘空间等信息发送到 Sentry。Sentry 是一项需主动启用的功能,用于帮助 ClickHouse 开发者。该改动关闭了 #17279#17543 (alexey-milovidov)。
  • clickhouse-copier 代码中存在一个未初始化的变量。#17363 (Nikita Mikhaylov)。
  • 修复了 #17309 中的 一份 MSan 报告#17344Nikita Mikhaylov)。
  • 修复 Arrow Flight 库中 IPv6 相关问题。有关详细信息,请参阅该评论#16664Zhanna)。
  • 添加一个库,将部分 libc 函数替换成会终止进程的 trap 指令。#16366 (alexey-milovidov)。
  • 在发生栈溢出时在服务器日志中提供诊断信息,并向 clickhouse-client 返回错误消息。修复了 #14840#16346alexey-milovidov)。
  • 现在我们几乎可以并行运行所有无状态功能测试。#15236 (alesapin)。
  • 修复 librdkafka 中 snappy 解压缩的数据损坏问题(只影响使用 gcc 10 构建的版本,但官方构建已改用 clang,因此至少近期的官方发行版不受影响)。 #18053 (Azat Khuzhin).
  • 如果服务器被 OOM Killer 终止,则在日志中记录一条消息。 #13516 (alexey-milovidov)。
  • PODArray:避免在参数为 (nullptr, 0) 时调用 memcpy(修复 UBSan 报告中的问题)。修复了 #18525#18526alexey-milovidov)。
  • 对 DDLWorker 内部的 ZooKeeper 路径拼接进行了小幅改进。#17767 (Bharat Nallan)。
  • 支持从调试文件重新加载符号。此 PR 还修复了一个 build-id 问题。#17637 (Amos Bird)。

2020 年变更日志