2023 更新日志
目录
ClickHouse release v23.12, 2023-12-28
ClickHouse release v23.11, 2023-12-06
ClickHouse release v23.10, 2023-11-02
ClickHouse release v23.9, 2023-09-28
ClickHouse release v23.8 LTS, 2023-08-31
ClickHouse release v23.7, 2023-07-27
ClickHouse release v23.6, 2023-06-30
ClickHouse release v23.5, 2023-06-08
ClickHouse release v23.4, 2023-04-26
ClickHouse release v23.3 LTS, 2023-03-30
ClickHouse release v23.2, 2023-02-23
ClickHouse release v23.1, 2023-01-25
2022 年更新日志
ClickHouse release 23.12, 2023-12-28
向后不兼容的变更
- 修复了在 TTL 表达式中对非确定性函数的检查。此前,在某些情况下你可以在 TTL 表达式中使用非确定性函数,这可能会在后续导致未定义行为。此修复解决了 #37250。默认情况下,不再允许与表中任何列都无关的 TTL 表达式。可以通过
SET allow_suspicious_ttl_expressions = 1或SET compatibility = '23.11'重新启用这类表达式。关闭了 #37286。#51858(Alexey Milovidov)。 - MergeTree 设置项
clean_deleted_rows已被弃用,不再产生任何效果。OPTIMIZE的CLEANUP关键字在默认情况下不被允许(可以通过allow_experimental_replacing_merge_with_cleanup设置解除限制)。#58267(Alexander Tokmakov)。此变更修复了 #57930。关闭了 #54988。关闭了 #54570。关闭了 #50346。关闭了 #47579。该功能必须被移除,因为它并不理想。我们必须尽快将其移除,因为别无他法。#57932(Alexey Milovidov)。
新功能
- 实现可刷新物化视图功能,该功能最初在 #33919 中提出需求。#56946(Michael Kolupaev、Michael Guzov)。
- 引入
PASTE JOIN,允许用户通过行号对表进行连接,而无需使用ON子句。示例:SELECT * FROM (SELECT number AS a FROM numbers(2)) AS t1 PASTE JOIN (SELECT number AS a FROM numbers(2) ORDER BY a DESC) AS t2。#57995(Yarik Briukhovetskyi)。 ORDER BY子句现在支持使用ALL,这意味着 ClickHouse 会按照SELECT子句中的所有列进行排序。示例:SELECT col1, col2 FROM tab WHERE [...] ORDER BY ALL。 #57875 (zhongyuankai).- 添加了一个新的变更(mutation)命令
ALTER TABLE <table> APPLY DELETED MASK,用于强制应用由轻量级删除(lightweight delete)写入的掩码,并将标记为已删除的行从磁盘中物理删除。#57433(Anton Popov)。 - 处理程序
/binary会打开一个可视化的符号查看器,用于浏览 ClickHouse 二进制文件中的符号。 #58211 (Alexey Milovidov). - 新增了一个 SQL 函数
sqid,用于生成 Sqids(https://sqids.org/),示例:SELECT sqid(125, 126)。#57512(Robert Schulze)。 - 新增函数
seriesPeriodDetectFFT,用 FFT 检测序列周期。#57574(Bhavna Jindal)。 - 添加一个 HTTP 端点,用于检查 Keeper 是否已就绪以接受流量。#55876 (Konstantin Bogdanov)。
- 为 schema 推断新增 'union' 模式。在此模式下,生成的表 schema 是所有文件 schema 的并集(即从每个文件单独推断 schema)。schema 推断模式由设置
schema_inference_mode控制,可选值为default和union。解决了 #55428。#55892(Kruglov Pavel)。 - 新增设置项
input_format_csv_try_infer_numbers_from_strings,允许在 CSV 格式下从字符串中推断数字。关闭 #56455。#56859(Kruglov Pavel)。 - 当数据库或表的数量超过可配置的阈值时,向用户显示警告。#57375 (凌涛)。
- 采用
HASHED_ARRAY(以及COMPLEX_KEY_HASHED_ARRAY)布局的字典现在也支持SHARDS,其行为与HASHED类似。#57544 (vdimir)。 - 为主键总字节数以及内存中已分配的主键总字节数添加异步指标。 #57551 (Bharat Nallan).
- 新增
SHA512_256函数。 #57645 (Bharat Nallan). - 添加
FORMAT_BYTES作为formatReadableSize的别名。#57592(Bharat Nallan)。 - 允许向
s3表函数传递可选会话令牌。#57850(Shani Elharrar)。 - 新增设置项
http_make_head_request。如果关闭该设置,URL 表引擎将不会执行 HEAD 请求来确定文件大小。这样可以支持低效、配置错误或不具备该能力的 HTTP 服务器。#54602 (Fionera)。 - 现在可以在索引(非主键)定义中引用 ALIAS 列(问题 #55650)。示例:
CREATE TABLE tab(col UInt32, col_alias ALIAS col + 1, INDEX idx (col_alias) TYPE minmax) ENGINE = MergeTree ORDER BY col;。#57546(Robert Schulze)。 - 新增了一个名为
readonly的设置,可用于将 S3 磁盘指定为只读。在仅对底层 S3 bucket 拥有只读访问权限的情况下,在s3_plain类型的磁盘上创建表会非常有用。#57977(Pengyuan Bian)。 - 现在,MergeTree 表中的主键分析也将应用于包含虚拟列
_part_offset(可选地包含_part)的谓词。此功能可以用作一种特殊形式的二级索引。 #58224 (Amos Bird)。
性能优化
- 在对 MergeTree 表执行 FINAL 处理时提取互不相交的数据分片区间,从而避免对这些互不相交的分片区间执行额外的 FINAL 逻辑。如果具有相同主键的重复值数量较少,性能将与不使用 FINAL 时几乎相同。在启用
do_not_merge_across_partitions_select_final设置时,提高带 FINAL 的 MergeTree 查询的读取性能。#58120(Maksim Kita)。 - 在 S3 磁盘之间复制时,改为使用 S3 服务器端拷贝,而不是通过缓冲区进行复制。这提升了
BACKUP/RESTORE操作以及clickhouse-disks copy命令的性能。#56744 (MikhailBurdukov)。 - Hash JOIN 遵循
max_joined_block_size_rows设置,并且不会为ALL JOIN生成大型数据块。 #56996 (vdimir)。 - 更早释放用于聚合的内存,从而避免不必要的外部聚合。#57691 (Nikolai Kochetov)。
- 提升字符串序列化性能。 #57717 (Maksim Kita)。
- 为
Merge引擎表增加 trivial count 优化支持。#57867 (skyoct)。 - 在部分场景下优化了聚合。#57872 (Anton Popov)。
hasAny函数现已可以利用全文本跳过索引。#57878(Jpnock)。- 函数
if(cond, then, else)(及其别名cond ? then : else)已优化为使用无分支计算。#57885 (zhanglistar)。 - 如果分区键表达式仅包含主键表达式中的列,MergeTree 会自动推断是否启用
do_not_merge_across_partitions_select_final设置。#58218(Maksim Kita)。 - 加速原生数据类型的
MIN和MAX。 #58231 (Raúl Marín). - 为文件系统缓存实现
SLRU缓存策略。#57076 (Kseniia Sumarokova)。 - 用于后台抓取的每个端点的连接数上限从
15提高为由background_fetches_pool_size设置决定的值。- MergeTree 级别设置replicated_max_parallel_fetches_for_host已被废弃 - MergeTree 级别设置replicated_fetches_http_connection_timeout、replicated_fetches_http_send_timeout和replicated_fetches_http_receive_timeout已移动到 Server 级别。- 设置keep_alive_timeout已添加到 Server 级别设置列表中。#57523 (Nikita Mikhaylov)。 - 降低查询
system.filesystem_cache时的内存开销。#57687 (Kseniia Sumarokova). - 减少字符串反序列化时的内存占用。 #57787 (Maksim Kita)。
- 更高效的 Enum 构造函数——在 Enum 具有大量枚举值时优势明显。#57887 (Duc Canh Le)。
- 针对从文件系统缓存读取的操作进行了改进:改为始终使用
pread方法。#57970(Nikita Taranov)。 - 在逻辑表达式优化器中为 AND notEquals 链添加优化。此优化仅在启用了实验性 Analyzer 时可用。 #58214 (Kevin Mingtarja)。
改进
- Keeper 现支持软内存上限。当内存使用接近最大值时,会拒绝请求。#57271 (Han Fei). #57699 (Han Fei).
- 使对分布式表的插入操作能够正确处理更新后的集群配置。当集群节点列表被动态更新时,分布式表的 Directory Monitor 将会相应更新该列表。#42826 (zhongyuankai)。
- 禁止在合并参数不一致的情况下创建复制表。 #56833 (Duc Canh Le).
- 在
system.tables中显示未压缩的数据大小。 #56618. #57186 (Chen Lixiang). - 将
skip_unavailable_shards添加为Distributed表的设置,与对应的查询级别设置类似。修复 #43666。#57218(Gagan Goel)。 - 函数
substring(别名:substr、mid)现在可以用于Enum类型的值。此前,第一个函数参数必须是String或FixedString类型的值。此更改提高了通过 MySQL 接口使用 Tableau 等第三方工具时的兼容性。#57277(Serge Klochkov)。 - 函数
format现在支持任意参数类型(而不仅仅是String和FixedString参数)。这对于能够执行SELECT format('The {0} to all questions is {1}', 'answer', 42)这样的查询很重要。 #57549 (Robert Schulze). - 现在
date_trunc函数的第一个参数支持不区分大小写。当前同时支持以下两种写法:SELECT date_trunc('day', now())和SELECT date_trunc('DAY', now())。#57624(Yarik Briukhovetskyi)。 - 当表不存在时提供更友好的错误提示。#57342 (Bharat Nallan).
- 允许在查询执行时重写服务器设置
max_partition_size_to_drop和max_table_size_to_drop。#57452(Jordi Villar)。 - 略微改进了 JSON 格式中未命名元组的推断。#57751(Kruglov Pavel)。
- 在连接到 Keeper 时添加对只读标志的支持(修复了 #53749)。#57479(Mikhail Koviazin)。
- 修复在从磁盘恢复批次数据时,可能因 “No such file or directory” 而导致的分布式发送卡住问题。修复在
distributed_directory_monitor_max_sleep_time_ms> 5 分钟时,system.distribution_queue中error_count可能出现的问题。引入用于跟踪异步 INSERT 失败的 profile event(概要事件)——DistributedAsyncInsertionFailures。#57480 (Azat Khuzhin)。 - 在
MaterializedPostgreSQL(实验性特性)中支持 PostgreSQL 生成列和列的默认值。修复 #40449。#57568(Kseniia Sumarokova)。 - 允许在不重启服务器的情况下应用部分文件系统缓存配置的更改。#57578 (Kseniia Sumarokova).
- 正确处理包含空数组的 PostgreSQL 表的结构。#57618 (Mike Kot).
- 将自上次服务器重启以来发生的错误总数作为
ClickHouseErrorMetric_ALL指标对外暴露。 #57627 (Nikita Mikhaylov). - 允许在配置文件中使用带有
from_env/from_zk引用,并且元素非空且设置了 replace=1 的节点。#57628 (Azat Khuzhin). - 一个表函数
fuzzJSON,用于为模糊测试生成大量格式错误的 JSON。#57646(Julia Kartseva)。 - 允许将 IPv6 转换为 UInt128,并进行二进制算术运算。#57707 (Yakov Olkhovskiy).
- 为
async inserts deduplication cache添加一个设置项,用于控制在缓存更新前等待的时间。弃用设置项async_block_ids_cache_min_update_interval_ms。现在仅在发生冲突时才会更新缓存。#57743 (alesapin)。 - 现在可以使用
KILL QUERY取消sleep()函数。 #57746 (Vitaly Baranov). - 禁止在实验性的
Replicated数据库中对Replicated表引擎执行CREATE TABLE ... AS SELECT查询,因为不支持该操作。参考 #35408。#57796(Nikolay Degterinsky)。 - 修复并改进对外部数据库查询的转换逻辑,以递归方式获取所有兼容的谓词。#57888 (flynn)。
- 支持动态调整文件系统缓存大小。修复 #57866。 #57897 (Kseniia Sumarokova).
- 正确支持在 SIGRTMIN 被阻塞的线程上使用
system.stack_trace(这类线程可能存在于像 Apache rdkafka 这样的低质量外部库中)。#57907(Azat Khuzhin)。并且仅在信号未被阻塞时才向线程发送信号,以避免在毫无意义的情况下等待storage_system_stack_trace_pipe_read_timeout_ms。#58136(Azat Khuzhin)。 - 在 quorum 插入检查时容忍 Keeper 故障。#57986 (Raúl Marín).
- 将最大/峰值 RSS(
MemoryResidentMax)添加到 system.asynchronous_metrics 表中。#58095 (Azat Khuzhin)。 - 此 PR 允许用户在未显式指定非默认区域的情况下使用 S3 风格链接(
https://和s3://)。此外,如果用户指定了错误的区域,也能自动找到正确的区域。#58148(Yarik Briukhovetskyi)。 clickhouse-format --obfuscate将识别到 Settings、MergeTreeSettings 和时区,并保持它们的名称不作更改。 #58179 (Alexey Milovidov)。- 在
ZipArchiveWriter中添加了显式的finalize()函数,并简化了其中过于复杂的代码。修复了 #58074。#58202(Vitaly Baranov)。 - 让具有相同路径的缓存使用同一个缓存对象。这个行为之前就存在,但在 23.4 中被破坏。如果此类具有相同路径的缓存设置了不同的缓存参数,将抛出异常,指出这是不被允许的。#58264(Kseniia Sumarokova)。
- 并行副本(实验功能):更友好的配置选项 #57542 (Igor Nikonov)。
- 并行副本(实验性功能):改进公告响应处理逻辑 #57749(Igor Nikonov)。
- 并行副本(实验性功能):在
ParallelReplicasReadingCoordinator中更严格地遵从min_number_of_marks#57763 (Nikita Taranov)。 - 并行副本(实验性功能):在 IN(子查询)中禁用并行副本 #58133 (Igor Nikonov)。
- Parallel replicas(实验性功能):添加 profile 事件 'ParallelReplicasUsedCount' #58173 (Igor Nikonov)。
- 非 POST 请求(例如 HEAD)将为只读,行为与 GET 类似。 #58060 (San)。
- 在
system.part_log中新增bytes_uncompressed列 #58167 (Jordi Villar)。 - 将基础备份名称添加到
system.backups和system.backup_log表中 #58178 (Pradeep Chhetri)。 - 在 clickhouse-local 中新增通过命令行指定查询参数的支持 #58210 (Pradeep Chhetri)。
构建/测试/打包改进
- 随机化更多设置 #39663 (Anton Popov).
- 在 CI 中随机化被禁用的优化 #57315 (Raúl Marín).
- 允许在 macOS 上使用与 Azure 相关的表引擎/函数。#51866 (Alexey Milovidov).
- ClickHouse Fast Test 现在使用 Musl 而不是 GLibc。#57711 (Alexey Milovidov). 完全静态链接的 Musl 构建可从 CI 下载。
- 为每个提交运行 ClickBench,从而解决 #57708。#57712 (Alexey Milovidov).
- 从外部库中移除对有害的 C/POSIX
select函数的使用。#57467 (Igor Nikonov). - 为方便使用,仅在 ClickHouse Cloud 中可用的设置也会出现在开源版 ClickHouse 构建中。#57638 (Nikita Mikhaylov).
错误修复(官方稳定版本中用户可见的异常行为)
- 修复了在 TTL GROUP BY 中可能导致排序顺序被打乱的问题 #49103(Nikita Mikhaylov)。
- 修复:调整
lttbbucket 策略,使首个 bucket 和最后一个 bucket 仅包含一个数据点 #57003 (FFish)。 - 修复在出错后执行同步时,
Template格式中可能出现的死锁问题 #57004(Kruglov Pavel)。 - 修复解析文件时在跳过大量错误情况下过早停止的问题 #57006 (Kruglov Pavel).
- 防止通过
dictionary表函数绕过字典的 ACL #57362 (Salvatore Mesoraca). - 修复了由 Fuzzer 发现的另一处 “non-ready set” 错误。#57423 (Nikolai Kochetov)。
- 修复了与 PostgreSQL
array_ndims使用相关的多个问题。#57436 (Ryan Jacobs)。 - 修复写锁超时后导致的读写锁(RWLock)不一致问题 #57454 (Vitaly Baranov)。再次修复写锁超时后导致的读写锁(RWLock)不一致问题 #57733 (Vitaly Baranov)。
- 修复:在构建并推送到视图链时,不要排除临时列 #57461(Yakov Olkhovskiy)。
- MaterializedPostgreSQL(实验性):修复 issue #41922,为 issue #41923 添加测试 #57515(Kseniia Sumarokova)。
- 在用于管理复制访问实体的 grant/revoke 查询中忽略
ON CLUSTER子句。#57538 (MikhailBurdukov)。 - 修复 clickhouse-local 中的崩溃 #57553 (Nikolay Degterinsky)。
- 修复 Hash JOIN 问题。#57564 (vdimir)。
- 修复 PostgreSQL 源中的潜在错误 #57567(Kseniia Sumarokova)。
- 修复 Hash JOIN 在嵌套 LowCardinality 情况下的类型更正。 #57614 (vdimir).
- 通过正确禁止对
system.stack_trace的并行读取,防止其发生挂起。 #57641 (Azat Khuzhin). - 修复在对稀疏列使用
any(...) RESPECT NULL进行聚合时出现的错误 #57710 (Azat Khuzhin)。 - 修复了一元运算符的解析 #57713 (Nikolay Degterinsky).
- 修复实验性表引擎
MaterializedPostgreSQL的依赖加载问题。#57754 (Kseniia Sumarokova). - 修复 BACKUP/RESTORE ON CLUSTER 对已断开节点的重试机制 #57764 (Vitaly Baranov).
- 修复在部分物化投影情况下的外部聚合结果 #57790(Anton Popov)。
- 修复聚合函数中带有
*Map组合子的合并问题 #57795 (Anton Popov). - 禁用
system.kafka_consumers,因为存在一个缺陷。 #57822 (Azat Khuzhin). - 修复在 Merge JOIN 中对 LowCardinality 键的支持。#57827 (vdimir)。
- 修复了与示例块中
InterpreterCreateQuery相关的问题。#57855 (Maksim Kita). - 在来自 PostgreSQL 的命名集合中,
addresses_expr被忽略。#57874(joelynch)。 - 修复 BLAKE3(Rust)中的无效内存访问 #57876(Raúl Marín)。随后为提升内存安全性,将其从 Rust 重写为 C++。#57994(Raúl Marín)。
- 在
CREATE INDEX中规范化函数名 #57906(Alexander Tokmakov)。 - 在首次请求发生前修复对不可用副本的处理 #57933 (Nikita Taranov)。
- 修复对字面量别名的错误分类 #57988 (Chen768959).
- 修复 Keeper 上预处理无效的问题 #58069(Antonio Andelic)。
- 修复
Poco库中与UTF32Encoding相关的整数溢出问题 #58073 (Andrey Fedotov)。 - 在包含大整数值的标量子查询的情况下修复并行副本功能(实验性特性)#58118(Alexey Milovidov)。
- 修复
accurateCastOrNull在处理超出范围的DateTime时的问题 #58139(Andrey Zvonov)。 - 修复在 MergeTree 的宽部件(wide part)中读取子列时可能出现的
PARAMETER_OUT_OF_BOUND错误 #58175(Kruglov Pavel)。 - 修复在包含大量子查询时执行
CREATE VIEW出现的性能下降问题 #58220 (Tao Wang)。 - 修复 JSONCompactEachRow 的并行解析问题 #58181 (Alexey Milovidov). #58250 (Kruglov Pavel).
ClickHouse 版本 23.11,2023-12-06
向后不兼容变更
- 默认的 ClickHouse 服务器配置文件已为
default用户启用access_management(通过 SQL 查询进行用户操作)和named_collection_control(通过 SQL 查询操作命名集合)。已关闭 #56482。#56619(Alexey Milovidov)。 - 对窗口函数的
RESPECT NULLS/IGNORE NULLS做了多项改进。如果你将它们用作聚合函数,并且存储了带有这些修饰符的聚合函数状态,它们可能会变得不兼容。#57189(Raúl Marín)。 - 移除优化项
optimize_move_functions_out_of_any。#57190(Raúl Marín)。 - 函数
parseDateTime中的格式化符%l/%k/%c现在能够解析没有前导零的小时/月份,例如select parseDateTime('2023-11-26 8:14', '%F %k:%i')现在可以正常工作。将parsedatetime_parse_without_leading_zeros设为0即可恢复之前需要两位数字的行为。函数formatDateTime现在也能够输出没有前导零的小时/月份。该行为由设置formatdatetime_format_without_leading_zeros控制,但默认关闭,以避免破坏现有用例。#55872(Azat Khuzhin)。 - 不再允许对
Decimal类型的参数使用聚合函数avgWeighted。变通方法:将参数转换为Float64。已关闭 #43928、#31768 和 #56435。如果你在物化视图或带有Decimal参数的投影中使用过此函数,请联系 [email protected]。修复了聚合函数sumMap中的错误,并导致其速度变慢约 1.5 到 2 倍。影响不大,因为这个函数本身就几乎没什么用。已关闭 #54955、#53134 和 #55148。修复了函数groupArraySample的一个缺陷——在一个查询中生成多个聚合状态时,它使用了相同的随机种子。#56350(Alexey Milovidov)。
新功能
- 新增服务器设置
async_load_databases,用于异步加载数据库和数据表,以加快服务器启动速度。适用于使用Ordinary、Atomic和Replicated引擎的数据库,这些数据库中的表会异步加载元数据。对某个表的查询会提升对应加载任务的优先级,并等待其完成。新增system.asynchronous_loader系统表用于自省。 #49351 (Sergei Trifonov). - 添加系统表
blob_storage_log。可用于审计写入到 S3 和其他对象存储的所有数据。 #52918 (vdimir)。 - 使用统计信息对
PREWHERE条件进行更合理的排序。#53240 (Han Fei)。 - 在 Keeper 协议中新增了对压缩的支持。可以在 ClickHouse 端通过在
zookeeper配置段中使用use_compression标志来启用。请注意,只有 ClickHouse Keeper 支持压缩,而 Apache ZooKeeper 不支持。解决了 #49507。#54957(SmitaRKulkarni)。 - 引入特性
storage_metadata_write_full_object_key。如果将其设置为true,则元数据文件将按新格式写入。使用该格式时,ClickHouse 会在元数据文件中存储完整的远程对象键,从而提供更高的灵活性和优化空间。#55566 (Sema Checherinda)。 - 添加新的设置和语法,以防止命名集合中的字段被覆盖。此举旨在防止恶意用户未经授权访问机密信息。#55782 (Salvatore Mesoraca).
- 为所有系统日志表添加
hostname列——如果将系统表设置为副本、共享或分布式表,这会很有用。 #55894 (Bharat Nallan)。 - 新增
CHECK ALL TABLES查询。#56022(vdimir)。 - 新增函数
fromDaysSinceYearZero,其作用类似于 MySQL 的FROM_DAYS。例如:SELECT fromDaysSinceYearZero(739136)返回2023-09-08。#56088(Joanna Hulboj)。 - 添加了一个外部 Python 工具,用于查看备份,并在无需使用 ClickHouse 的情况下从中提取信息。 #56268 (Vitaly Baranov).
- 引入一个名为
preferred_optimize_projection_name的新设置。如果将其配置为非空字符串,则在可能的情况下会优先使用指定的投影,而不是从所有候选项中进行选择。#56309 (Yarik Briukhovetskyi)。 - 添加用于让出/放弃主节点领导权的四字母命令(https://github.com/ClickHouse/ClickHouse/issues/56352)。#56354(Pradeep Chhetri)。#56620(Pradeep Chhetri)。
- 新增了一个 SQL 函数
arrayRandomSample(arr, k),用于从输入数组中随机抽取 k 个元素。此前只能通过语法较为繁琐的方式实现类似功能,例如:SELECT arrayReduce('groupArraySample(3)', range(10))。 #56416 (Robert Schulze). - 为
.npy文件中使用的Float16类型数据添加了支持。解决了 #56344。#56424(Yarik Briukhovetskyi)。 - 添加了系统视图
information_schema.statistics,以增强与 Tableau Online 的兼容性。#56425 (Serge Klochkov). - 添加
system.symbols表,用于对二进制程序进行自省。 #56548 (Alexey Milovidov). - 可配置仪表板。用于图表的查询现在通过查询加载,默认使用新的
system.dashboards表。#56771(Sergei Trifonov)。 - 新增
fileCluster表函数——在将共享文件系统(如 NFS)挂载到user_files目录时非常有用。#56868(Andrey Zvonov)。 - 为
s3/file/hdfs/url/azureBlobStorage引擎添加_size虚拟列,用于以字节为单位表示文件大小。 #57126 (Kruglov Pavel)。 - 通过 Prometheus 端点暴露服务器自上次重启以来各错误代码对应的错误次数。#57209 (Nikita Mikhaylov)。
- ClickHouse Keeper 会在
/keeper/availability-zone路径下报告自身所在的可用区。可以通过<availability_zone><value>us-west-1a</value></availability_zone>进行配置。 #56715 (Jianfei Hu)。 - 将
ALTER materialized_view MODIFY QUERY设为非实验性功能,并弃用allow_experimental_alter_materialized_view_structure设置。修复 #15206。#57311(alesapin)。 - 设置
join_algorithm时会遵循指定的顺序 #51745(vdimir)。 - 在 Protobuf 格式中新增对常用 Protobuf 内置类型的支持。#56741(János Benjamin Antal)。
性能优化
- 与 S3 交互时采用自适应超时策略。第一次请求会使用较短的发送和接收超时时间。#56314 (Sema Checherinda)。
- 将
max_concurrent_queries的默认值从 100 提高到 1000。当存在大量连接客户端且它们发送或接收数据较慢、因此服务器不受 CPU 限制时,或者当 CPU 核心数大于 100 时,这样的设置是合理的。同时,默认启用并发控制,并将总的查询处理线程数设置为 CPU 核心数的两倍。在存在极大量并发查询的场景下,这可以提升性能。#46927(Alexey Milovidov)。 - 支持窗口函数的并行执行。修复了 #34688。#39631 (Dmitry Novik)。
Numbers表引擎(system.numbers表的引擎)现在会分析查询条件来生成所需的数据子集,类似于使用表索引。#50909 (JackyWoo)。- 优化了
Merge表引擎中使用IN (...)条件进行过滤时的性能。#54905 (Nikita Taranov)。 - 在文件系统缓存已满且存在大量读操作时生效的优化。 #55158 (Kseniia Sumarokova).
- 为 S3 新增可禁用校验和的功能,以避免对文件进行多次不必要的遍历(通过设置
s3_disable_checksum控制)。 #55559 (Azat Khuzhin). - 现在,当数据已经在页缓存中时,我们会同步读取远程表(与本地表相同)。这种方式更快,不需要在线程池内部进行同步,可以放心地在本地文件系统上执行
seek操作,并且减少 CPU 等待时间。#55841(Nikita Taranov)。 - 针对从
map、arrayElement中获取值的优化,可带来约 30% 的性能提升:- 减少预留内存的使用 - 减少resize调用次数。#55957 (lgbo)。 - 使用 AVX-512 对多阶段过滤进行了优化。在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核,160 线程)上对 OnTime 数据集进行的性能测试表明,该更改分别可将查询 Q2、Q3、Q4、Q5 和 Q6 的 QPS 提升 7.4%、5.9%、4.7%、3.0% 和 4.6%,且对其他查询没有影响。#56079(Zhiguo Zhou)。
- 限制查询分析器中参与分析的线程数量。若线程数超过该限制,超出的线程将不会进行分析。 #56105 (Alexey Milovidov).
- 减少窗口函数中的虚函数调用次数。 #56120 (Maksim Kita).
- 在 ORC 数据格式中允许对 Tuple 字段进行递归裁剪,以加快扫描。#56122(李扬)。
- 针对
Npy数据格式的简单 count 优化:像select count() from 'data.npy'这样的查询现在由于结果缓存而会运行得快得多。#56304(Yarik Briukhovetskyi)。 - 包含聚合且具有大量数据流的查询,在构建执行计划阶段将占用更少的内存。#57074 (Alexey Milovidov).
- 通过优化对 ProcessList 的访问,在拥有大量用户且查询高度并发(>2000 QPS)的场景中提升查询执行性能。 #57106 (Andrej Hoos).
- 对
array join做了小幅改进,复用了一些中间结果。#57183 (李扬)。 - 在某些情况下,栈展开以前会很慢。现在已经不再是问题。#57221(Alexey Milovidov)。
- 现在,当
max_streams = 1时,我们会使用默认读池从外部存储读取数据。在启用读取预取时,这样做会更有利。#57334(Nikita Taranov)。 - Keeper 改进:通过延迟日志预处理来降低启动期间的内存使用。#55660 (Antonio Andelic)。
- 提升了
File和HDFS存储中 glob(通配符)匹配的性能。#56141 (Andrey Zvonov). - 实验性全文索引中的 posting list 现已压缩,其大小减少了 10–30%。 #56226 (Harry Lee).
- 在备份流程中对
BackupEntriesCollector进行并行化。#56312(Kseniia Sumarokova)。
改进
- 新增一个名为
add_implicit_sign_column_constraint_for_collapsing_engine的MergeTree设置(默认禁用)。启用后,会为CollapsingMergeTree表添加一个隐式的 CHECK 约束条件,将Sign列的取值限制为仅为 -1 或 1。 #56701。 #56986 (Kevin Mingtarja)。 - 允许在无需重启的情况下向存储配置添加新磁盘。#56367 (Duc Canh Le)。
- 支持在同一条 ALTER 查询语句中创建并物化索引,也支持在同一条查询中同时执行 "modify TTL" 和 "materialize TTL"。修复了 #55651 中的问题。#56331 (flynn)。
- 添加一个名为
fuzzJSON的新表函数,其行包含在源 JSON 字符串基础上加入随机扰动后的变体。#56490(Julia Kartseva)。 - 引擎
Merge会根据底层表的行策略过滤记录,因此你无需在Merge表上再创建行策略。#50209(Ilya Golshtein)。 - 添加设置
max_execution_time_leaf用于限制分布式查询在分片上的执行时间,并使用timeout_overflow_mode_leaf来控制发生超时时的行为。#51823 (Duc Canh Le)。 - 新增 ClickHouse 设置,用于在通过 HTTP 代理发起 HTTPS 请求时禁用隧道功能。 #55033 (Arthur Passos).
- 将
background_fetches_pool_size设置为 16,将 background_schedule_pool_size 设置为 512,更适合在生产环境中频繁进行小批量数据插入的场景。#54327 (Denny Crane). - 当从 CSV 格式文件中读取数据时,如果行尾是
\r且其后没有跟随\n,就会遇到如下异常:Cannot parse CSV format: found \r (CR) not followed by \n (LF). Line must end by \n (LF) or \r\n (CR LF) or \n\r.。在 ClickHouse 中,CSV 的行结束符必须是\n、\r\n或\n\r,因此\r后面必须紧跟\n。但在某些情况下,CSV 输入数据会不规范,如上所述,\r直接出现在行尾。#54340 (KevinyhZou)。 - 将 Arrow 库更新到支持新编码的 release-13.0.0 版本。关闭 #44505。#54800(Kruglov Pavel)。
- 通过在查找 DDL 条目中 hosts 列表里的本地 IP 地址时,移除为获取所有网络接口而进行的代价高昂的系统调用,提升
ON CLUSTER查询的性能。 #54909 (Duc Canh Le). - 修复了在将线程附加到查询或用户之前对已分配内存的记账问题。 #56089 (Nikita Taranov).
- 在 Apache Arrow 格式中增加对
LARGE_LIST的支持。#56118 (edef)。 - 允许通过
OPTIMIZE查询对EmbeddedRocksDB执行手动压实(compaction)。#56225(Azat Khuzhin)。 - 为
EmbeddedRocksDB表新增指定 BlockBasedTableOptions 的支持。 #56264 (Azat Khuzhin). - 当通过 MySQL 协议建立连接时,
SHOW COLUMNS现在会显示对应的 MySQL 数据类型名称。此前,只有在将use_mysql_types_in_show_columns = 1设置为启用时才会如此。该设置仍然保留,但已被废弃。 #56277 (Robert Schulze). - 修复了这样一个问题:如果在执行
TRUNCATE或DROP PARTITION之后立即重启服务器,可能会出现The local set of parts of table doesn't look like the set of parts in ZooKeeper错误。#56282(Alexander Tokmakov)。 - 修复了在函数
formatQuery/formatQuerySingleLine中对非常量查询字符串的处理。同时新增了这两个函数的OrNull变体,在无法解析查询时返回 NULL,而不是抛出异常。#56327(Robert Schulze)。 - 允许在内部表已被删除时仍备份物化视图,而不是让备份操作失败。 #56387 (Kseniia Sumarokova).
- 对
system.replicas的查询在检索某些列时会向 ZooKeeper 发起请求。当存在成千上万张表时,这些请求可能会给 ZooKeeper 带来相当大的负载。如果有多个同时对system.replicas的查询,则会多次重复发出相同的请求。此更改的目的在于对并发查询的请求进行“去重”。#56420(Alexander Gololobov)。 - 修复在查询外部数据库时生成 MySQL 兼容查询的转换。#56456 (flynn).
- 新增对使用
KeeperMap引擎进行表备份和恢复的支持。#56460 (Antonio Andelic). - 需要重新确认
CompleteMultipartUpload返回的 404 响应。即使客户端发生超时或其他网络错误,该操作也可能已经在服务器端完成。下一次重试CompleteMultipartUpload时会收到 404 响应。如果对应的对象键已存在,则认为该操作已成功完成。#56475 (Sema Checherinda). - 默认启用 HTTP OPTIONS 方法——以便更方便地从 Web 浏览器向 ClickHouse 发起请求。#56483 (Alexey Milovidov)。
dns_max_consecutive_failures的值在 #46550 中被误改 —— 现已恢复并调整为一个更合适的值。同时,将 HTTP keep-alive 超时时间提升到了一个参考生产环境的合理数值。#56485 (Alexey Milovidov).- 延迟加载基础备份(仅在需要时才加载基础备份)。同时为备份添加一些日志消息和 profile 事件。#56516 (Vitaly Baranov).
- 设置项
query_cache_store_results_of_queries_with_nondeterministic_functions(取值为false或true)已被标记为废弃。它被设置项query_cache_nondeterministic_function_handling所取代,这是一个三值枚举,用于控制查询缓存如何处理包含非确定性函数的查询:a)抛出异常(默认行为),b)仍然保存该非确定性查询的结果,或 c)忽略,即既不抛出异常也不缓存结果。#56519(Robert Schulze)。 - 在 JOIN 的 ON 子句中,将等值条件改写为
is null检查。实验性功能,仅适用于 Analyzer。 #56538 (vdimir). - 函数
concat现在支持任意类型的参数(不再仅限于 String 和 FixedString 参数)。这使其行为更接近 MySQL 中的concat实现。例如,SELECT concat('ab', 42)现在会返回ab42。 #56540 (Serge Klochkov)。 - 允许从配置文件中的 'named_collection' 部分或从通过 SQL 创建的命名集合中获取缓存配置。 #56541 (Kseniia Sumarokova).
- PostgreSQL 数据库引擎:在 PostgreSQL 连接失败时,降低对过期表删除策略的激进程度。#56609 (jsc0218)。
- 当 URL 不正确时,连接 PG 会耗费过多时间,导致相关查询长时间挂起并最终被取消。#56648 (jsc0218).
- Keeper 改进:在 Keeper 中默认禁用压缩日志。#56763(Antonio Andelic)。
- 添加配置项
wait_dictionaries_load_at_startup。#56782 (Vitaly Baranov). - 在之前的 ClickHouse 版本中存在一个潜在漏洞:如果某个用户连接后尝试使用 "interserver secret" 方法进行认证但失败,服务器不会立即终止连接,而是继续接收并忽略来自客户端的剩余数据包。尽管这些数据包会被忽略,但它们仍然会被解析,如果其中使用了一种已知存在其他漏洞的压缩方法,就可能在未通过认证的情况下被利用触发该漏洞。该问题是通过 ClickHouse Bug Bounty Program 由 https://twitter.com/malacupa 发现的。#56794(Alexey Milovidov)。
- 在获取某个 part 时,会等待该 part 在远程副本上完全提交之后才开始获取。最好不要发送处于 PreActive 状态的 part。对于零拷贝(zero copy)场景,这是一个强制性限制。#56808(Sema Checherinda)。
- 修复在使用实验性
MaterializedPostgreSQL时可能出现的 PostgreSQL 逻辑复制转换错误。#53721(takakawa)。 - 实现用户级别设置
alter_move_to_space_execute_async,允许异步执行ALTER TABLE ... MOVE PARTITION|PART TO DISK|VOLUME查询。用于后台执行的线程池大小由background_move_pool_size控制。默认行为为同步执行。修复了 #47643。#56809(alesapin)。 - 在扫描
system.tables时可以按引擎进行过滤,从而避免不必要(且可能耗时)的连接操作。#56813(jsc0218)。 - 在系统表中显示 RocksDB 存储的
total_bytes和total_rows。#56816 (Aleksandr Musorin)。 - 允许在
ALTER中对TEMPORARY表执行基本命令。 #56892 (Sergey). - LZ4 压缩。在极少数情况下,当输出缓冲区的容量不足以将压缩块直接写入输出缓冲区时,对压缩块进行缓冲处理。 #56938 (Sema Checherinda).
- 为队列中的作业数量添加指标,这对于 IO 线程池非常有用。#56958 (Alexey Milovidov)。
- 在配置文件中为 PostgreSQL 表引擎添加了一个设置项,增加了对该设置的检查,并补充了相关文档说明。#56959 (Peignon Melvyn)。
- 函数
concat现在可以仅使用单个参数进行调用,例如:SELECT concat('abc')。这使其行为与 MySQL 的 concat 实现更加一致。#57000(Serge Klochkov)。 - 按 AWS S3 文档要求对所有
x-amz-*请求头进行签名。#57001 (Arthur Passos)。 - 函数
fromDaysSinceYearZero(别名:FROM_DAYS)现在可以用于无符号和有符号整数类型(之前只支持无符号整数)。这提升了与 Tableau Online 等第三方工具的兼容性。#57002(Serge Klochkov)。 - 在默认配置中添加
system.s3queue_log。 #57036 (Kseniia Sumarokova)。 - 将
wait_dictionaries_load_at_startup的默认值改为 true,并且仅在dictionaries_lazy_load为 false 时才使用此设置。#57133(Vitaly Baranov)。 - 即使启用了
dictionaries_lazy_load,在创建时仍会检查字典源类型。#57134(Vitaly Baranov)。 - 现在可以单独启用或禁用计划级别优化。之前只能一次性全部禁用。此前用于执行该操作的设置(
query_plan_enable_optimizations)仍然保留,仍可用于禁用所有优化。#57152(Robert Schulze)。 - 服务器的退出状态码将与异常代码对应。例如,如果服务器由于内存限制而无法启动,它将以代码 241 = MEMORY_LIMIT_EXCEEDED 退出。在之前的版本中,异常的退出状态码始终是 70 = Poco::Util::ExitCode::EXIT_SOFTWARE。 #57153 (Alexey Milovidov).
- 不再对来自
functionalC++ 头文件的栈帧执行名称还原和符号化处理。#57201 (Mike Kot)。 - HTTP 服务器页面
/dashboard现在支持包含多条曲线的图表。#57236 (Sergei Trifonov)。 - 命令行选项
max_memory_usage_in_client现已支持带后缀(K、M、G 等)的字符串值。已解决 #56879。#57273(Yarik Briukhovetskyi)。 - 将 Intel QPL(供编解码器
DEFLATE_QPL使用)从 v1.2.0 升级到 v1.3.1。还修复了在 BOF(Block On Fault)= 0 时的一个问题,改为在发生页故障时回退到软件路径(SW path)进行处理。#57291 (jasperzhu)。 - 将 MergeTree 设置中的
replicated_deduplication_window默认值从 100 提高到 1k。 #57335 (sichenzhao). - 尽量减少使用
INCONSISTENT_METADATA_FOR_BACKUP。如果可能,应尽量继续扫描,而不是停止并从头重新进行备份扫描。 #57385 (Vitaly Baranov).
构建/测试/打包改进
- 添加 SQLLogic 测试。#56078(Han Fei)。
- 为提高易用性,将
clickhouse-local和clickhouse-client支持通过简写名称(ch、chl、chc)调用。#56634(Alexey Milovidov)。 - 通过移除外部库中未使用的代码,进一步优化了构建产物体积。#56786 (Alexey Milovidov).
- 新增自动检查,确保不存在过大的翻译单元。#56559 (Alexey Milovidov)。
- 缩小单一二进制发行包的体积。此更改关闭了 issue #55181。#56617(Alexey Milovidov)。
- 每次构建完成后,关于每个翻译单元和二进制文件大小的信息都会发送到 ClickHouse Cloud 中的 CI 数据库。这解决了 #56107。#56636(Alexey Milovidov)。
- “Apache Arrow” 库中的某些文件(我们仅将其用于诸如解析 Arrow 格式之类的非关键功能)之前无论构建缓存如何都会被重新构建。现在已修复。#56657 (Alexey Milovidov)。
- 避免因版本相关的自动生成源文件而重新编译依赖它的翻译单元。 #56660 (Alexey Milovidov).
- 链接器调用的跟踪数据将被发送到 ClickHouse Cloud 的 CI 数据库。#56725(Alexey Milovidov)。
- 对 ClickHouse 二进制文件改用 DWARF 5 调试符号(此前为 DWARF 4)。 #56770 (Michael Kolupaev)。
- 新增一个构建选项
SANITIZE_COVERAGE。如果启用,代码会被插桩以跟踪覆盖率。收集到的信息可以在 ClickHouse 中通过以下方式获取:(1)新增函数coverage,返回自上次重置覆盖率以来在代码中发现的唯一地址数组;(2)SYSTEM RESET COVERAGE查询,用于重置已累积的数据。这样可以比较不同测试的覆盖率,包括差分代码覆盖率。本项为 #20539 的延续。#56102(Alexey Milovidov)。 - 在收集堆栈时,部分栈帧可能无法被解析。这种情况下,原始地址信息可能会有用。#56267(Alexander Gololobov)。
- 新增可用于禁用
libssh的选项。#56333 (Alexey Milovidov). - 在 CI 的 S3 测试中启用 temporary_data_in_cache。 #48425 (vdimir).
- 在 CI 中将 clickhouse-client 的最大内存使用量设置为
1G。#56873(Nikita Mikhaylov)。
错误修复(官方稳定版本中用户可见的异常行为)
- 修复实验性 Analyzer —— 对于带有引用插入表的子查询的
INSERT ... SELECT,应当只处理待插入的数据块。 #50857 (Yakov Olkhovskiy)。 - 修复了
str_to_map函数中的一个问题。#56423 (Arthur Passos)。 - Keeper
reconfig:在让出/获取领导权之前添加超时时间 #53481 (Mike Kot)。 - 修复 Grace 哈希连接和 filter 下推中的错误 header #53922 (vdimir)。
- 当表基于表函数时,支持从 system 表中执行 SELECT。 #55540 (MikhailBurdukov).
- RFC:修复带 LIMIT BY 的 Distributed 查询中出现的 “Cannot find column X in source stream” 错误 #55836 (Azat Khuzhin).
- 修复在后台运行客户端时出现的
Cannot read from file:错误 #55976 (Kruglov Pavel). - 修复因错误的 send_logs_level 设置导致 clickhouse-local 退出的问题 #55994 (Kruglov Pavel).
- 修复在使用参数化视图时的 EXPLAIN AST Bug #56004 (SmitaRKulkarni)。
- 修复启动时加载表时发生的崩溃 #56232 (Nikolay Degterinsky)。
- 通过显式查询修复以 ClickHouse 为数据源的字典 #56236 (Nikolay Degterinsky)。
- 修复 Keeper 中信号处理程序中的分段错误 #56266(Antonio Andelic)。
- 修复在
view()函数中使用UNION时出现的不完整查询结果。#56274(Nikolai Kochetov)。 - 修复 "cast('0' as DateTime64(3))" 与 "cast('0' as Nullable(DateTime64(3)))" 之间行为不一致的问题 #56286 (李扬).
- 修复因内存分配失败导致的罕见竞争条件 #56303 (alesapin)。
- 修复了在使用
flatten_nested和data_type_default_nullable时从备份恢复的问题 #56306(Kseniia Sumarokova)。 - 修复在添加 Object(JSON) 类型列时出现的崩溃问题 #56307 (Nikita Mikhaylov).
- 修复 filterPushDown 中的崩溃问题 #56380 (vdimir).
- 修复在存在物化视图且源表已被删除时从备份恢复的问题 #56383 (Kseniia Sumarokova).
- 修复在 Kerberos 初始化期间发生的段错误 #56401 (Nikolay Degterinsky)。
- 修复 T64 中的缓冲区溢出 #56434 (Alexey Milovidov).
- 修复在 FINAL 中可为 NULL 的主键问题 (2) #56452 (Amos Bird)。
- 修复在初始节点上未指定数据库时的 ON CLUSTER 查询 #56484 (Nikolay Degterinsky).
- 修复因 TTL 依赖关系导致的启动失败 #56489(Nikolay Degterinsky)。
- 修复 ON CLUSTER 模式下的 ALTER COMMENT 查询 #56491 (Nikolay Degterinsky).
- 修复 ALTER COLUMN 与 ALIAS 搭配使用时的问题 #56493(Nikolay Degterinsky)。
- 修复空 NAMED COLLECTION 的问题 #56494 (Nikolay Degterinsky).
- 修复投影分析中的两个问题。#56502(Amos Bird)。
- 修复查询缓存中对别名的处理 #56545(Robert Schulze)。
- 修复将
Nullable(Enum)转换为Nullable(String)时的问题 #56644 (Nikolay Degterinsky)。 - 提升 Keeper 中日志处理的可靠性 #56670 (Antonio Andelic).
- 修复在合并配置时对带有替换属性的节点的处理问题 #56694 (Konstantin Bogdanov)。
- 修复重复使用表函数 input() 的问题。 #56695 (Nikolai Kochetov).
- 修复 RabbitMQ OpenSSL 动态加载问题 #56703 (Igor Nikonov).
- 修复在数据包含零值时 GCD 编解码器崩溃的问题 #56704 (Nikita Mikhaylov).
- 修复在使用 insert into 函数插入时 clickhouse-local 出现的 'mutex lock failed: Invalid argument' 错误 #56710 (Kruglov Pavel).
- 修复在乐观路径中对 Date 文本的解析 #56765 (Kruglov Pavel)。
- 修复 FPC 编解码器中的崩溃问题 #56795 (Alexey Milovidov).
- DatabaseReplicated:修复在副本恢复后 DDL 查询超时的问题 #56796 (Alexander Tokmakov).
- 修复 MySQL 二进制协议中关于可为空列的错误报告问题 #56799 (Serge Klochkov)。
- 为 metastore 表增加对 Iceberg 元数据文件的支持 #56810 (Kruglov Pavel)。
- 修复与 transform 相关的 TSAN 报告 #56817(Raúl Marín)。
- 修复 SET 查询和 SETTINGS 的格式化问题 #56825 (Nikolay Degterinsky)。
- 修复由于
joinGet中的表依赖导致启动失败的问题 #56828(Nikolay Degterinsky)。 - 修复在执行 ADD COLUMN 时错误扁平化已有 Nested 列的问题 #56830 (Nikolay Degterinsky)。
- 修复在 CSV 中允许使用 CR 作为行结束符的行为 #56901 (KevinyhZou).
- 修复
tryBase64Decode在处理无效输入时的问题 #56913 (Robert Schulze). - 修复在 CapnProto/Protobuf schema 中生成深度嵌套列时的问题 #56941 (Kruglov Pavel)。
- 防止对投影列进行不兼容的 ALTER #56948 (Amos Bird).
- 修复 SQLite 文件路径验证 #56984 (San).
- S3Queue:修复元数据引用计数递增问题 #56990 (Kseniia Sumarokova).
- S3Queue 小修复 #56999(Kseniia Sumarokova)。
- 修复 DatabaseFileSystem 的文件路径校验 #57029 (San).
- 使用
ARRAY JOIN修复fuzzBits#57033 (Antonio Andelic)。 - 修复在使用 joined_subquery_re... 的部分合并 JOIN 中出现的 nullptr 解引用问题 #57048 (vdimir).
- 修复 RemoteSource 中的竞争条件 #57052 (Raúl Marín)。
- 为大整数实现
bitHammingDistance#57073 (Alexey Milovidov). - 修复 S3 风格链接的错误 #57075 (Yarik Briukhovetskyi)。
- 修复
JSON_QUERY函数在使用多个数值路径时的问题 #57096(KevinyhZou)。 - 修复 Gorilla 编解码器中的缓冲区溢出问题 #57107(Nikolay Degterinsky)。
- 在认证之前,一旦遇到任何异常就关闭服务器间连接 #57142 (Antonio Andelic)。
- 修复在包含 Nullable MATERIALIZED 列的表上执行 ALTER UPDATE 后发生的段错误 #57147 (Nikolay Degterinsky).
- 修复在部分物化的常规投影下不正确的 JOIN 计划优化问题 #57196 (Amos Bird).
- 在比较列描述时忽略注释 #57259(Antonio Andelic)。
- 修复在所有场景下的
ReadonlyReplica指标 #57267(Antonio Andelic)。 - 后台合并现已能在缓存中正确使用临时数据存储 #57275 (vdimir)。
- 修复 Keeper 的变更日志和快照问题 #57299 (Antonio Andelic).
- 当主机名发生变化时,忽略已完成的 ON CLUSTER 任务 #57339 (Alexander Tokmakov)。
- MergeTree 变更操作复用源数据分片的索引粒度 #57352 (Maksim Kita).
- FS 缓存:为后台下载添加限制 #57424 (Kseniia Sumarokova).
ClickHouse 版本 23.10,2023-11-02
向后不兼容变更
- 不再提供自动删除损坏数据分片的选项。此变更关闭了 #55174。#55184(Alexey Milovidov)。#55557(Jihyuk Bok)。
- 已废弃的内存数据分片将不再能够从预写日志(write-ahead log)中读取。如果之前配置过内存分片,在升级前必须将其移除。#55186(Alexey Milovidov)。
- 移除与 Meilisearch 的集成。原因:该集成仅与旧版本 0.18 兼容。最新版本的 Meilisearch 修改了协议,现已无法工作。注意:如能协助恢复该集成,我们将不胜感激。#55189(Alexey Milovidov)。
- 将目录监控(directory monitor)概念重命名为后台 INSERT。所有
*directory_monitor*相关设置均重命名为distributed_background_insert*。应当保持向后兼容性(因为旧设置已作为别名保留)。#55978(Azat Khuzhin)。 - 不再将客户端设置的
send_timeout解释为服务端的receive_timeout,反之亦然。#56035(Azat Khuzhin)。 - 对具有不同单位的时间间隔进行比较时将抛出异常。此变更关闭了 #55942。你可能曾不经意地依赖之前的行为,即无视单位直接比较底层数值。#56090(Alexey Milovidov)。
- 已完全重写实验性的
S3Queue表引擎:更改了在 ZooKeeper 中保存信息的方式,从而减少 ZooKeeper 请求次数;在已知状态不会改变的情况下增加 ZooKeeper 状态缓存;改进从 S3 的轮询过程,降低轮询的激进程度;更改维护已跟踪文件的 TTL 和最大集(max set)方式,现在由后台进程完成。新增system.s3queue和system.s3queue_log表。关闭了 #54998。#54422(Kseniia Sumarokova)。 - HTTP 端点上的任意路径将不再被解释为对
/query端点的请求。#55521(Konstantin Bogdanov)。
新功能
- 新增函数
arrayFold(accumulator, x1, ..., xn -> expression, initial, array1, ..., arrayn),该函数对多个具有相同长度的数组应用 lambda 函数,并将结果累积到累加器(accumulator)中。#49794 (Lirikl)。 - 新增对
Npy格式的支持。SELECT * FROM file('example_array.npy', Npy)。#55982(Yarik Briukhovetskyi)。 - 如果一个表在其键中使用了空间填充曲线,例如
ORDER BY mortonEncode(x, y),则其参数上的条件(例如x >= 10 AND x <= 20 AND y >= 20 AND y <= 30)可以用于索引。新增设置analyze_index_with_space_filling_curves用于启用或禁用此类分析。这解决了 #41195。是对 #4538 的延续。是对 #6286 的延续。是对 #28130 的延续。是对 #41753 的延续。#55642(Alexey Milovidov)。 - 新增了一个名为
force_optimize_projection_name的新设置,它接受某个 projection 的名称作为参数。如果该设置的值被指定为非空字符串,ClickHouse 会检查在查询中是否至少使用过一次该 projection。修复了 #55331。#56134(Yarik Briukhovetskyi)。 - 通过原生协议支持使用外部数据的异步插入。此前仅在将数据内联到查询中时才可用。#54730 (Anton Popov)。
- 新增聚合函数
lttb,使用 Largest-Triangle-Three-Buckets 算法对数据进行可视化降采样。#53145(Sinan)。 CHECK TABLE查询具有更好的性能和易用性(会发送进度更新,可取消)。支持使用CHECK TABLE ... PART 'part_name'检查指定的 part。 #53404 (vdimir)。- 新增函数
jsonMergePatch。在以字符串形式处理 JSON 数据时,该函数提供了一种方式,将多个(JSON 对象的)字符串合并成一个包含单个 JSON 对象的字符串。 #54364 (Memo)。 - Kusto Query Language 方言支持的第二部分。第一阶段的实现已合并。#42510(larryluogit)。
- 新增了一个 SQL 函数
arrayRandomSample(arr, k),用于从输入数组中随机返回 k 个元素的样本。此前要实现类似功能只能使用不太方便的语法,例如 "SELECT arrayReduce('groupArraySample(3)', range(10))"。 #54391 (itayisraelov). - 引入
-ArgMin/-ArgMax聚合组合子,它们仅按最小值/最大值进行聚合。一个使用场景示例见 #54818。此 PR 还将这些组合子重新组织到专用目录中。#54947(Amos Bird)。 - 允许通过
SYSTEM DROP SCHEMA FORMAT CACHE [FOR Protobuf]清除 Protobuf 格式的缓存。#55064 (Aleksandr Musorin)。 - 添加外部 HTTP Basic 身份验证器。#55199 (Aleksei Filatov)。
- 新增函数
byteSwap,用于反转无符号整数的字节顺序。对于反转那些在内部以无符号整数形式表示的类型(例如 IPv4)的值特别有用。#55211 (Priyansh Agrawal)。 - 新增函数
formatQuery,用于返回 SQL 查询字符串的格式化后版本(可能包含多行)。同时新增函数formatQuerySingleLine,其功能相同,但返回的字符串不包含换行符。#55239 (Salvatore Mesoraca)。 - 新增了
DWARF输入格式,可从 ELF 可执行文件/库/目标文件中读取调试符号。#55450 (Michael Kolupaev)。 - 支持在 RabbitMQ、NATS 和 FileLog 引擎中保存未解析的记录及其错误。添加虚拟列
_error和_raw_message(用于 NATS 和 RabbitMQ)、_raw_record(用于 FileLog),当 ClickHouse 无法解析新记录时,这些列会被填充。该行为通过存储设置中的nats_handle_error_mode(用于 NATS)、rabbitmq_handle_error_mode(用于 RabbitMQ)、handle_error_mode(用于 FileLog)进行控制,类似于kafka_handle_error_mode。如果将其设置为default,当 ClickHouse 无法解析记录时会抛出异常;如果设置为stream,错误和原始记录将会被保存到这些虚拟列中。修复并关闭 #36035。#55477(Kruglov Pavel)。 - Keeper 客户端改进:新增
get_all_children_number命令,用于返回指定路径下所有子节点的数量。#55485 (guoxiaolong). - Keeper 客户端改进:新增
get_direct_children_number命令,用于返回指定路径下直接子节点的数量。#55898 (xuzifu666). - 添加语句
SHOW SETTING setting_name,这是现有语句SHOW SETTINGS的一个更简化版本。 #55979 (Maksim Kita)。 - 在
system.parts_columns表中新增了substreams和filenames列。 #55108 (Anton Popov). - 新增对
SHOW MERGES查询的支持。#55815(megao)。 - 引入设置
create_table_empty_primary_key_by_default,以便在默认情况下使用ORDER BY ()。#55899(Srikanth Chekuri)。
性能优化
- 新增选项
query_plan_preserve_num_streams_after_window_functions,在计算窗口函数后保留数据流的数量,从而支持并行流处理。#50771 (frinkr). - 当数据量较小时,释放更多流。 #53867 (Jiebin Sun).
- 在序列化之前对 RoaringBitmaps 进行了优化。#55044(UnamedRus)。
- 倒排索引中的 posting list 现已优化为对内部位图使用尽可能紧凑的表示形式。根据数据的重复程度,这可以显著减少倒排索引的空间占用。#55069(Harry Lee)。
- 修复 Context 锁上的竞争,这显著提升了大量短时间运行的并发查询的性能。#55121(Maksim Kita)。
- 将倒排索引构建的性能提升了 30%。这是通过将
std::unordered_map替换为absl::flat_hash_map实现的。 #55210 (Harry Lee)。 - 支持 ORC 过滤下推(行组级别)。#55330 (李扬).
- 提升在存在大量临时文件时的外部聚合性能。#55489 (Maksim Kita)。
- 为二级索引的 marks cache 设置合理的默认大小,以避免重复加载 marks。#55654(Alexey Milovidov)。
- 在读取 skip 索引时,避免对索引粒度进行不必要的重建。这解决了 #55653。#55683(Amos Bird)。
- 在执行过程中对集合中的 CAST 操作进行缓存,以在集合元素类型与列类型不完全匹配时提升
IN函数的性能。#55712 (Duc Canh Le)。 - 对
ColumnVector::insertMany和ColumnVector::insertManyFrom的性能进行了改进。 #55714 (frinkr)。 - 通过预测下一行键的位置来优化 Map 下标访问,从而减少比较次数。#55929 (lgbo)。
- 在 Parquet 中支持结构体字段裁剪(在早期版本中在某些情况下不生效)。 #56117 (lgbo)。
- 根据预估的读取行数,新增可调节查询执行时所使用并行副本数量的功能。#51692(Raúl Marín)。
- 当生成大量临时文件时,优化了外部聚合的内存开销。#54798 (Nikita Taranov)。
- 以
async_socket_for_remote模式(默认)执行的分布式查询现在会遵守max_threads限制。此前,某些查询可能会创建过多线程(最多可达max_distributed_connections),从而导致服务器性能问题。#53504 (filimonov)。 - 在从 ZooKeeper 分布式 DDL 队列执行 DDL 时缓存可跳过的队列项。 #54828 (Duc Canh Le).
- 实验性的倒排索引不会存储匹配行数过多的 token(即倒排列表中的行 ID 过多)。这样可以节省空间,并避免在顺序扫描同样快或更快的情况下进行低效的索引查找。此前用于控制何时不存储 token 的启发式规则(传递给索引定义的
density参数)让用户感到困惑。现在引入了一个更简单的、基于max_rows_per_postings_list参数(默认值:64k)的启发式规则,用于直接控制单个倒排列表中允许的最大行 ID 数量。#55616(Harry Lee)。 - 提升对
EmbeddedRocksDB表的写入性能。 #55732 (Duc Canh Le). - 在某个分区包含大量 part(超过 1000 个)时,提升了 ClickHouse 的整体健壮性。这可能会减少
TOO_MANY_PARTS错误的出现次数。 #55526 (Nikita Mikhaylov). - 在加载分层字典时减少了内存占用。 #55838 (Nikita Taranov).
- 现在所有字典都支持设置
dictionary_use_async_executor。#55839(vdimir)。 - 防止在反序列化 AggregateFunctionTopKGenericData 时出现过量的内存占用。#55947 (Raúl Marín).
- 在具有大量 watch 的 Keeper 实例上,AsyncMetrics 线程可能会在
DB::KeeperStorage::getSessionsWithWatchesCount中长时间占用 100% 的 CPU。修复方法是避免遍历开销较大的watches和list_watches集合。#56054 (Alexander Gololobov)。 - 添加设置
optimize_trivial_approximate_count_query,以在 EmbeddedRocksDB 存储中使用count近似计数。为 StorageJoin 启用简单计数。#55806 (Duc Canh Le)。
改进
- 函数
toDayOfWeek(MySQL 别名:DAYOFWEEK)、toYearWeek(YEARWEEK)和toWeek(WEEK)现在支持String类型参数。这使其行为与 MySQL 保持一致。#55589(Robert Schulze)。 - 引入了
date_time_overflow_behavior设置,可选值为ignore、throw、saturate,用于控制在从 Date、Date32、DateTime64、Integer 或 Float 转换为 Date、Date32、DateTime 或 DateTime64 时的溢出处理行为。#55696(Andrey Zvonov)。 - 为
ALTER TABLE ... ACTION PARTITION [ID] {parameter_name:ParameterType}实现对查询参数的支持。合并 #49516。关闭 #49449。#55604(alesapin)。 - 以更美观的方式在 EXPLAIN 中显示处理器 ID。#48852(Vlad Seliverstov)。
- 在创建 direct dictionary 时指定 lifetime 字段会导致创建被拒绝(因为 lifetime 对 direct dictionary 没有意义)。修复:#27861。#49043(Rory Crispin)。
- 允许在包含分区子句的查询中使用参数,例如
ALTER TABLE t DROP PARTITION。修复了 #49449 问题。#49516(Nikolay Degterinsky)。 - 为
system.zookeeper_connection添加新列xid。 #50702 (helifu). - 在配置重载后,在
system.server_settings中显示正确的服务器设置。#53774 (helifu). - 在查询中添加对数学减号字符
−的支持,其行为与-类似。 #54100 (Alexey Milovidov)。 - 为试验性的
Replicated数据库引擎添加副本组。关闭了 #53620。#54421(Nikolay Degterinsky)。 - 对于可重试的 S3 错误,与其让查询直接失败,不如进行重试。默认将
s3_retry_attempts设置为更大的值。 #54770 (Sema Checherinda). - 新增一种负载均衡模式
hostname_levenshtein_distance。#54826 (JackyWoo)。 - 改进日志中的敏感信息隐藏机制。 #55089 (Vitaly Baranov).
- 目前投影分析只会基于查询计划执行。
query_plan_optimize_projection设置项已废弃(并且早在很久以前就已默认启用)。#55112 (Nikita Mikhaylov)。 - 当函数
untuple在具有命名元素的 tuple 上被调用且自身带有别名时(例如select untuple(tuple(1)::Tuple(element_alias Int)) AS untuple_alias),结果列名现在由 untuple 的别名和 tuple 元素的别名组合生成(在该示例中为 “untuple_alias.element_alias”)。 #55123 (garcher22)。 - 新增了设置
describe_include_virtual_columns,允许在DESCRIBE查询的结果中包含表的虚拟列。新增了设置describe_compact_output。如果将其设置为true,DESCRIBE查询只返回列的名称和类型,而不包含额外信息。 #55129 (Anton Popov). - 有时带有
optimize_throw_if_noop=1的OPTIMIZE可能会以错误unknown reason失败,而其真实原因是各个部分的投影不一致。此行为已修复。 #55130 (Nikita Mikhaylov)。 - 允许针对同一个 Postgres 表创建多个
MaterializedPostgreSQL表。默认情况下此行为未启用(出于兼容性考虑,因为这是向后不兼容的更改),但可以通过设置materialized_postgresql_use_unique_replication_consumer_identifier来启用。解决了 #54918。#55145(Kseniia Sumarokova)。 - 允许从短字符串中解析带小数部分的负
DateTime64和DateTime值。#55146 (Andrey Zvonov)。 - 为提高与 MySQL 的兼容性:1.
information_schema.tables现在包含新字段table_rows,2.information_schema.columns现在包含新字段extra。#55215(Robert Schulze)。 - 当结果为 0 且抛出异常时,clickhouse-client 将不会显示 "0 rows in set"。 #55240 (Salvatore Mesoraca).
- 支持在重命名表时省略关键字
TABLE,例如RENAME db.t1 to db.t2。 #55373 (凌涛). - 向
system.clusters添加internal_replication。 #55377 (Konstantin Morozov). - 根据请求协议选择远程代理解析器,新增代理功能相关文档,并移除
DB::ProxyConfiguration::Protocol::ANY。 #55430 (Arthur Passos). - 在表被关闭后,避免重试与 INSERT 相关的 Keeper 操作。 #55519 (Azat Khuzhin).
SHOW COLUMNS现在在开启设置use_mysql_types_in_show_columns时,会将类型FixedString正确报告为BLOB。同时新增了两个设置:mysql_map_string_to_text_in_show_columns和mysql_map_fixed_string_to_text_in_show_columns,用于将类型String和FixedString的输出在TEXT和BLOB之间切换。#55617(Serge Klochkov)。- 在启动 ReplicatedMergeTree 表时,ClickHouse 服务器会检查本地数据片段集合中是否存在异常片段(仅在本地存在但在 ZooKeeper 中不存在)。所有异常片段都会被移动到 detached 目录中,服务器则尝试用它们的某个祖先(覆盖它们的)片段进行恢复。现在服务器会尝试恢复最近的祖先片段,而不是随机选择任意覆盖片段进行恢复。 #55645 (alesapin).
- 高级仪表盘现在在触摸设备上也支持拖动图表。此更改解决了 #54206。#55649(Alexey Milovidov)。
- 在使用
http_write_exception_in_output_format输出异常时,如果声明了默认查询格式,则使用该默认查询格式。#55739 (Raúl Marín). - 为 MATERIALIZED VIEW 的常见问题提供了更清晰的错误消息。#55826(Raúl Marín)。
- 如果删除了当前数据库,你仍然可以在
clickhouse-local中运行一些查询并切换到另一个数据库,从而使其行为与clickhouse-client保持一致。此更改修复了 #55834。#55853(Alexey Milovidov)。 - 函数
(add|subtract)(Year|Quarter|Month|Week|Day|Hour|Minute|Second|Millisecond|Microsecond|Nanosecond)现在支持以字符串形式传入日期参数,例如SELECT addDays('2023-10-22', 1)。这提高了与 MySQL 的兼容性,并且是 Tableau Online 所需的。#55869(Robert Schulze)。 - 禁用
apply_deleted_mask设置后,可以读取那些被轻量级 DELETE 查询标记为已删除的行。这对于调试非常有用。#55952(Alexander Gololobov)。 - 在将 Tuple 序列化为 JSON 对象时允许跳过
null值,从而保持与 Spark 的to_json函数的兼容性,对 Gluten 也同样有用。#55956 (李扬)。 - 函数
(add|sub)Date现在支持字符串形式的日期参数,例如SELECT addDate('2023-10-22 11:12:13', INTERVAL 5 MINUTE)。对字符串形式日期参数的同样支持也已添加到加号和减号运算符中,例如SELECT '2023-10-23' + INTERVAL 1 DAY。这提高了与 MySQL 的兼容性,且这是 Tableau Online 所必需的。#55960(Robert Schulze)。 - 允许 CSV 格式中的未加引号字符串包含 CR (
\r)。关闭 #39930。#56046(Kruglov Pavel)。 - 支持使用内置配置运行
clickhouse-keeper。 #56086 (Maksim Kita). - 为
queued.min.messages的最大配置值设置上限,以避免在开始从 Kafka 拉取数据时出现问题。#56121 (Stas Morozov). - 修复了 SQL 函数
minSampleSizeContinous中的拼写错误(重命名为minSampleSizeContinuous)。旧名称仍保留以确保向后兼容性。由此关闭:#56139。#56143(Dorota Szeremeta)。 - 在关闭服务器之前,打印出磁盘上损坏分片的路径。之前如果某个分片在磁盘上已损坏且服务器无法启动,几乎无法确定是哪一个分片出了问题。此问题已修复。 #56181 (Duc Canh Le)。
构建/测试/打包改进
- 如果 Docker 中的数据库已经初始化,在后续启动时就不需要再次初始化。这样可以修复在数据库未能在 1000 次尝试内加载时,容器出现无限重启的问题(与超大数据库和多节点部署相关)。#50724(Alexander Nikolaev)。
- 在 Darwin 的特殊构建任务中,会构建包含子模块在内的源代码资源。它可用于在不检出子模块的情况下构建 ClickHouse。#51435(Ilya Yatsishin)。
- 当在全局启用 AVX 指令集系列(不推荐这样做)来构建 ClickHouse 时,会出现错误。原因是 snappy 未启用
SNAPPY_HAVE_X86_CRC32。#55049(monchickey)。 - 解决从
clickhouse-server包中启动独立clickhouse-keeper的问题。#55226(Mikhail f. Shiryaev)。 - 在测试中,将 RabbitMQ 版本更新为 3.12.6。改进了 RabbitMQ 测试的日志收集。#55424(Ilya Yatsishin)。
- 调整 openssl 和 boringssl 之间的错误消息差异,以修复功能测试。#55975(MeenaRenganathan22)。
- 对 apache datasketches 使用上游仓库。#55787(Nikita Taranov)。
错误修复(官方稳定版本中用户可见的异常行为)
- 在 mutation 过程中跳过对倒排索引文件的硬链接操作 #47663(cangyin)。
- 修复了当模式包含交替(alternation)时,
match函数(正则表达式)生成错误的键条件的问题。关闭 #53222。#54696(Yakov Olkhovskiy)。 - 修复在 read-in-order 优化与 ARRAY JOIN 结合使用时出现的 'Cannot find column' 错误 #51746 (Nikolai Kochetov).
- 在查询中补充支持此前遗漏的实验性
Object(Nullable(json))子列。#54052 (zps). - 重新引入针对
accurateCastOrNull的修复 #54629(Salvatore Mesoraca)。 - 修复在未使用 AS 创建的 Distributed 表中检测列
DEFAULT的问题 #55060 (Vitaly Baranov)。 - 在 ShellCommandSource 构造函数中发生异常时进行正确清理 #55103 (Alexander Gololobov)。
- 修复在 LDAP 角色分配更新过程中的死锁 #55119(Julian Maicher)。
- 禁止为内部异常更新错误统计 #55128 (Robert Schulze).
- 修复备份过程中的死锁 #55132 (alesapin)。
- 修复 Storage Iceberg 的文件读取 #55144 (Kseniia Sumarokova).
- 修复在 set 中对多余列进行分区裁剪的问题。#55172 (Amos Bird).
- 修复在表启用自适应粒度时,对
ALTER UPDATE查询跳过索引的重新计算 #55202(Duc Canh Le)。 - 修复 fs 缓存中的后台下载问题 #55252 (Kseniia Sumarokova)。
- 在缓冲区未进行最终处理的情况下,避免压缩器中可能发生的内存泄漏 #55262 (Azat Khuzhin)。
- 修复在稀疏列上执行函数时的问题 #55275 (Azat Khuzhin).
- 修复在 SummingMergeTree 上执行 SELECT FINAL 时对 Nested 的错误合并 #55276 (Azat Khuzhin).
- 修复在基于 S3 且未启用零拷贝的 ReplicatedMergeTree 表中无法删除已分离分区(detached partition)的问题 #55309 (alesapin).
- 修复
MergeSortingPartialResultTransform中的崩溃(由于remerge之后没有 chunk)#55335(Azat Khuzhin)。 - 修复 CreatingSetsTransform 在错误处理时由于抛出共享异常对象而导致的数据竞争 #55338 (Azat Khuzhin).
- 部分修复 trash 优化 #55353(Alexey Milovidov)。
- 修复 StorageHDFS 中的泄漏问题 #55370(Azat Khuzhin)。
- 修复 cast 运算符对数组的解析 #55417 (Anton Popov)。
- 修复在查询中使用 OR 条件对虚拟列进行过滤的问题 #55418 (Azat Khuzhin).
- 修复 MongoDB 连接问题 #55419 (Nikolay Degterinsky).
- 修复 MySQL 接口中布尔值的表示方式 #55427 (Serge Klochkov).
- 修复 MySQL 文本协议中的 DateTime 格式化以及 LowCardinality(Nullable(T)) 类型的上报问题 #55479(Serge Klochkov)。
- 使
use_mysql_types_in_show_columns仅影响SHOW COLUMNS#55481 (Robert Schulze)。 - 修复栈符号解析器对
DW_FORM_ref_addr的错误解析,有时会导致崩溃的问题 #55483 (Michael Kolupaev). - 当 AsyncTaskExecutor 的 cancelBefore 中出现异常时销毁 fiber #55516 (Kruglov Pavel)。
- 修复自定义 HTTP 处理程序中查询参数无法生效的问题 #55521 (Konstantin Bogdanov).
- 修复对 Values 格式未被处理数据的检查 #55527 (Azat Khuzhin).
- 修复通过 ODBC 与 MS SQL Server 交互时出现的 “Invalid cursor state” 错误 #55558 (vdimir).
- 修复最大执行时间和 'break' 溢出模式的问题 #55577 (Alexander Gololobov).
- 修复 QueryNormalizer 在处理循环别名时导致的崩溃 #55602 (vdimir)。
- 禁用错误的优化并添加一个测试 #55609 (Alexey Milovidov).
- 合并了 #52352 和 #55621(Alexey Milovidov)。
- 添加测试以避免小数排序错误 #55662 (Amos Bird).
- 修复在 URL 不包含通配符时 S3 和 Azure 集群函数的进度条问题 #55666 (Kruglov Pavel)。
- 修复在查询中包含 OR 条件时对虚拟列进行过滤的问题(重新提交) #55678 (Azat Khuzhin).
- Iceberg 存储相关修复和改进 #55695 (Kruglov Pavel)。
- 修复 CreatingSetsTransform (v2) 中的数据竞争问题 #55786 (Azat Khuzhin).
- 当
precise_float_parsing为 true 时,将非法字符串解析为 float 会抛出异常 #55861 (李扬)。 - 如果 CTE 包含有状态函数,则禁用谓词下推 #55871 (Raúl Marín)。
- 修复 normalize ASTSelectWithUnionQuery,此前它会从查询中移除
FORMAT#55887(flynn)。 - 尝试修复 Native ORC 输入格式中的潜在段错误 #55891(Kruglov Pavel)。
- 修复在稀疏列场景下的窗口函数问题。#55895(János Benjamin Antal)。
- 修复:为 StorageNull 添加对子列的支持 #55912 (FFish)。
- 不要将可重试错误记录到 Replicated mutate/merge into 操作的错误日志中 #55944 (Azat Khuzhin)。
- 修复
SHOW DATABASES LIMIT <N>#55962 (Raúl Marín). - 修复自动生成的 Protobuf schema 中带下划线的字段 #55974 (Kruglov Pavel).
- 修复在使用非默认 scale 时的 dateTime64ToSnowflake64() 问题 #55983(Robert Schulze)。
- 修复 Arrow 字典列的输入/输出处理 #55989(Kruglov Pavel)。
- 修复 AvroConfluent 中从 Schema Registry 获取 schema 的逻辑 #55991 (Kruglov Pavel)。
- 修复在 Buffer 表上并发执行 ALTER 和 INSERT 时出现的 “Block structure mismatch” 问题 #55995 (Michael Kolupaev)。
- 修复
least_usedJBOD 策略的可用空间统计错误 #56030 (Azat Khuzhin)。 - 修复在表函数中对子查询求值时出现的标量缺失问题 #56057 (Amos Bird)。
- 在将
http_write_exception_in_output_format设置为 1 时修复错误的查询结果 #56135 (Kruglov Pavel). - 修复在设置变更后用于 JSON->JSONEachRow 回退的 schema 缓存 #56172 (Kruglov Pavel).
- 为 odbc-bridge 添加错误处理程序 #56185 (Yakov Olkhovskiy).
ClickHouse 发布 23.9,2023-09-28
向后不兼容的变更
- 从默认的 Prometheus handler 中移除
status_info配置选项以及字典状态信息。 #54090 (Alexey Milovidov). - 从代码库中移除实验性的 parts 元数据缓存。 #54215 (Alexey Milovidov).
- 默认不再启用
input_format_json_try_infer_numbers_from_strings设置,因此在 JSON 格式中将不再尝试从字符串推断数字,以避免在示例数据中包含看起来像数字的字符串时产生潜在的解析错误。 #55099 (Kruglov Pavel).
新功能
- 改进从 JSON 格式推断表结构的能力:1)现在在 JSON 格式下,通过设置
input_format_json_try_infer_named_tuples_from_objects,可以在无需启用实验性 JSON 类型的情况下,从 JSON 对象中推断具名 Tuple。此前在没有实验性 JSON 类型时,我们只能将 JSON 对象推断为 String 或 Map,现在可以推断为具名 Tuple。最终得到的 Tuple 类型将包含在表结构推断期间、从数据样本中实际读取到的所有对象键。这对于在对象结构较为规整、没有稀疏字段的前提下读取结构化 JSON 数据非常有用。该设置默认启用。2)在设置input_format_json_read_arrays_as_strings下,允许将 JSON 数组解析为类型为 String 的列。这有助于读取包含不同类型值的数组。3)在设置input_format_json_infer_incomplete_types_as_strings下,允许对样本数据中类型未知(null/[]/{})的 JSON 键使用类型 String。现在在 JSON 格式中,我们可以将任意值读取到 String 列中,并且可以通过将未知类型视为 String,避免在表结构推断时出现错误Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps,从而保证数据能够成功读取。#54427 (Kruglov Pavel). - 为远程磁盘添加了 IO 调度支持。磁盘类型
s3、s3_plain、hdfs和azure_blob_storage的存储配置现在可以包含read_resource和write_resource元素,用于指定资源名称。可以在单独的服务器配置部分resources中为这些资源配置调度策略。可以通过设置项workload为查询打标,并通过服务器配置部分workload_classifiers对其进行分类,以实现多样化的资源调度目标。更多详情参见文档。#47009(Sergei Trifonov)。新增 "bandwidth_limit" IO 调度节点类型。它允许你为通过该节点的流量指定max_speed和max_burst约束。#54618(Sergei Trifonov)。 - 新增一种基于 SSH 密钥的身份验证方式。该功能目前仅适用于原生 TCP 协议。#41109 (George Gamezardashvili)。
- 为 MergeTree 表新增了一列
_block_number。#44532。#47532(SmitaRKulkarni)。 - 在
DROP TABLE查询中添加对IF EMPTY子句的支持。#48915 (Pavel Novitskiy). - SQL 函数
toString(datetime, timezone)和formatDateTime(datetime, format, timezone)现在支持将时区作为非常量参数传入。#53680(Yarik Briukhovetskyi)。 - 为
ALTER TABLE MODIFY COMMENT添加支持。注意:很久以前一位外部贡献者曾添加过类似的功能,但该功能完全无法工作,只会让用户感到困惑。此更改关闭了 #36377。#51304(Alexey Milovidov)。注意:该命令不会在副本之间同步,因此同一张表的不同副本上可能存在不同的注释。 - 新增
GCD(即 “greatest common denominator”,最大公约数)作为一种新的数据压缩 codec。该 codec 会计算所有列值的 GCD,然后将每个值除以该 GCD。GCD codec 是一种数据预处理 codec(类似于 Delta 和 DoubleDelta),无法单独使用。它适用于整数、Decimal 和日期/时间类型的数据。GCD codec 的一个适用场景是:列值以 GCD 的倍数变化(增大或减小),例如 24 - 28 - 16 - 24 - 8 - 24(假设 GCD = 4)。#53149(Alexander Nam)。 - 新增了两个类型别名
DECIMAL(P)(作为DECIMAL(P, 0)的简写)和DECIMAL(作为DECIMAL(10, 0)的简写)。这使得 ClickHouse 与 MySQL 的 SQL 方言更加兼容。 #53328 (Val Doroshchuk)。 - 新增系统日志表
backup_log,用于跟踪所有BACKUP和RESTORE操作。#53638 (Victor Krasnov). - 新增了一个格式设置项
output_format_markdown_escape_special_characters(默认:false)。该设置控制在Markdown输出格式中,是否对!、#、$等特殊字符进行转义(即在前面加上反斜杠)。#53860 (irenjj)。 - 新增函数
decodeHTMLComponent。#54097(Bharat Nallan)。 - 在
query_log表中新增了peak_threads_usage。#54335(Alexey Gerasimchuck)。 - 为 clickhouse-client 添加对
SHOW FUNCTIONS的支持。#54337(Julia Kartseva)。 - 新增函数
toDaysSinceYearZero,其别名为TO_DAYS(用于兼容 MySQL),用于返回自0001-01-01起经过的天数(使用前推格里高利历)。#54479(Robert Schulze)。函数toDaysSinceYearZero现在支持DateTime和DateTime64类型的参数。#54856(Serge Klochkov)。 - 新增函数
YYYYMMDDtoDate、YYYYMMDDtoDate32、YYYYMMDDhhmmssToDateTime和YYYYMMDDhhmmssToDateTime64。它们将以整数编码的日期或日期时间(例如 20230911)转换为原生日期或日期时间。因此,它们与现有函数YYYYMMDDToDate、YYYYMMDDToDateTime、YYYYMMDDhhmmddToDateTime、YYYYMMDDhhmmddToDateTime64执行相反方向的转换。 #54509 (Quanfa Fu) (Robert Schulze)。 - 新增多个字符串距离函数,包括
byteHammingDistance、editDistance。 #54935 (flynn)。 - 允许在
VALID UNTIL datetime子句中为用户凭证指定到期日期,并(可选)指定时间。 #51261 (Nikolay Degterinsky). - 允许在表函数
s3、gcs、oss中使用 S3 样式的 URL。URL 会自动转换为 HTTP。例如:'s3://clickhouse-public-datasets/hits.csv'会被转换为'https://clickhouse-public-datasets.s3.amazonaws.com/hits.csv'。#54931(Yarik Briukhovetskyi)。 - 新增设置项
print_pretty_type_names,用于以更易读的方式打印 Tuple/Map/Array 等深度嵌套类型。#55095 (Kruglov Pavel)。
性能优化
- 默认启用预取以加速从 S3 读取。#53709(Alexey Milovidov)。
- 对于带 FINAL 的查询,如无必要,不要在孤立部分中隐式读取主键(PK)和 version 列。 #53919 (Duc Canh Le).
- 优化对常量键的 GROUP BY。在 https://github.com/ClickHouse/ClickHouse/pull/53529 之后,将对按
_file/_path分组的查询进行优化。#53549(Kruglov Pavel)。 - 优化对
Decimal列的排序性能。在ORDER BY包含Decimal列时,优化向MergeTree插入数据的性能。当数据已经排好序或接近排好序时,提升排序性能。#35961 (Maksim Kita)。 - 提升超大查询分析的性能。修复了 #51224。#51469(frinkr)。
- 一种优化:当从带有 GROUP BY 的子查询中进行 SELECT 时,将
COUNT(DISTINCT ...)和各种uniq变体重写为count。#52082 #52645 (JackyWoo)。 - 移除对
mmap/mremap/munmap的手动调用,将这部分工作全部交由jemalloc处理,从而略微提升性能。#52792 (Nikita Taranov)。 - 修复了在使用 NATS 时 CPU 使用率过高的问题。#54399 (Vasilev Pyotr).
- 由于我们针对带有 datetime 参数的
toString使用了单独的实现,因此在处理非 datetime 参数时可以略微提升性能,同时让部分代码更加简洁。这是对 #53680 的后续改进。#54443(Yarik Briukhovetskyi)。 - 这个 PR 不再将 JSON 元素序列化到
std::stringstream中,而是尝试将序列化结果直接写入ColumnString。 #54613 (lgbo)。 - 当通过视图访问表时,启用 ORDER BY 优化,以便按相应顺序从 MergeTree 表中读取数据。#54628(Vitaly Baranov)。
- 通过复用
GeneratorJSONPath并移除若干共享指针,对 JSON SQL 函数进行了改进。#54735 (lgbo). - Keeper 尝试对请求进行批量刷新以提升性能。#53049 (Antonio Andelic).
- 现在,
clickhouse-client在使用INFILE 'glob_expression'时会并行处理文件。解决了 #54218。#54533(Max K.)。 - 允许
IN函数使用主键,即使主键列类型与IN函数右侧的列类型不同。示例:SELECT id FROM test_table WHERE id IN (SELECT '5')。解决 #48936。#54544(Maksim Kita)。 - Hash JOIN 现在会尝试收缩内部缓冲区,使其仅消耗最大可用内存(由
max_bytes_in_join设置)的一半。#54584 (vdimir)。 - 在执行数组 JOIN 时遵循
max_block_size,以避免可能的 OOM。关闭 #54290。#54664(李扬)。 - 在
s3表函数中复用 HTTP 连接。#54812 (Michael Kolupaev). - 将
MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules中的线性查找替换为二分查找。#54869(usurai)。
实验性功能
- 现在可以通过设置
max_threads_for_annoy_index_creation来并行创建Annoy索引。#54047 (Robert Schulze)。 - 分布式表上的并行副本不再从所有副本读取数据。#54199 (Igor Nikonov)。
改进
- 允许将
MergeTree数据部件中列文件过长的文件名替换为名称的哈希值。这有助于在某些情况下避免出现File name too long错误。#50612 (Anton Popov). - 当解析元数据失败时,将
JSON格式的数据按JSONEachRow进行解析。这样即使实际格式是JSONEachRow,也可以读取扩展名为.json的文件。修复了问题 #45740。#54405(Kruglov Pavel)。 - 在执行 HTTP 查询时如发生异常,将输出有效的 JSON/XML。通过设置
http_write_exception_in_output_format来启用或禁用此行为(默认启用)。#52853 (Kruglov Pavel)。 - 视图
information_schema.tables现在新增了一个字段data_length,用于显示磁盘上数据的大致大小。该字段是运行由 Amazon QuickSight 生成的查询所必需的。#55037 (Robert Schulze)。 - MySQL 接口增加了一个对预处理语句的最小实现,刚好可以支持通过 MySQL 连接器从 Tableau Online 连接到 ClickHouse。 #54115 (Serge Klochkov)。请注意:当前的预处理语句实现非常精简,我们尚不支持参数绑定,但在这个特定的 Tableau Online 使用场景中并不需要。如果在对 Tableau Online 进行广泛测试的过程中发现问题,我们会视需要在后续补充实现。
- 在
regexp_tree字典中支持不区分大小写和 dot-all(单行)匹配模式。#50906 (Johann Gan)。 - Keeper 改进:添加
createIfNotExistsKeeper 命令。#48855(Konstantin Bogdanov)。 - 更精确的整数类型推断,修复了 #51236。#53003(Chen768959)。
- 在 MaterializedMySQL 中为字符串字面量引入了字符集解析功能。 #53220 (Val Doroshchuk)。
- 修复一个在极其罕见场景下影响很少使用的
EmbeddedRocksDB表引擎的细微问题:在执行DROP TABLE后,EmbeddedRocksDB表引擎有时不会在 NFS 上正确关闭文件。#53502(Mingliang Pan)。 RESTORE TABLE ON CLUSTER必须在各个主机上创建具有匹配 UUID 的复制表。否则,ZooKeeper 路径中的{uuid}宏在 RESTORE 之后将无法正常工作。此 PR 实现了这一点。#53765 (Vitaly Baranov)。- 新增恢复设置
restore_broken_parts_as_detached:如果为 true,RESTORE 过程在恢复时遇到损坏的 part 不会停止,而是会将所有损坏的 part 复制到带有前缀broken-from-backup'的detached目录中。如果为 false,RESTORE 过程会在遇到的第一个损坏的 part(如果存在)时停止。默认值为 false。 #53877 (Vitaly Baranov). - 将
elapsed_ns字段添加到 HTTP 头部 X-ClickHouse-Progress 和 X-ClickHouse-Summary 中。#54179 (joelynch)。 - 在 keeper-client 中实现
reconfig(https://github.com/ClickHouse/ClickHouse/pull/49450)、sync和exists命令。#54201(pufit)。 clickhouse-local和clickhouse-client现在支持多次指定--query参数,例如:./clickhouse-client --query "SELECT 1" --query "SELECT 2"。与./clickhouse-client --multiquery "SELECT 1;S ELECT 2"相比,这种用法更直观,在脚本中使用时也更容易一些(例如queries.push_back('--query "$q"')),并且与现有参数--queries-file的行为更加一致(例如./clickhouse client --queries-file queries1.sql --queries-file queries2.sql)。#54249(Robert Schulze)。- 为
formatReadableTimeDelta添加亚秒级精度。#54250 (Andrey Zvonov)。 - 默认启用
allow_remove_stale_moving_parts。#54260 (vdimir)。 - 修复使用缓存中的计数值的问题,并改进从归档读取时的进度条。#54271 (Kruglov Pavel).
- 通过 SSO 添加对 S3 凭证的支持。要定义一个与 SSO 一起使用的配置文件,请设置
AWS_PROFILE环境变量。#54347(Antonio Andelic)。 - 在输入格式中,为嵌套类型 Array/Tuple/Map 支持使用 NULL 作为默认值。修复 #51100。#54351(Kruglov Pavel)。
- 允许从 Arrow/Parquet 格式中读取一些非常规配置的数据块。 #54370 (Arthur Passos).
- 为
stddevPop函数添加STD别名以提高对 MySQL 的兼容性。关闭 #54274。#54382(Nikolay Degterinsky)。 - 添加
addDate函数以兼容 MySQL,并添加subDate以保持一致性。参考 #54275。#54400(Nikolay Degterinsky)。 - 将
modification_time添加到system.detached_parts中。 #54506 (Azat Khuzhin). - 新增了一个设置项
splitby_max_substrings_includes_remaining_string,用于控制当函数splitBy*()的参数max_substring> 0 时,结果数组中是否包含剩余字符串(如有)(即 Python/Spark 语义),或不包含。默认行为不变。#54518 (Robert Schulze)。 - 改进了对
Int64/UInt64字段的整数类型推断,这是对 #53003 的延续。现在它也适用于嵌套类型(例如数组的数组)以及map/tuple等函数。相关 Issue:#51236。#54553(Kruglov Pavel)。 - 新增了数组与标量进行乘法、除法和取模的运算。支持任意方向的写法,例如
5 * [5, 5]和[5, 5] * 5都是可行的。#54608 (Yarik Briukhovetskyi)。 - 在
keeper-client的rm命令中添加可选的version参数,以支持更安全地删除。 #54708 (János Benjamin Antal). - 禁止通过 systemd 杀死服务器进程(在使用 Buffer 表时,这可能会导致数据丢失)。 #54744 (Azat Khuzhin).
- 在系统表
system.functions中新增字段is_deterministic,用于指示某个函数在两次调用(在输入完全相同的情况下)之间,其结果是否保持不变。#54766 #55035 (Robert Schulze)。 - 使 schema
information_schema中的视图与 MySQL 中的对应视图更加兼容(即对其进行了修改和扩展),以便 Tableau Online 能够连接到 ClickHouse。具体包括:1. 将字段information_schema.tables.table_type的类型从 Enum8 修改为 String。2. 在视图information_schema.table中新增字段table_comment和table_collation。3. 新增视图information_schema.key_column_usage和referential_constraints。4. 将information_schema视图中的大写别名替换为具体的大写列。 #54773 (Serge Klochkov)。 - 现在,当用户尝试缓存包含非确定性函数(例如
now、randomString和dictGet)的查询结果时,查询缓存会返回错误。与之前静默地不缓存结果的行为相比,这样可以减少用户的困惑和意外。#54801(Robert Schulze)。 - 禁止在
file/s3/url/... 等存储中使用 materialized/ephemeral/alias 等特殊列,并修复了从文件插入到 ephemeral 列的问题。关闭 #53477。#54803(Kruglov Pavel)。 - 备份元数据收集支持更多配置选项。#54804 (Vitaly Baranov).
clickhouse-local的日志文件(如果通过 --server_logs_file 选项启用)现在会像clickhouse-server一样,为每一行加上时间戳、线程 ID 等前缀。#54807(Michael Kolupaev)。system.merge_tree_settings表中的字段is_obsolete—— 现在对于已废弃的 MergeTree 设置,该字段取值为 1。此前只有说明指出该设置已废弃。#54837 (Robert Schulze)。- 允许在使用 interval 字面量时使用复数形式。
INTERVAL 2 HOURS应与INTERVAL 2 HOUR等价。#54860 (Jordi Villar)。 - 现在始终允许在创建 projection 时使用
Nullable主键。此更改修复了 #54814。#54895(Amos Bird)。 - 在因连接重置而失败时重试备份的 S3 操作。#54900(Vitaly Baranov)。
- 当某个设置项的最大值小于最小值时,使异常消息更加精确。 #54925 (János Benjamin Antal).
LIKE、match以及其他正则表达式匹配函数现在在遇到包含非 UTF-8 子串的模式时会回退到二进制匹配,从而允许使用此类模式进行匹配。例如,可以使用string LIKE '\xFE\xFF%'来检测 BOM。修复了 #54486。#54942(Alexey Milovidov)。- 新增了
ContextLockWaitMicrosecondsprofile event。#55029 (Maksim Kita)。 - Keeper 会动态调整日志级别。#50372 (helifu)。
- 新增函数
timestamp以兼容 MySQL。关闭了 #54275。#54639(Nikolay Degterinsky)。
构建/测试/打包改进
- 将 ClickHouse 官方构建和持续集成构建所使用的编译器从 Clang 16 升级到 17。 #53831 (Robert Schulze).
- 重新生成了用于查找的 tld 数据(
tldLookup.generated.cpp)。 #54269 (Bharat Nallan). - 移除了多余的
clickhouse-keeper-client符号链接。 #54587 (Tomas Barton). - 使用
/usr/bin/env来解析 bash 路径——现在支持 Nix OS。 #54603 (Fionera). - 在 CMake 中新增了
PROFILE_CPU选项,用于在不使用 DWARF 调用图的情况下执行perf record。 #54917 (Maksim Kita). - 如果链接器不是 LLD,则以致命错误终止。 #55036 (Alexey Milovidov).
- 将处理(编码/解码)base64 值的库从 Turbo-Base64 替换为 aklomp-base64。两者在 x86 和 ARM 上都使用 SIMD 加速,但原因如下:1. 后者的许可证(BSD-2)对 ClickHouse 更有利,而 Turbo-Base64 在此期间已切换为 GPL-3;2. aklomp-base64 在 GitHub 上的 star 数更多,看起来更具前景;3. aklomp-base64 拥有略微更友好的 API(虽然这在某种程度上是主观的);4. aklomp-base64 不需要我们通过 hack 的方式绕过 bug(例如非线程安全的初始化)。注意:aklomp-base64 会拒绝未填充(unpadded)的 base64 值,而 Turbo-Base64 会尽力进行解码。RFC-4648 对填充是否为必需保持开放态度,但根据具体上下文,这一点可能会导致行为变化,需要留意。 #54119 (Mikhail Koviazin).
错误修复(官方稳定版本中用户可见的异常行为)
- 修复在零拷贝复制下 REPLACE/MOVE PARTITION 的行为(注意:“zero-copy replication” 是一项实验性功能) #54193 (Alexander Tokmakov).
- 使用硬链接修复 zero-copy 锁(注意:“zero-copy replication” 是一个实验性特性) #54859 (Alexander Tokmakov)。
- 修复 zero copy 产生的垃圾数据(注意:"zero-copy replication" 是实验性功能) #54550 (Alexander Tokmakov)。
- 以毫秒为单位传递 HTTP 重试超时时间(之前的实现不正确)。#54438(Duc Canh Le)。
- 修复使用
CapnProto/Protobuf的 OUTFILE 产生的误导性错误信息 #52870 (Kruglov Pavel)。 - 修复在启用并行副本且使用 LIMIT 时的汇总报告问题 #53050 (Raúl Marín).
- 修复从/到 S3 执行 BACKUP 时的限流问题(在未使用原生复制的情况下),以及其他部分的相关问题 #53336 (Azat Khuzhin)。
- 修复在复制整个目录时的 I/O 限流问题 #53338 (Azat Khuzhin)。
- 修复:将操作移动到
prewhere条件时可能会导致列丢失 #53492(Yakov Olkhovskiy)。 - 修复了在替换为字节完全相同的片段时出现的内部错误 #53735 (Pedro Riera)。
- 修复:现在要求参与插值表达式的列为必需列 #53754 (Yakov Olkhovskiy).
- 修复集群发现的初始化,并在配置中设置故障点 #54113 (vdimir).
- 修复
accurateCastOrNull的问题 #54136(Salvatore Mesoraca)。 - 修复在使用 FINAL 修饰符时可为 NULL 的主键问题 #54164 (Amos Bird)。
- 修复了一个错误,该错误会在存在重复数据时阻止向复制的物化视图中插入新数据。 #54184 (Pedro Riera).
- 修复:允许布隆过滤器支持
IPv6#54200(Yakov Olkhovskiy)。 - 修复
IPv4潜在的类型不匹配问题 #54212 (Bharat Nallan)。 - 修复针对重新创建索引的
system.data_skipping_indices#54225 (Artur Malchanau). - 修复 multiple join rewriter v2 的命名冲突 #54240 (Tao Wang).
- 修复 join 操作后
system.errors中的意外错误 #54306 (vdimir)。 - 修复
isZeroOrNull(NULL)#54316 (flynn)。 - 修复:在 Distributed 表上使用并行副本且
prefer_localhost_replica= 1 时的问题 #54334 (Igor Nikonov)。 - 修复垂直合并和 ReplacingMergeTree 的逻辑错误,并优化清理过程 #54368 (alesapin).
- 修复
s3表函数中可能出现的URI contains invalid characters错误 #54373(Kruglov Pavel)。 - 修复
arrayExists函数在 AST 优化中的段错误 #54379 (Nikolay Degterinsky). - 在
analysisOfVariance函数中于执行加法前进行溢出检查 #54385(Antonio Andelic)。 - 在
removeSharedRecursive中复现并修复此 bug #54430 (Sema Checherinda)。 - 修复在 PREWHERE 和 FINAL 中使用 SimpleAggregateFunction 时可能出现的不正确结果 #54436 (Azat Khuzhin)。
- 修复在未使用 analyzer 时使用
indexHint过滤数据分片的问题 #54449 (Azat Khuzhin). - 修复使用标准化状态的聚合投影 #54480 (Amos Bird)。
clickhouse-local:multiquery 参数相关更新 #54498 (CuiShuoGuo).clickhouse-local现已支持--database命令行参数 #54503 (vdimir)。- 修复在禁用
input_format_with_names_use_header时,-WithNames格式中可能出现的解析错误 #54513 (Kruglov Pavel)。 - 修复在罕见情况下可能出现的 CHECKSUM_DOESNT_MATCH 错误 #54549 (alesapin)。
- 修复对已排序结果执行 UNION ALL 时的排序行为 #54564 (Vitaly Baranov).
- 修复 Keeper 中快照安装的问题 #54572(Antonio Andelic)。
- 修复
ColumnUnique中的竞态条件 #54575 (Nikita Taranov). - Annoy/Usearch index:修复在使用默认值进行构建时出现的 LOGICAL_ERROR #54600(Robert Schulze)。
- 修复
ColumnDecimal的序列化 #54601(Nikita Taranov)。 - 修复 *Cluster 函数在列名包含空格时的模式推断问题 #54635(Kruglov Pavel)。
- 在存在默认值和显式插入列的情况下,修复从插入表获取结构的行为 #54655 (Kruglov Pavel).
- 修复:避免将可能包含交替(alternation)的正则匹配表达式用作键条件。#54696 (Yakov Olkhovskiy)。
- 修复带纵向合并和清理的 ReplacingMergeTree #54706 (SmitaRKulkarni)。
- 修复在使用 ORDER BY 时虚拟列值不正确的问题 #54811 (Michael Kolupaev).
- 修复在非 analyzer 情况下使用 indexHint 过滤数据分片的问题 #54825 #54449 (Azat Khuzhin)。
- 修复 Keeper 在关闭过程中的段错误 #54841 (Antonio Andelic).
- 修复 MaterializedPostgreSQL 中的
Invalid number of rows in Chunk错误 #54844 (Kseniia Sumarokova). - 将已废弃的格式设置移至单独的部分 #54855(Kruglov Pavel)。
- 在分区键被修改时重建
minmax_count_projection#54943 (Amos Bird)。 - 修复函数
if中对ColumnVector<Int128>的错误类型转换 #55019(Kruglov Pavel)。 - 防止附加来自具有不同投影或索引的表的数据片段 #55062(János Benjamin Antal)。
- 当子查询结果为空时,在标量结果映射中存储 NULL #52240 (vdimir).
- 修复
FINAL在罕见情况下产生无效读取范围的问题 #54934(Nikita Taranov)。 - 修复:在不进行 Keeper 重试的情况下执行 insert quorum #55026(Igor Nikonov)。
- 修复使用可为空类型的简单状态 #55030(Pedro Riera)。
ClickHouse 发行版 23.8 LTS,2023-08-31
向后不兼容的更改
- 如果动态磁盘配置了名称,应在 disk 函数参数中指定为
disk = disk(name = 'disk_name', ...)。在之前的版本中,可以指定为disk = disk_<disk_name>(...),该方式现已不再支持。#52820(Kseniia Sumarokova)。 - 当使用
--concurrency大于 1 调用时,clickhouse-benchmark将并行建立连接。之前,如果从欧洲向美国发起 1000 个并发连接,它几乎无法使用。现在已修正对高延迟连接的 QPS 计算。向后不兼容更改:移除了clickhouse-benchmark的 JSON 输出选项。如果你使用过该选项,可以改为从system.query_log中以 JSON 格式提取数据作为替代方案。#53293(Alexey Milovidov)。 - 从
system.text_log中移除了microseconds列,从system.metric_log中移除了milliseconds列,因为在存在event_time_microseconds列的情况下,这些列是冗余的。#53601(Alexey Milovidov)。 - 弃用元数据缓存功能。该功能是实验性的,而且我们从未使用过。该功能存在风险:#51182。移除
system.merge_tree_metadata_cache系统表。元数据缓存在当前版本中仍然可用,但很快会被移除。由此关闭 #39197。#51303(Alexey Milovidov)。 - 在 TLS 连接中禁用对 3DES 的支持。#52893(Kenji Noguchi)。
新功能
- 支持直接从 zip/7z/tar 压缩包导入。例如:
file('*.zip :: *.csv')。#50321(nikitakeba)。 - 为
trace_type = 'MemorySample'的system.trace_log添加列ptr。该列包含分配的内存地址。新增函数flameGraph,可构建用于展示已分配但尚未释放内存的火焰图(flamegraph)。重新实现 #38391。#45322 (Nikolai Kochetov)。 - 新增了表函数
azureBlobStorageCluster。其支持的功能集与表函数s3Cluster非常相似。#50795 (SmitaRKulkarni)。 - 允许在不指定表名的情况下使用
cluster、clusterAllReplicas、remote和remoteSecure,见 issue #50808。#50848(Yangkuan Liu)。 - 一张用于监控 Kafka 消费者的系统表。#50999(Ilya Golshtein)。
- 新增
max_sessions_for_user设置。#51724(Alexey Gerasimchuck)。 - 新增函数
toUTCTimestamp/fromUTCTimestamp,其作用与 Spark 的to_utc_timestamp/from_utc_timestamp相同。#52117 (KevinyhZou)。 - 新增函数
structureToCapnProtoSchema/structureToProtobufSchema,用于将 ClickHouse 表结构转换为 CapnProto/Protobuf 格式的 schema。允许在没有外部格式 schema 的情况下,使用基于表结构自动生成的 schema(由设置format_capn_proto_use_autogenerated_schema/format_protobuf_use_autogenerated_schema控制)以 CapnProto/Protobuf 格式读写数据。允许在读写时通过设置output_format_schema导出自动生成的 schema。 #52278 (Kruglov Pavel). system.query_log中新增字段query_cache_usage,用于显示查询缓存是否被使用以及具体的使用方式。#52384(Robert Schulze)。- 新增了函数
startsWithUTF8和endsWithUTF8。#52555 (李扬)。 - 在 TSV/CustomSeparated/JSONCompactEachRow 中允许列数可变,并使模式推断能够在列数可变的情况下正常工作。新增设置
input_format_tsv_allow_variable_number_of_columns、input_format_custom_allow_variable_number_of_columns、input_format_json_compact_allow_variable_number_of_columns。 #52692 (Kruglov Pavel)。 - 新增了
SYSTEM STOP/START PULLING REPLICATION LOG查询语句(用于测试ReplicatedMergeTree)。 #52881 (Alexander Tokmakov)。 - 允许在发起端的变更(mutation)中执行常量的非确定性函数。 #53129 (Anton Popov).
- 新增输入格式
One,该格式不读取任何数据,并始终返回单行结果,其中包含名为dummy、类型为UInt8、值为0的列,类似于system.one。它可以与虚拟列_file/_path配合使用,在不读取任何数据的情况下,列出 file/S3/URL/HDFS 等表函数中的文件。#53209(Kruglov Pavel)。 - 添加
tupleConcat函数。修复 #52759。#53239(Nikolay Degterinsky)。 - 支持
TRUNCATE DATABASE操作。#53261(Bharat Nallan)。 - 添加
max_threads_for_indexes设置,用于限制主键处理所使用的线程数量。#53313 (jorisgio)。 - 重新添加 SipHash 带密钥函数。 #53525 (Salvatore Mesoraca).
- (#52755 , #52895) 新增了函数
arrayRotateLeft、arrayRotateRight、arrayShiftLeft、arrayShiftRight。 #53557 (Mikhail Koviazin)。 - 将列
name添加到system.clusters,作为cluster的别名。#53605 (irenjj)。 - 高级仪表板现在支持批量编辑功能(保存/加载)。 #53608 (Alexey Milovidov).
- 高级仪表盘现在支持将图表最大化并调整其位置。#53622(Alexey Milovidov)。
- 添加了对数组加减运算的支持:
[5,2] + [1,7]。由于逐元素乘法与参数的点积(标量积)之间容易混淆,尚未实现除法和乘法。从而关闭了 #49939。#52625(Yarik Briukhovetskyi)。 - 添加对将字符串字面量用作表名的支持。修复 #52178。#52635(hendrik-m)。
实验特性
- 新增表引擎
S3Queue,用于从 S3 流式导入数据。修复 #37012。#49086(s-kat)。尚未准备好使用,请勿使用。 - 启用在分布式表上从副本并行读取。相关 issue:#49708。#53005(Igor Nikonov)。
- 为 HNSW 作为近似最近邻搜索方法添加实验性支持。#53447(Davit Vardanyan)。当前仅供继续完善该实现的开发者使用,请勿使用。
性能优化
- Parquet 过滤下推。即在读取 Parquet 文件时,会基于 WHERE 条件以及每一列的最小/最大值跳过部分行组(文件块)。尤其是当文件按某一列大致排序时,对该列上较短范围进行过滤的查询会快得多。 #52951 (Michael Kolupaev).
- 通过在 Parquet 中将多个小行组批量合并来优化读取小行组的性能。修复了 #53069。#53281(Kruglov Pavel)。
- 优化了大多数输入格式下对文件执行
count计算的性能。关闭 #44334。#53637(Kruglov Pavel)。 - 在使用
url/file/hdfs表函数读取之前,先按文件/路径进行过滤。#53529 (Kruglov Pavel). - 为 AArch64、PowerPC、SystemZ 和 RISC-V 启用 JIT 编译。#38217 (Maksim Kita)。
- 新增设置
rewrite_count_distinct_if_with_count_distinct_implementation,以便使用count_distinct_implementation重写countDistinctIf。关闭 #30642。#46051 (flynn)。 - 在合并前对转换过程进行并行化,以加速
uniq和uniqExact聚合函数状态的合并。#50748(Jiebin Sun)。 - 在存在大量可变长度键的场景下,优化可为空字符串键的聚合性能。#51399(LiuNeng)。
- 在 Analyzer 中添加一个用于基于 preimage 的时间过滤优化的 pass。在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核,160 线程)上对 SSB 进行的性能实验表明,当启用实验性 Analyzer 时,此更改可使几何平均 QPS(geomean QPS)提升约 8.5%。#52091(Zhiguo Zhou)。
- 当
uniqExact(COUNT DISTINCT)函数中所有哈希集合均为单级时,优化合并过程。#52973 (Jiebin Sun)。 Join表引擎:不再为所有列克隆整个哈希连接数据结构。 #53046 (Duc Canh Le).- 实现无需依赖 Apache Arrow 库的原生
ORC输入格式,以提升性能。 #53324 (李扬)。 - 该仪表板会指示服务器压缩数据,这在时间范围较长且网络连接较慢的情况下非常有用。比如,一个包含 86400 个点的图表,在未压缩时大小为 1.5 MB,而使用
br压缩后仅为 60 KB。#53569(Alexey Milovidov)。 - 更高效利用线程池执行 BACKUP 和 RESTORE 操作。#53649 (Nikita Mikhaylov).
- 在启动时并行加载文件系统缓存元数据。可通过缓存配置项
load_metadata_threads(默认为 1)进行配置。相关问题:#52037。#52943(Kseniia Sumarokova)。 - 改进
move_primary_key_columns_to_end_of_prewhere。 #53337 (Han Fei). - 此改动优化了与 ClickHouse Keeper 的交互方式。此前,调用方可能会多次注册相同的 watch 回调。在这种情况下,每个条目都会消耗内存,并且同一个回调会被调用多次,这并没有太大意义。为避免这种情况,调用方需要自行实现逻辑以避免多次添加相同的 watch。通过此更改,如果通过
shared_ptr传递 watch 回调,则去重会在内部自动完成。#53452(Alexander Gololobov)。 - 对 file/s3/url/hdfs/azure 函数所处理文件的行数进行缓存,用于执行计数操作。可以通过设置
use_cache_for_count_from_files(默认启用)来开启或关闭该缓存。本功能是对 https://github.com/ClickHouse/ClickHouse/pull/53637 的延续。#53692(Kruglov Pavel)。 - 更精细的线程管理可使 S3 表函数在处理大量文件时的速度提升 25% 以上。 #53668 (pufit).
改进
- 添加
stderr_reaction配置项,用于控制当外部命令的 stderr 有输出数据时的处理行为(none、log 或 throw)。这有助于简化外部命令的调试。#43210 (Amos Bird)。 - 向
system part_log及相应的合并表中添加partition列。#48990(Jianfei Hu)。 - (索引)uncompressed/mark、mmap 和 query 缓存的大小现在可以在运行时动态调整(无需重启服务器)。 #51446 (Robert Schulze)。
- 使用复杂键创建字典时,将自动选择“complex key”布局变体。#49587(xiebin)。
- 添加设置
use_concurrency_control,以便更好地测试新的并发控制功能。#49618 (Alexey Milovidov)。 - 为拼写错误的数据库和表名新增了建议修正。#49801 (Yarik Briukhovetskyi)。
- 在通过 Gluten 从 HDFS 读取小文件时,我们发现相比直接使用 Spark 查询会耗费更多时间。对此我们做了一些改进。#50063 (KevinyhZou)。
- 会话过期后产生了太多无用的错误日志,我们对此并不满意。#50171 (helifu)。
- 引入带有时间限制的备用 ZooKeeper 会话。修复了 system.zookeeper_connection 表中针对 DNS 地址的
index列。#50424 (Anton Kozlov)。 - 添加在达到 max_partitions_per_insert_block 上限时记录日志的功能。 #50948 (Sean Haynes).
- 向 clickhouse-keeper-client 添加了一系列自定义命令(主要用于简化 ClickHouse 调试)。#51117 (pufit).
- 更新了在
azureBlobStorage表函数中对连接字符串的检查逻辑,因为包含 "sas" 的连接字符串并不总是以默认终结点开头;同时在将 Azure 容器添加到 URL 后,更新了连接 URL,使其在其中包含 "sas" 令牌。#51141 (SmitaRKulkarni)。 - 修正
full_sorting_mergeJOIN 算法中关于集合过滤的描述。#51329 (Tanay Tummalapalli). - 修复了在
max_block_size非常大时Aggregator的内存消耗问题。#51566 (Nikita Taranov). - 添加了
SYSTEM SYNC FILESYSTEM CACHE命令。它会比较文件系统缓存的内存状态与磁盘上的状态,并在必要时纠正内存状态。只有在你对磁盘上的数据进行手动修改时才需要这样做,而这类操作是强烈不推荐的。#51622(Kseniia Sumarokova)。 - 尝试为 ClickHouse 实现一个通用代理解析器,同时保持与现有 S3 存储配置中的代理解析器向后兼容。#51749 (Arthur Passos).
- 支持在 file/s3/hdfs/url/azureBlobStorage 表函数中读取 tuple 的子列。#51806 (Kruglov Pavel)。
- 函数
arrayIntersect现在会按照第一个参数中元素的顺序返回结果。关闭了 #27622。#51850(Yarik Briukhovetskyi)。 - 新增查询,可在指定的访问存储中创建/删除访问实体,或在不同的访问存储之间移动访问实体。 #51912 (pufit).
- 使
ALTER TABLE FREEZE查询在 Replicated 数据库引擎中不再被复制。#52064 (Mike Kot)。 - 在发生异常关闭时,支持刷新 system 表。#52174 (Alexey Gerasimchuck)。
- 修复
s3表函数无法与预签名 URL 一起使用的问题。关闭 #50846。#52310(chen)。 - 在
system.events和system.metrics表中添加列name,作为event和metric的别名。修复 #51257。#52315 (chen)。 - 在解析器中新增对语法
CREATE UNIQUE INDEX的支持,作为空操作以提升 SQL 兼容性,但UNIQUE索引本身仍不受支持。可将create_index_ignore_unique设置为 1,以在查询中忽略UNIQUE关键字。#52320(Ilya Yatsishin)。 - 在部分 Kafka 引擎设置项中新增对预定义宏(
{database}和{table})的支持,例如 topic、consumer、client_id 等。#52386(Yury Bogomolov)。 - 在备份/恢复期间禁用对文件系统缓存的更新。备份/恢复期间不应更新文件系统缓存,因为这似乎只会在没有任何收益的情况下拖慢整个过程(因为
BACKUP命令可能会读取大量数据,把所有数据放入文件系统缓存又立刻将其驱逐毫无意义)。#52402(Vitaly Baranov)。 - S3 endpoint 的配置允许从根路径使用它,并在需要时自动添加“/”。 #47809。 #52600 (xiaolei565)。
- 对于 clickhouse-local,允许使用位置参数选项并设置全局 UDF 配置(user_scripts_path 和 user_defined_executable_functions_config)。#52643(Yakov Olkhovskiy)。
system.asynchronous_metrics现在包含指标 "QueryCacheEntries" 和 "QueryCacheBytes",用于查看查询缓存。#52650 (Robert Schulze)。- 新增支持在
BACKUP语句的SETTINGS子句中使用s3_storage_class参数,将备份写入 S3。 #52658 (Roman Vasin). - 添加实用工具
print-backup-info.py,用于解析备份元数据文件并输出备份相关信息。 #52690 (Vitaly Baranov). - 关闭 #49510。目前我们的数据库名和表名是区分大小写的,但 BI 工具在查询
information_schema时,有时使用小写,有时使用大写。为此我们提供了小写的information_schema数据库,其中包含小写的表,例如information_schema.tables,以及大写的INFORMATION_SCHEMA数据库,其中包含大写的表,例如INFORMATION_SCHEMA.TABLES。但有些工具会查询INFORMATION_SCHEMA.tables和information_schema.TABLES。提出的解决方案是在小写和大写的information_schema数据库中,同时各自复制一份小写和大写的表。#52695(Yarik Briukhovetskyi)。 CHECK TABLE查询具有更好的性能和易用性(支持进度更新并可取消)。#52745 (vdimir).- 通过将
modulo、intDiv、intDivOrZero按元素应用到元组的各个成员上,为元组添加对这些函数的支持。#52758 (Yakov Olkhovskiy). - 在 clickhouse-client 中,在搜索
xml之后也搜索默认的yaml和yml配置。#52767(Alexey Milovidov)。 - 当合并到根节点不是 'clickhouse' 的配置时,根节点名称不同的配置会被直接忽略,而不会抛出异常。 #52770 (Yakov Olkhovskiy).
- 现在可以为通过采样内存分析器跟踪的内存分配指定最小(
memory_profiler_sample_min_allocation_size)和最大(memory_profiler_sample_max_allocation_size)大小。#52779(alesapin)。 - 添加
precise_float_parsing设置,用于在快速/精确两种浮点数解析方法之间切换(fast/precise)。#52791 (Andrey Zvonov)。 - 对
clickhouse-keeper(符号链接)使用与clickhouse-keeper(可执行文件)相同的默认路径。 #52861 (Vitaly Baranov)。 - 改进表函数
remote的错误信息。关闭 #40220。#52959(jiyoungyoooo)。 - 在
RESTORE查询的SETTINGS子句中增加了指定自定义存储策略的功能。#52970 (Victor Krasnov)。 - 在备份操作中新增了对 S3 请求进行限流的能力(
BACKUP和RESTORE命令现在会遵守s3_max_[get/put]_[rps/burst])。 #52974 (Daniel Pozo Escalona)。 - 新增设置项,可在管理使用复制存储的用户自定义函数或访问控制实体时,忽略查询中的 ON CLUSTER 子句。 #52975 (Aleksei Filatov).
- 在 JOIN 步骤中支持 EXPLAIN actions。 #53006 (Maksim Kita).
- 使
hasTokenOrNull和hasTokenCaseInsensitiveOrNull在needle为空时返回 null。#53059 (ltrk2)。 - 允许限制文件系统缓存的可用路径,这在动态磁盘场景中尤为有用。如果在服务器配置中指定了
filesystem_caches_path,则所有文件系统缓存的路径都将被限制在该目录中。比如,如果缓存配置中的path是相对路径,则会被放入filesystem_caches_path中;如果缓存配置中的path是绝对路径,则要求其必须位于filesystem_caches_path内部。如果在配置中未指定filesystem_caches_path,则行为将与早期版本相同。#53124(Kseniia Sumarokova)。 - 添加了一系列自定义命令(主要是为了让 ClickHouse 调试更简单)。 #53127 (pufit).
- 在模式推断时添加包含文件名的诊断信息——在使用 glob 通配符处理多个文件时会很有帮助。#53135 (Alexey Milovidov)。
- 如果第二连接无法创建会话,客户端将使用主连接加载建议。 #53177 (Alexey Gerasimchuck).
- 为
SYSTEM STOP/START LISTEN QUERIES [ALL/DEFAULT/CUSTOM]查询添加对 EXCEPT 子句的支持,例如SYSTEM STOP LISTEN QUERIES ALL EXCEPT TCP, HTTP。#53280 (Nikolay Degterinsky)。 - 将
max_concurrent_queries的默认值从 100 修改为 1000。如果查询本身开销不大、主要是在等待网络,那么存在大量并发查询是可以的。注意:不要将并发查询数与 QPS 混淆;例如,ClickHouse 服务器在并发查询数少于 100 的情况下,也可以达到每秒数万次查询(QPS)。#53285(Alexey Milovidov)。 - 限制后台分区优化合并任务的并发数量。 #53405 (Duc Canh Le).
- 新增了设置项
allow_moving_table_directory_to_trash,在复制或恢复Replicated数据库时,可以忽略Directory for table data already exists错误。#53425 (Alexander Tokmakov). - 如果将服务器设置
asynchronous_metrics_update_period_s和asynchronous_heavy_metrics_update_period_s错误配置为 0,系统现在会优雅地失败,而不是终止应用程序。#53428 (Robert Schulze)。 - 现在,当重新加载配置时,ClickHouse 服务器会遵守通过 cgroups 修改的内存限制。#53455(Robert Schulze)。
- 新增选项,可在执行
DETACH、DROP或服务器关闭时禁用 Distributed 表的刷新操作。 #53501 (Azat Khuzhin). domainRFC函数现在支持以方括号形式表示的 IPv6 地址。 #53506 (Chen768959).- 将用于备份的 S3 CopyObject 请求的超时时间设置得更长。#53533 (Michael Kolupaev).
- 新增了服务端设置
aggregate_function_group_array_max_element_size。该设置用于在序列化时限制groupArray函数生成的数组大小。默认值为16777215。#53550(Nikolai Kochetov)。 - 为了提高与 MySQL 的兼容性,添加了
SCHEMA作为DATABASE的别名。#53587 (Daniël van Eeden)。 - 为
system数据库中的表添加异步指标。例如,TotalBytesOfMergeTreeTablesSystem。此更改关闭了 #53603。#53604(Alexey Milovidov)。 - Play UI 和 Dashboard 中的 SQL 编辑器将不再使用 Grammarly。#53614 (Alexey Milovidov)。
- 作为专家级配置项,现在可以:(1) 配置 [index] 标记/未压缩缓存的
size_ratio(即受保护队列的相对大小),(2) 配置索引标记缓存和索引未压缩缓存的缓存策略。#53657(Robert Schulze)。 - 在 TCPHandler 中为查询数据包添加了客户端信息校验。#53673(Alexey Gerasimchuck)。
- 在与 Microsoft Azure 交互时,如遇网络错误,将重试加载数据分片。 #53750 (SmitaRKulkarni).
- 为异常提供堆栈跟踪,物化视图中的异常将会被向上传播。 #53766 (Ilya Golshtein).
- 如果未指定主机名或端口,Keeper 客户端会尝试在 ClickHouse 的 config.xml 中查找连接字符串。#53769 (pufit)。
- 添加 profile event
PartsLockMicroseconds,用于显示在 MergeTree 表引擎系列中持有数据部分锁的时长(微秒)。#53797(alesapin)。 - 使 keeper 中 RAFT 的重连次数限制可配置。通过该配置,如果当前连接中断,可以帮助 keeper 更快地与对等节点重建连接。#53817(Pengyuan Bian)。
- 在表定义中忽略外键以提高与 MySQL 的兼容性,这样用户就不需要重写其 SQL 中的外键部分,参见 #53380。#53864(jsc0218)。
构建/测试/打包改进
- 不要向动态链接器导出 ClickHouse 可执行文件中的符号。这可能会修复 #43933。#47475(Alexey Milovidov)。
- 在 clickhouse-server 软件包中添加
clickhouse-keeper-client符号链接。#51882 (Mikhail f. Shiryaev). - 将 https://github.com/elliotchance/sqltest 添加到 CI 中,以报告对 SQL 2016 标准的符合性。#52293(Alexey Milovidov)。
- 将 PRQL 升级到 0.9.3 版本。#53060 (Maximilian Roos).
- CI 检查生成的系统表会导出到 ClickHouse Cloud。 #53086 (Alexey Milovidov).
- 编译器的性能分析数据(
-ftime-trace)已上传到 ClickHouse Cloud。#53100(Alexey Milovidov)。 - 提升 Debug 和 Tidy 构建速度。#53178(Alexey Milovidov)。
- 通过清理掉大量无用内容来加快构建速度。其中一个经常被引用的头文件被 boost “污染”了。#53180(Alexey Milovidov)。
- 进一步清理无用内容。#53182 (Alexey Milovidov).
- 函数
arrayAUC之前使用了大量 C++ 模板,现已去掉这些模板。#53183(Alexey Milovidov)。 - 无论是否使用 ccache,某些编译单元都会被重新构建。已找到并修复问题根源。#53184 (Alexey Milovidov).
- 将编译器的性能分析数据(
-ftime-trace)上传到 ClickHouse Cloud,这是继 #53100 之后的第二次尝试。#53213(Alexey Milovidov)。 - 在有状态测试中将 CI 产生的日志导出到 ClickHouse Cloud。 #53351 (Alexey Milovidov).
- 在压测中从 CI 导出日志。#53353 (Alexey Milovidov)。
- 在 fuzzer 中从 CI 导出日志。 #53354 (Alexey Milovidov).
- 在
clickhouse start命令中保留环境变量。修复了 #51962。#53418(Mikhail f. Shiryaev)。 - #53418 的后续更新。对 install_check.py 做了小幅改进,新增测试以验证在执行
init.d start时能将 ENV 环境变量正确传递给主进程。#53457(Mikhail f. Shiryaev)。 - 在 CMake 中重新组织文件管理,以避免可能的重复。例如,
indexHint.cpp同时被包含在dbms_sources和clickhouse_functions_sources中。#53621(Amos Bird)。 - 将 Snappy 升级到 1.1.10。 #53672 (李扬)。
- 通过清理部分依赖项并移除一些重复项,略微改进了 CMake 构建过程。每个提交都包含对所做更改的简要说明。#53759 (Amos Bird)。
错误修复(官方稳定版本中用户可见的异常行为)
- 在构建期间存在多个标记时,不重置(实验性)Annoy 索引 #51325(Tian Xinhui)。
- 修复 RESTORE 过程中临时目录的使用方式 #51493 (Azat Khuzhin).
- 修复针对 Nullable(IPv4) 的二元算术运算 #51642 (Yakov Olkhovskiy).
- 支持将 IPv4 和 IPv6 数据类型作为字典属性 #51756 (Yakov Olkhovskiy)。
- 修复压缩标记的校验和 #51777 (SmitaRKulkarni)。
- 修复在 CSV 尽力解析中错误地将逗号解析为 datetime 的一部分的问题 #51950(Kruglov Pavel)。
- 当可执行 UDF 带有参数时,不要抛出异常 #51961 (Nikita Taranov)。
- 修复
ALTER DELETE查询中跳过索引和投影重新计算的问题 #52530 (Anton Popov)。 - MaterializedMySQL:修复 ReadBuffer::read 中的无限循环 #52621 (Val Doroshchuk)。
- 仅在
clickhouse方言下加载补全建议 #52628 (János Benjamin Antal)。 - 按需创建并销毁 ares 通道。#52634 (Arthur Passos)。
- 修复使用 OR 表达式进行虚拟列过滤的问题 #52653 (Azat Khuzhin)。
- 修复函数
tuple在仅有一个稀疏列参数时发生的崩溃 #52659 (Anton Popov)。 - 修复集群中命名集合的问题 #52687(Al Korgun)。
- 修复在多阶段
PREWHERE情况下对不必要列的读取 #52689 (Anton Popov)。 - 修复在按多列排序且使用 nulls first 排序时出现的意外结果 #52761 (copperybean).
- 修复 Keeper 重新配置过程中的数据竞争问题 #52804 (Antonio Andelic)。
- 修复在较大 limit 值下稀疏列排序的问题 #52827 (Anton Popov).
- clickhouse-keeper:修复基于 poll 的服务器实现。 #52833 (Andy Fiddaman).
- 使 regexp 分析器支持识别命名捕获组 #52840 (Han Fei).
- 修复 clickhouse-local 中
~PushingAsyncPipelineExecutor里可能出现的断言失败问题 #52862 (Kruglov Pavel)。 - 修复对空
Nested(Array(LowCardinality(...)))的读取 #52949 (Anton Popov). - 为
session_log添加了新的测试,并修复了登录和注销之间的不一致。#52958 (Alexey Gerasimchuck)。 - 修复
SHOW CREATE MYSQL TABLE中的密码泄露问题 #52962(Duc Canh Le)。 - 在 CreateSetAndFilterOnTheFlyStep 中将稀疏列格式转换为完整列格式 #53000 (vdimir)。
- 修复 fs 缓存中由于键前缀为空而在删除目录时触发的罕见竞态条件 #53055(Kseniia Sumarokova)。
- 修复 ZstdDeflatingWriteBuffer 偶尔截断输出的问题 #53064 (Michael Kolupaev).
- 修复在使用异步刷新查询时
part_log中的query_id#53103 (Raúl Marín)。 - 修复缓存中可能出现的错误 “Read unexpected size” #53121(Kseniia Sumarokova)。
- 禁用新的 Parquet 编码器 #53130(Alexey Milovidov)。
- 修复“Not-ready Set”异常 #53162(Nikolai Kochetov)。
- 修复 PostgreSQL 引擎的字符转义问题 #53250 (Nikolay Degterinsky).
- 试验性 session_log 表:为 session_log 添加了新的测试,并修复了登录和登出之间的不一致问题。#53255(Alexey Gerasimchuck)。修复了登录成功与登出之间的不一致问题 #53302(Alexey Gerasimchuck)。
- 修复向 DateTime 添加子秒级时间间隔时的问题 #53309 (Michael Kolupaev).
- 修复字典中的 “Context has expired” 错误 #53342 (Alexey Milovidov).
- 修复普通投影 AST 格式错误的问题 #53347 (Amos Bird).
- 在执行 Scalar 时,禁止在表函数中使用 use_structure_from_insertion_table #53348 (flynn)。
- 修复在对
system.table执行SELECT查询时数据库延迟加载的问题 #53372 (SmitaRKulkarni)。 - 修复了用于 MaterializedMySQL 的 system.data_skipping_indices 系统表 #53381 (Filipp Ozinov).
- 修复 TSV 文件分割引擎中单个回车符的处理问题 #53407 (Kruglov Pavel)。
- 修复
Context has expired错误 #53433 (Michael Kolupaev). - 修复在
IN右侧包含子查询时的timeout_overflow_mode问题 #53439 (Duc Canh Le)。 - 修复了在 #53152 #53440 中出现的非预期行为(Zhiguo Zhou)。
- 修复当路径为纯数字时 JSON_QUERY 函数的解析错误 #53470 (KevinyhZou)。
- 修复使用并行 FINAL 的查询中列顺序错误的问题。 #53489 (Nikolai Kochetov).
- 修复了在 ReplacingMergeTree 上配合 do_not_merge_across_partitions_select_final 执行 SELECT 时的问题 #53511 (Vasily Nemkov)。
- 关闭时优先刷新异步插入队列 #53547 (joelynch).
- 修复在对稀疏列执行 JOIN 时发生的崩溃 #53548 (vdimir)。
- 修复在 Set 跳过索引中使用参数不正确的函数时可能出现的未定义行为 #53559 (Azat Khuzhin).
- 修复倒排索引中的潜在未定义行为(实验性特性) #53560(Azat Khuzhin)。
- 修复:
interpolate表达式现在使用源列,而不是从SELECT表达式中获取同名的别名列。#53572(Yakov Olkhovskiy)。 - 修正 EXPLAIN PLAN 中 index=1 的丢弃 granule 数量 #53616 (wangxiaobo).
- 使用
DelayedSource正确处理totals和extremes#53644 (Antonio Andelic)。 - 修复变更管道中 prepared set 缓存卡死的问题 #53645 (Nikolai Kochetov)。
- 修复在
UPDATE和DELETE查询的谓词中使用 JSON 类型子列时的变更操作错误。#53677 (VanDarkholme7)。 - 修复在 full_sorting_merge join 中的过滤下推 #53699 (vdimir)。
- 尝试修复涉及
NULL::LowCardinality(Nullable(...)) NOT IN的 Bug #53706(Andrey Zvonov)。 - 修复:在包含稀疏列的情况下执行排序去重的问题 #53711(Igor Nikonov)。
transform:正确处理包含多行的默认列 #53742(Salvatore Mesoraca)。- 修复
parseDateTime中的 fuzzer 崩溃 #53764 (Robert Schulze)。 - MaterializedPostgreSQL:修复
getCreateTableQueryImpl中未捕获的异常 #53832(Kseniia Sumarokova)。 - 修复在使用 PostgreSQL 引擎时可能出现的段错误 #53847 (Kseniia Sumarokova).
- 修复 named_collection_admin 别名 #54066 (Kseniia Sumarokova).
ClickHouse 23.7 版本发布,2023-07-27
向后不兼容的变更
- 新增
NAMED COLLECTION访问类型(别名为USE NAMED COLLECTION、NAMED COLLECTION USAGE)。此 PR 存在向后不兼容变更,因为该访问类型默认是禁用的(其父访问类型NAMED COLLECTION ADMIN也默认被禁用)。在 #50277 中提出。要授予此权限,请使用GRANT NAMED COLLECTION ON collection_name TO user或GRANT NAMED COLLECTION ON * TO user;要能够授予这些权限,需要在配置中启用named_collection_admin(之前名称为named_collection_control,因此仍将保留为别名)。#50625(Kseniia Sumarokova)。 - 修复
system.parts列名last_removal_attemp_time中的拼写错误,现在名称为last_removal_attempt_time。#52104(filimonov)。 - 将 distributed_ddl_entry_format_version 的默认值提升到 5(启用 OpenTelemetry 和 initial_query_idd 透传)。这将导致在降级之后无法处理现有的分布式 DDL 条目(但请注意,通常不应存在此类未处理条目)。#52128(Azat Khuzhin)。
- 以与普通元数据相同的方式检查 projection 元数据。若存在带有无效 projection 的表,此更改可能会阻止服务器启动。例如,在主键中创建位置列(positional columns)的 projection(例如
projection p (select * order by 1, 4)),这是在表主键中不允许的,并且可能在插入/合并期间导致崩溃。请在升级前删除此类 projection。修复 #52353。#52361(Nikolai Kochetov)。 - 由于存在 bug,移除了实验特性
hashid。该实现从一开始质量就存在疑问,且从未通过实验阶段。由此关闭 #52406。#52449(Alexey Milovidov)。
新功能
- 新增
Overlay数据库引擎,用于将多个数据库合并为一个。新增Filesystem数据库引擎,用于将文件系统中的目录表示为一组隐式可用的表,并自动检测其格式和结构。新增S3数据库引擎,通过将某个前缀表示为一组表,以只读方式访问 S3 存储。新增HDFS数据库引擎,可以相同方式访问 HDFS 存储。#48821 (alekseygolub)。 - 在 Keeper 中添加对外部磁盘的支持,以用于存储快照和日志。#50098 (Antonio Andelic)。
- 为多目录选择 (
{}) 通配符添加支持。#50559 (Andrey Zvonov)。 - Kafka 连接器可以使用 URL 编码的凭据进行基本身份验证,从 schema registry 获取 Avro schema。#49664(Ilya Golshtein)。
- 新增函数
arrayJaccardIndex,用于计算两个数组之间的 Jaccard 相似度。 #50076 (FFFFFFFHHHHHHH)。 - 在
system.settings及类似的表中添加is_obsolete列。修复 #50819。#50826(flynn)。 - 实现配置文件中加密元素的支持。新增支持在配置文件的叶子元素中使用加密文本。文本使用
<encryption_codecs>节中的加密编解码器进行加密。#50986(Roman Vasin)。 - Grace Hash Join 算法现在也适用于 FULL 和 RIGHT JOIN。#49483。#51013 (lgbo)。
- 添加
SYSTEM STOP LISTEN语句,用于更优雅地终止进程。解决 #47972。#51016 (Nikolay Degterinsky)。 - 添加
input_format_csv_allow_variable_number_of_columns选项。#51273 (Dmitry Kardymon)。 - 另一个常规功能:新增函数
substring_index,与 Spark 或 MySQL 中的一样。 #51472 (李扬)。 - 一个用于显示 jemalloc bin 统计信息的系统表
jemalloc_bins。示例:SELECT *, size * (nmalloc - ndalloc) AS allocated_bytes FROM system.jemalloc_bins WHERE allocated_bytes > 0 ORDER BY allocated_bytes DESC LIMIT 10。欢迎使用。#51674 (Alexander Gololobov)。 - 添加
RowBinaryWithDefaults格式,在每列之前增加一个额外字节,用作是否使用该列默认值的标志。修复 #50854。#51695(Kruglov Pavel)。 - 新增了
default_temporary_table_engine设置项。与default_table_engine相同,但用于临时表。#51292。#51708(velavokr)。 - 新增了
initcap/initcapUTF8函数,将每个单词的首字母转换为大写,其余字母转换为小写。 #51735 (Dmitry Kardymon). CREATE TABLE语句现在在列定义中支持使用PRIMARY KEY语法。各列会按照定义顺序依次加入主索引。 #51881 (Ilya Yatsishin).- 在日志和错误日志文件名中新增了对日期和时间格式说明符的支持,可在配置文件(
log和errorlog标签)或命令行参数(--log-file和--errorlog-file)中使用。 #51945 (Victor Krasnov). - 在 HTTP 头部中新增峰值内存使用统计信息。#51946 (Dmitry Kardymon).
- 新增
hasSubsequence函数(以及CaseInsensitive和UTF8版本),用于匹配字符串中的子序列。#52050(Dmitry Kardymon)。 - 将
array_agg添加为groupArray的别名,以实现 PostgreSQL 兼容性。解决 #52100。### 用户可见变更的文档条目。#52135 (flynn)。 - 将
any_value添加为聚合函数any的兼容性别名。关闭 #52140。#52147(flynn)。 - 添加聚合函数
array_concat_agg以实现与 BigQuery 的兼容性,它是groupArrayArray的别名。修复 #52139。#52149(flynn)。 - 将
OCTET_LENGTH添加为length的别名。关闭了 #52153。#52176(FFFFFFFHHHHHHH)。 - 添加了
firstLine函数,用于从多行字符串中提取第一行。此更改解决了 #51172。#52209(Mikhail Koviazin)。 - 实现对
Interval数据类型的 KQL 风格格式化。此功能仅用于兼容Kusto查询语言。#45671 (ltrk2)。 - 新增查询
SYSTEM FLUSH ASYNC INSERT QUEUE,用于将所有待处理的异步插入刷新到目标表。新增服务器端设置async_insert_queue_flush_on_shutdown(默认值为true),用于控制在优雅关闭时是否刷新异步插入队列。async_insert_threads现在是一个服务器端设置。#49160(Anton Popov)。 - 为兼容 PostgreSQL,新增
current_database的别名和新的current_schemas函数。 #51076 (Pedro Riera). - 为函数
today(现在也可以使用名称curdate/current_date)和now(current_timestamp)添加别名。#52106 (Lloyd-Pottiger)。 - 为异步插入添加对
async_deduplication_token的支持。 #52136 (Han Fei). - 新增设置
disable_url_encoding,用于在 URL 引擎中禁用对 URI 路径的编码/解码。#52337 (Kruglov Pavel)。
性能优化
- 默认启用稀疏序列化格式的自动选择,以提升性能。该格式自 22.1 版本起受支持。进行此更改后,可能无法降级到早于 22.1 的版本。降级时可能需要将
ratio_of_defaults_for_sparse_serialization设置为0.9375,详见 55153。可以通过为 MergeTree 表将ratio_of_defaults_for_sparse_serialization设置为1来关闭稀疏序列化格式的使用。#49631(Alexey Milovidov)。 - 将
move_all_conditions_to_prewhere和enable_multiple_prewhere_read_steps设置默认启用。#46365 (Alexander Gololobov). - 通过调优内存分配器提升某些查询的性能。#46416 (Azat Khuzhin).
- 现在我们在
MergeTreePrefetchedReadPool中也像在MergeTreeReadPool中一样使用固定大小任务。从现在开始,我们还为 S3 请求使用连接池。#49732 (Nikita Taranov)。 - 在
JOIN的右侧实现了更多下推优化。#50532 (Nikita Taranov)。 - 通过预分配哈希表大小改进 grace_hash join(重新提交)。 #50875 (lgbo).
- 在
OpenedFileCache中等待锁的开销有时可能会比较明显。我们将其拆分为多个子 map(每个都有自己的锁)以避免竞争。#51341(Nikita Taranov)。 - 将包含主键列的条件移动到 PREWHERE 链的末尾。这样做的考虑是,包含主键列的条件很可能会在主键分析中被使用,对 PREWHERE 过滤本身不会带来太多额外收益。 #51958 (Alexander Gololobov).
- 通过内联 SipHash 加速 String 类型的
COUNT(DISTINCT)。在 ICX 平台(Intel Xeon Platinum 8380 CPU,80 核,160 线程)上对 OnTime 进行的性能实验表明,此更改可以在不影响其他查询的情况下,使查询 Q8 的 QPS 提升 11.6%。#52036(Zhiguo Zhou)。 - 默认启用
allow_vertical_merges_from_compact_to_wide_parts。这将减少合并期间的内存使用。#52295 (Alexey Milovidov). - 修复了导致主键失效的错误投影分析。该问题仅在
query_plan_optimize_primary_key = 1, query_plan_optimize_projection = 1时存在。本次修复解决了 #48823 和 #51173。#52308(Amos Bird)。 - 减少
FileCache::loadMetadata中的系统调用次数——如果配置了文件系统缓存,这将加快服务器启动速度。 #52435 (Raúl Marín)。 - 通过在后台下载剩余数据,支持为文件分段大小设置严格的下限。文件分段的最小大小(如果实际文件大小更大)通过缓存配置项
boundary_alignment配置,默认值为4Mi。后台线程数通过缓存配置项background_download_threads配置,默认值为2。同时,在此 PR 中将max_file_segment_size从8Mi增加到32Mi。#51000(Kseniia Sumarokova)。 - 将 S3 的默认超时时间从 30 秒降低到 3 秒,将其他 HTTP 请求的默认超时时间从 180 秒降低到 30 秒。#51171 (Michael Kolupaev)。
- 新增了设置项
merge_tree_determine_task_size_by_prewhere_columns。如果设置为true,则在确定读取任务大小时只会考虑PREWHERE部分中的列大小;否则将考虑查询中的所有列。#52606(Nikita Taranov)。
改进
- 在 s3/file/url/... 表函数中使用 read_bytes/total_bytes_to_read 作为进度条,以改进进度显示效果。 #51286 (Kruglov Pavel).
- 引入表级设置
wait_for_unique_parts_send_before_shutdown_ms,用于指定副本在关闭用于复制发送的服务器间处理器之前等待的时间。同时修复表关闭流程与服务器间处理器关闭流程之间的不一致:现在服务器会先关闭表,然后才关闭服务器间处理器。#51851 (alesapin)。 - 允许按照 SQL 标准在不带
OFFSET的情况下使用FETCH。参见 https://antonz.org/sql-fetch/。#51293(Alexey Milovidov)。 - 允许通过在配置中新增的
http_forbid_headers配置段,对 URL/S3 表函数的 HTTP 头部进行过滤。支持精确匹配和正则表达式匹配。#51038(Nikolay Degterinsky)。 - 不再在日志中显示关于
16 EiB可用空间的消息,因为这些信息没有意义。此更改关闭了 #49320。#49342(Alexey Milovidov)。 - 完善对
sleepEachRow函数限制的检查。新增设置项function_sleep_max_microseconds_per_block。这是通用查询模糊测试工具所需要的。#49343 (Alexey Milovidov). - 修复
geoHash函数的两个问题。 #50066 (李扬). - 将异步插入的 flush 查询记录到
system.query_log中。#51160 (Raúl Marín). - 函数
date_diff和age现在支持毫秒/微秒时间单位,并支持微秒级精度。 #51291 (Dmitry Kardymon). - 优化 clickhouse-keeper-client 中路径解析。 #51359 (Azat Khuzhin).
- 一个依赖于 ClickHouse 的第三方产品(Gluten:一个可将 Spark SQL 性能提升一倍的插件)存在一个缺陷。此修复可以避免该第三方产品在从 HDFS 读取时发生堆溢出。#51386 (李扬)。
- 新增可禁用 S3 原生拷贝的功能(BACKUP/RESTORE 使用设置
allow_s3_native_copy,s3/s3_plain磁盘使用s3_allow_native_copy)。 #51448 (Azat Khuzhin)。 - 在
system.parts表中新增列primary_key_size,以显示磁盘上压缩后的主键大小。关闭了 #51400。#51496(Yarik Briukhovetskyi)。 - 允许在没有 procfs、没有家目录,以及没有使用 glibc 名称解析插件的情况下运行
clickhouse-local。#51518 (Alexey Milovidov)。 - 在 rename_files_after_processing 设置中新增占位符
%a,用于表示完整文件名。#51603 (Kruglov Pavel)。 - 将列
modification_time添加到system.parts_columns中。 #51685 (Azat Khuzhin). - 为 CSV 格式新增了设置项
input_format_csv_use_default_on_bad_values,在解析某个字段失败时允许插入默认值。#51716 (KevinyhZou)。 - 已在发生意外崩溃后增加将崩溃日志刷新到磁盘的机制。#51720 (Alexey Gerasimchuck)。
- 修复仪表板页面中与身份验证无关的错误未显示的问题,同时修复图表重叠显示的行为。#51744 (Zach Naimon).
- 允许将 UUID 转换为 UInt128。#51765 (Dmitry Kardymon)。
- 为
range函数新增对 Nullable 参数的支持。#51767 (Dmitry Kardymon)。 - 将类似
toyear(x) = c的条件重写为c1 <= x < c2。#51795(Han Fei)。 - 提高
SHOW INDEX语句的 MySQL 兼容性。#51796(Robert Schulze)。 - 修复
use_structure_from_insertion_table_in_table_functions在包含MATERIALIZED和ALIAS列时无法工作的问题。修复了 #51817。修复了 #51019。#51825(flynn)。 - 缓存字典现在仅从源请求唯一键。修复了 #51762。#51853 (Maksim Kita)。
- 修复了当指定 FORMAT 时,EXPLAIN 查询未应用设置的情况。#51859(Nikita Taranov)。
- 在 DESCRIBE TABLE 查询中允许在 FORMAT 之前使用 SETTINGS,以与 SELECT 查询保持兼容。修复了 #51544。#51899(Nikolay Degterinsky)。
- VarInt 编码的整数(例如原生协议中使用的)现在可以使用完整的 64 位范围。建议第三方客户端相应地更新其 VarInt 相关代码。#51905(Robert Schulze)。
- 在证书变更时自动更新证书,而无需手动执行 SYSTEM RELOAD CONFIG。 #52030 (Mike Kot).
- 新增了
allow_create_index_without_type设置,允许忽略未指定TYPE的ADD INDEX查询。标准 SQL 查询将会直接成功执行,并且不会修改表结构。#52056(Ilya Yatsishin)。 - 从服务器启动时起,日志消息就会被写入到
system.text_log中。#52113(Dmitry Kardymon)。 - 当 HTTP 端点具有多个 IP 地址且第一个地址不可达时,会抛出超时异常。现已改进会话创建逻辑,以处理所有解析得到的端点。#52116(Aleksei Filatov)。
- Avro 输入格式现在即使只包含单一类型也支持 Union。修复了 #52131。#52137(flynn)。
- 添加
optimize_use_implicit_projections设置以禁用隐式 projection(目前仅有min_max_countprojection)。 #52152 (Amos Bird)。 - 此前可以利用函数
hasToken构造无限循环。现已移除这种可能性,从而关闭了 #52156。#52160(Alexey Milovidov)。 - 乐观地创建 ZK 祖先节点。 #52195 (Raúl Marín).
- 修复 #50582。在某些顺序读取及涉及常量的读取场景中,避免出现
Not found column ... in block错误。#52259(Chen768959)。 - 在 ClickHouse 端尽早检查 S2 地理基元是否无效。已关闭:#27090。#52260(Nikita Mikhaylov)。
- 在
query_plan_optimize_projection = 1时补充缺失的投影 QueryAccessInfo。修复了 #50183。修复了 #50093。#52327(Amos Bird)。 - 当
ZooKeeperRetriesControl重新抛出错误时,查看其原始堆栈跟踪比查看来自ZooKeeperRetriesControl本身的堆栈跟踪更有用。#52347 (Vitaly Baranov)。 - 即使部分磁盘不支持零拷贝复制,也等待获取锁。#52376 (Raúl Marín).
- 现在 interserver 端口仅会在表关闭后才会被关闭。#52498 (alesapin).
实验性功能
- 写入 Parquet 文件的速度提升了 10 倍,现在已支持多线程,速度几乎与读取相同。#49367 (Michael Kolupaev)。通过设置
output_format_parquet_use_custom_encoder控制,该设置默认禁用,因为该功能还不够理想。 - 新增对 PRQL 作为查询语言的支持。#50686 (János Benjamin Antal)。
- 允许为自定义磁盘添加磁盘名称。此前,自定义磁盘会使用内部生成的磁盘名称。现在可以通过
disk = disk_<name>(...)来实现(例如磁盘将具有名称name)。#51552 (Kseniia Sumarokova)。此语法在本版本中仍可能变更。 - (实验性 MaterializedMySQL)修复了在断开连接后仍使用
mysqlxx::Pool::Entry时导致的崩溃问题。#52063 (Val Doroshchuk)。 - (实验性 MaterializedMySQL)现在在 MaterializedMySQL 中支持
CREATE TABLE ... AS SELECT..。#52067 (Val Doroshchuk)。 - (实验性 MaterializedMySQL)为 MaterializedMySQL 引入了将文本类型自动转换为 UTF-8 的功能。#52084 (Val Doroshchuk)。
- (实验性 MaterializedMySQL)现在在 MaterializedMySQL 的 DDL 中支持未加引号的 UTF-8 字符串。#52318 (Val Doroshchuk)。
- (实验性 MaterializedMySQL)现在在 MaterializedMySQL 中支持使用双引号的注释。#52355 (Val Doroshchuk)。
- 将 Intel QPL 从 v1.1.0 升级到 v1.2.0;将 Intel accel-config 从 v3.5 升级到 v4.0;修复了 IAA 加速器在 Device IOTLB miss 时存在较大性能影响的问题。#52180 (jasperzhu)。
- 将
session_timezone设置(在 23.6 版本中新增)降级为实验性设置。#52445 (Alexey Milovidov)。 - 为 ClickHouse Keeper 新增对 ZooKeeper
reconfig命令的支持,支持增量式重配置,可通过keeper_server.enable_reconfiguration设置启用。支持新增服务器、移除服务器以及更改服务器优先级。#49450 (Mike Kot)。推测该功能尚不完整。
构建/测试/打包改进
- 在 CI 中为 Linux RISC-V 64 添加实验性的 ClickHouse 构建。#31398 (Alexey Milovidov).
- 添加在启用 Analyzer 时的集成测试检查。#50926 #52210 (Dmitry Novik).
- 为 Rust 实现可重现构建。#52395 (Azat Khuzhin).
- 更新 Cargo 依赖。#51721 (Raúl Marín).
- 使函数
CHColumnToArrowColumn::fillArrowArrayWithArrayColumnData能够处理可为空的数组(nullable 数组),这在 ClickHouse 中并不支持,但 Gluten 需要。#52112 (李扬). - 我们已将 CCTZ 库更新到 master 分支,但没有用户可见的变化。#52124 (Alexey Milovidov).
system.licenses表现在包含已经硬分叉的 Poco 库。此更改关闭了 #52066。#52127 (Alexey Milovidov).- 检查是否存在错误的标点用法:例如在逗号前有空格
Hello ,world,而不是Hello, world。#52549 (Alexey Milovidov).
错误修复(官方稳定版本中用户可见的异常行为)
- 修复 MaterializedPostgreSQL 中的 syncTables #49698 (Kseniia Sumarokova).
- 修复在使用 optimize_aggregators_of_group_by_keys 时的投影问题 #49709 (Amos Bird)。
- 修复在使用 JOIN 时
optimize_skip_unused_shards的问题 #51037 (Azat Khuzhin). - 修复 formatDateTime() 处理带小数的负 datetime64 时的问题 #51290 (Dmitry Kardymon)。
- 函数
hasToken*的实现完全错误。为 #43358 #51378 添加了测试用例(Alexey Milovidov)。 - 修复了在排序前移动函数的优化问题。#51481(Nikolai Kochetov)。
- 修复 Pipe::unitePipes 在 FINAL 模式下的 Block 结构不匹配问题 #51492(Nikita Taranov)。
- 修复在所有分片权重都为零的集群中出现的 SIGSEGV(修复 INSERT INTO FUNCTION clusterAllReplicas() 的问题)#51545 (Azat Khuzhin)。
- 修复对冲请求的超时问题 #51582 (Azat Khuzhin).
- 修复 ANTI JOIN 在处理 NULL 时的逻辑错误 #51601 (vdimir).
- 修复将 'IN' 条件下推到 PREWHERE 的问题 #51610 (Alexander Gololobov)。
- 不要对 ASOF/ANTI join 应用 PredicateExpressionsOptimizer #51633 (vdimir)。
- 通过合并算法修复 ReplicatedMergeTree 带去重的异步插入 #51676(Antonio Andelic)。
- 修复在
parseSipHashKey中从空列读取的问题 #51804 (Nikita Taranov)。 - 修复在创建无效的 EmbeddedRocksDB 表时出现的段错误 #51847 (Duc Canh Le).
- 修复向 MongoDB 表插入数据的问题 #51876 (Nikolay Degterinsky)。
- 修复 DatabaseCatalog 关闭时的死锁问题 #51908 (Alexander Tokmakov)。
- 修复子查询运算符的错误 #51922 (Alexey Milovidov).
- 修复异步连接到具有多个 IP 地址的主机时的问题 #51934 (Kruglov Pavel)。
- 不要在 ActionsDAG::merge 之后移除输入 #51947 (Nikolai Kochetov)。
- 将引用计数检查从
execute移到RemoveManyObjectStorageOperation::finalize中进行 #51954 (vdimir). - 支持参数化 UDF #51964 (Alexey Milovidov).
- 对
toDateTime64()在 2283-12-31 之后日期处理进行了小幅修复 #52130(Andrey Zvonov)。 - 修复窗口函数中 ORDER BY 元组 #52145 (Alexey Milovidov).
- 修复在聚合表达式中包含单调函数时的投影分析错误 #52151 (Amos Bird)。
- 修复
groupArrayMoving函数中的错误 #52161(Alexey Milovidov)。 - 禁用范围字典的直接 JOIN #52187 (Duc Canh Le).
- 修复 sticky mutations 测试(以及一个极其罕见的竞争条件)#52197 (alesapin)。
- 修复 Web 磁盘中的竞争条件 #52211 (Kseniia Sumarokova).
- 修复
Connection::setAsyncCallback在处理来自服务器的未知数据包时出现的数据竞争 #52219 (Kruglov Pavel)。 - 修复启动时删除临时数据的逻辑,并添加测试 #52275 (vdimir)。
- 在对可为 NULL 的列进行计数时,不要使用 minmax_count 投影 #52297(Amos Bird)。
- MergeTree/ReplicatedMergeTree 应当在日志记录中使用服务器时区 #52325 (Azat Khuzhin).
- 修复包含 CTE 且被多次复用的参数化视图 #52328 (SmitaRKulkarni)。
- 禁用用于时间间隔的表达式模板 #52335 (Alexander Tokmakov).
- 修复 Keeper 中的
apply_snapshot#52358 (Antonio Andelic)。 - 更新 build-osx.md #52377 (AlexBykovski).
- 修复在 needle 为空且 haystack 为列时
countSubstrings挂起的问题 #52409 (Sergei Trifonov)。 - 修复 Merge 表上的普通投影 #52432 (Amos Bird).
- 修复 Aggregator 中潜在的 double-free 问题 #52439 (Nikita Taranov)。
- 修复了向 Buffer 引擎插入数据的问题 #52440 (Vasily Nemkov)。
- AnyHash 的实现未遵循规范。#52448(Alexey Milovidov)。
- 检查 OptimizedRegularExpression 中的递归深度 #52451 (Alexey Milovidov)。
- 修复 DatabaseReplicated::startupTables()/canExecuteReplicatedMetadataAlter() 中的数据竞争 #52490 (Azat Khuzhin).
- 修复
transform函数中的异常中止问题 #52513 (Alexey Milovidov)。 - 修复在删除投影后执行 lightweight delete 时出现的问题 #52517 (Anton Popov)。
- 修复可能出现的错误 "Cannot drain connections: cancel first" #52585 (Kruglov Pavel).
ClickHouse 发布 23.6,2023-06-29
向后不兼容的变更
- 删除 fs 缓存中的功能
do_not_evict_index_and_mark_files。该功能只会让情况变得更糟。#51253 (Kseniia Sumarokova). - 移除对实验性 LIVE VIEW 的 ALTER 支持。#51287 (Alexey Milovidov).
- 将
http_max_field_value_size和http_max_field_name_size的默认值降低为 128 KiB。#51163 (Mikhail f. Shiryaev). - 将与 CPU 相关的 CGroups 指标合并为一个指标
CGroupMaxCPU,以提高可用性。当设置了 CGroups 限制时,NormalizedCPU 使用率指标将相对于 CGroups 限制进行归一化,而不是相对于 CPU 总数。这解决了 #50836。#50835 (Alexey Milovidov).
新功能
- 函数
transform以及按值匹配的CASE现在支持所有数据类型。修复了 #29730、#32387、#50827、#31336、#40493。#51351(Alexey Milovidov)。 - 新增选项
--rename_files_after_processing <pattern>。修复了 #34207。#49626(alekseygolub)。 - 为
INTO OUTFILE子句新增对TRUNCATE修饰符的支持。建议在文件已存在时,对INTO OUTFILE使用APPEND或TRUNCATE。#50950(alekar)。 - 新增表引擎
Redis和表函数redis,用于查询外部 Redis 服务器。#50150(JackyWoo)。 - 通过设置
s3_skip_empty_files、hdfs_skip_empty_files、engine_file_skip_empty_files、engine_url_skip_empty_files,允许在 file/S3/url/HDFS 表函数中跳过空文件。#50364(Kruglov Pavel)。 - 新增名为
use_mysql_types_in_show_columns的设置,用于修改SHOW COLUMNSSQL 语句,从而在客户端通过 MySQL 兼容端口连接时显示等价的 MySQL 类型。#49577(Thomas Panetti)。 clickhouse-client现在可以使用连接字符串来调用,而无需再使用--host、--port、--user等参数。#50689(Alexey Gerasimchuck)。- 新增设置
session_timezone;当未显式指定时,它将作为会话的默认时区使用。#44149(Andrey Zvonov)。 - 现在通过服务器设置
enable_deflate_qpl_codec(默认值:false)来控制编解码器 DEFLATE_QPL,而不再使用allow_experimental_codecs设置。这表明 DEFLATE_QPL 不再是实验特性。#50775(Robert Schulze)。
性能改进
- 改进了在
ReplicatedMergeTree中选择合并和清理任务的调度。当没有需要合并或清理的内容时,这些任务不会被过于频繁地执行。新增设置max_merge_selecting_sleep_ms、merge_selecting_sleep_slowdown_factor、max_cleanup_delay_period和cleanup_thread_preferred_points_per_iteration。应当可以修复 #31919。#50107 (Alexander Tokmakov). - 实现了将过滤条件下推到 cross join 中。#50605 (Han Fei).
- 在启用 QueryProfiler 时,通过使用线程局部的 timer_id 来替代全局对象,从而提升性能。#48778 (Jiebin Sun).
- 重写 CapnProto 输入/输出格式以提升性能。以不区分大小写的方式映射列名和 CapnProto 字段,并修复嵌套结构字段的读写。#49752 (Kruglov Pavel).
- 优化并行线程的 Parquet 写入性能。#50102 (Hongbin Ma).
- 对仅包含一个数据块的物化视图和存储禁用
parallelize_output_from_storages。#50214 (Azat Khuzhin). - 合并 PR #46558。如果数据块已经排好序,则在排序过程中避免对数据块进行重新排列。#50697 (Alexey Milovidov, Maksim Kita).
- 并行向 ZooKeeper 发起多个 list 请求,加快从 system.zookeeper 表中读取的速度。#51042 (Alexander Gololobov).
- 加速为时区初始化 DateTime 查找表。这应当会缩短 clickhouse-client 的启动/连接时间,尤其是在调试构建中,因为它的开销较大。#51347 (Alexander Gololobov).
- 修复由于同步 HEAD 请求导致的数据湖变慢问题(与 Iceberg/Delta Lake/Hudi 在文件数量较多时变慢相关)。#50976 (Kseniia Sumarokova).
- 避免从右侧 GLOBAL JOIN 表中读取所有列。#50721 (Nikolai Kochetov).
实验特性
- 支持在分析器中使用并行副本(parallel replicas)。#50441 (Raúl Marín).
- 在执行大型合并/变更操作之前添加随机休眠时间,以便在零拷贝复制场景下在副本之间更均匀地分摊负载。#51282 (alesapin).
- 对于仅有一个分片且底层表为
ReplicatedMergeTree的Replicated数据库,不再通过该数据库复制ALTER PARTITION查询和变更操作。#51049 (Alexander Tokmakov).
改进
- 放宽 “too many parts” 阈值,使其更符合当前需求。在长时间运行的插入查询中恢复背压机制。#50856 (Alexey Milovidov)。
- 允许将属于 CIDR ::ffff:0:0/96(IPv4 映射地址)的 IPv6 地址转换为 IPv4 地址。 #49759 (Yakov Olkhovskiy).
- 更新 MongoDB 协议以支持 MongoDB 5.1 及更高版本,同时保留对使用旧协议(<3.6)版本的支持。关闭 #45621、#49879。#50061(Nikolay Degterinsky)。
- 添加设置
input_format_max_bytes_to_read_for_schema_inference,用于限制模式推断时可读取的最大字节数。修复 #50577。#50592(Kruglov Pavel)。 - 在模式推断时遵循
input_format_null_as_default设置。#50602 (Kruglov Pavel)。 - 通过设置
input_format_csv_skip_trailing_empty_lines、input_format_tsv_skip_trailing_empty_lines和input_format_custom_skip_trailing_empty_lines,可以在 CSV/TSV/CustomSeparated 格式中跳过末尾的空行(默认关闭)。修复了 #49315。#50635(Kruglov Pavel)。 - 函数 "toDateOrDefault|OrNull" 和 "accuateCast[OrDefault|OrNull]" 现在可以正确解析数值型参数。#50709 (Dmitry Kardymon)。
- 支持使用空白字符或
\t作为 CSV 字段分隔符,并且这些分隔符在 Spark 中也受支持。 #50712 (KevinyhZou). - 现在,
number_of_mutations_to_delay和number_of_mutations_to_throw两个设置现已默认启用,默认值分别为 500 和 1000。#50726 (Anton Popov)。 - 仪表板现在能够正确显示缺失值,从而关闭了 #50831。#50832(Alexey Milovidov)。
- 在函数
parseDateTimeBestEffort*和parseDateTime64BestEffort*中,新增了在 syslog 时间戳格式中支持使用日期和时间参数的功能。 #50925 (Victor Krasnov). - clickhouse-client 中的命令行参数
--password现在只能指定一次。#50966 (Alexey Gerasimchuck)。 - 在集群内备份时,使用
system.parts中的hash_of_all_files来检查各个 part 的标识。 #50997 (Vitaly Baranov)。 - 系统表 zookeeper_connection 中的 connected_time 表示连接建立的时间(标准格式),并新增了 session_uptime_elapsed_seconds,用于表示已建立连接会话的持续时间(以秒为单位)。 #51026 (郭小龙).
- 通过根据源数据的块大小(chunk size)并在每个线程中按增量方式统计总大小,改进 file/s3/hdfs/url 表函数的进度条。修复 *Cluster 函数的进度条。此更改关闭了 #47250。#51088(Kruglov Pavel)。
- 在 TCP 协议中的 Progress 数据包中添加 total_bytes_to_read,以改进进度条显示。#51158 (Kruglov Pavel)。
- 改进了在启用文件系统缓存的磁盘上对数据部件的校验。#51164 (Anton Popov).
- 修复 fs 缓存中 current_elements_num 有时不正确的问题。 #51242 (Kseniia Sumarokova).
构建 / 测试 / 打包改进
- 向独立 keeper 二进制文件中添加嵌入式 keeper-client。 #50964 (pufit).
- 现在使用正确的 LZ4 版本。 #50621 (Nikita Taranov).
- ClickHouse 服务器在发生致命错误时会打印已更改设置的列表。此更改关闭了 #51137。 #51138 (Alexey Milovidov).
- 允许使用 clang-17 构建 ClickHouse。 #51300 (Alexey Milovidov).
- SQLancer 检查现已被认为是稳定的,因为它触发的所有 bug 都已修复。现在 SQLancer 检查失败会被报告为检查失败状态。 #51340 (Ilya Yatsishin).
- 将 Dockerfile 中巨大的
RUN拆分为更小的条件块。在同一RUN层中按需安装必要工具,并在之后将其删除。仅在开头升级一次操作系统。使用现代方式检查已签名的仓库。将基础镜像降级为 ubuntu:20.04,以解决旧版本 docker 上的问题。升级 golang 版本以修复 golang 漏洞。 #51504 (Mikhail f. Shiryaev).
Bug 修复(在官方稳定版本中对用户可见的异常行为)
- 正确上报可执行字典的加载状态 #48775 (Anton Kozlov).
- 正确地对 skip 索引和 projection 进行变更 #50104 (Amos Bird)。
- 清理易变部分 #50489 (vdimir).
- 修复聚合函数中 IP 类型哈希的向后兼容性问题 #50551(Yakov Olkhovskiy)。
- 修复 Log 系列表在执行 truncate 操作后返回错误的行数 #50585 (flynn).
- 修复
uniqExact在并行合并过程中的 Bug #50590(Nikita Taranov)。 - 回滚最近对 Grace 哈希连接的更改 #50699 (vdimir)。
- 查询缓存:尝试修复从
ColumnConst到ColumnVector<char8_t>的错误类型转换 #50704 (Robert Schulze). - 避免在 Keeper 中存储包含未知操作的日志 #50751 (Antonio Andelic)。
- 为 DateTime64 提供 SummingMergeTree 支持 #50797 (Jordi Villar)。
- 为非 const 时区添加兼容性设置 #50834(Robert Schulze)。
- 修复缓存项中 LDAP 参数的哈希处理 #50865 (Julian Maicher).
- 在 Parquet 格式中,遇到大整数时不再抛出异常,而是回退为从字符串解析大整数 #50873(Kruglov Pavel)。
- 修复在写入备份时过于频繁地检查锁文件的问题 #50889 (Vitaly Baranov).
- 启用 read-in-order 时,不要应用 projection。 #50923 (Nikolai Kochetov).
- 修复 Azure Blob 存储迭代器中的竞态条件 #50936 (SmitaRKulkarni)。
- 修复
CreatingSets中错误传播的sort_description#50955 (Nikita Taranov). - 修复 Iceberg v2 可选元数据的解析 #50974 (Kseniia Sumarokova).
- MaterializedMySQL:在空表覆盖时保留括号 #50977(Val Doroshchuk)。
- 修复 BackupCoordinationStageSync::setError() 中出现的崩溃问题 #51012 (Vitaly Baranov)。
- 修复 ColumnLowCardinality 字典中存在细微问题的写时复制(copy-on-write)机制 #51064 (Michael Kolupaev)。
- 生成安全的初始化向量(IV)#51086 (Salvatore Mesoraca).
- 修复针对包含子查询的 SELECT 的查询缓存失效问题 #51132 (Robert Schulze).
- 修复在 Set 索引中使用常量可空比较的问题。 #51205 (Nikolai Kochetov).
- 修复 s3 和 s3Cluster 函数中的崩溃 #51209 (Nikolay Degterinsky).
- 修复已编译表达式导致的崩溃 #51231 (LiuNeng)。
- 修复在切换 URL 时 StorageURL 中的 use-after-free 问题 #51260 (Michael Kolupaev).
- 更新了参数化视图的检查 #51272 (SmitaRKulkarni).
- 修复同一文件被多次写入到备份中的问题 #51299 (Vitaly Baranov).
- 修复 ActionsDAG 中由模糊测试发现的问题 #51301 (Alexey Milovidov).
- 移除函数
transform中的无用代码 #51350 (Alexey Milovidov).
ClickHouse 版本 23.5,2023-06-08
升级说明
- 默认压缩 marks 和主键。这可以显著减少冷查询时间。升级说明:对压缩 marks 和主键的支持是在 22.9 版本中添加的。如果你已经开启了压缩 marks 或主键,或者安装了 23.5 或更新版本(这些版本默认开启压缩 marks 和主键),则将无法降级到 22.8 或更早的版本。你也可以在服务器配置文件的
<merge_tree>部分通过指定compress_marks和compress_primary_key设置,显式关闭压缩 marks 或主键。升级说明: 如果你是从 22.9 之前的版本升级,则应当在升级时一次性升级所有副本,或者在升级前禁用压缩,或者先升级到一个中间版本(该版本支持压缩 marks 但默认未启用),例如 23.3。 #42587 (Alexey Milovidov). - 使本地对象存储与 S3 对象存储行为保持一致,修复追加写入的问题(修复 #48465),并使其可以作为独立存储进行配置。该变更不向后兼容,因为本地对象存储之上的缓存与之前的版本不兼容。#48791 (Kseniia Sumarokova).
- 移除实验特性 “in-memory data parts”。数据格式仍然受支持,但相关设置不再生效,将改用 compact 或 wide parts。这解决了 #45409。#49429 (Alexey Milovidov).
- 修改设置
parallelize_output_from_storages和input_format_parquet_preserve_order的默认值。这允许 ClickHouse 在从文件(例如 CSV 或 Parquet)读取时重新排序行,在很多情况下可以大幅提升性能。要恢复保持顺序的旧行为,请使用parallelize_output_from_storages = 0,input_format_parquet_preserve_order = 1。#49479 (Michael Kolupaev). - 使投影(projection)达到生产可用状态。新增
optimize_use_projections设置,用于控制在 SELECT 查询中是否使用投影。设置allow_experimental_projection_optimization已废弃且不再生效。#49719 (Alexey Milovidov). - 将
joinGet标记为非确定性(dictGet同样如此)。这允许在变更(mutation)中使用它们而无需额外设置。#49843 (Azat Khuzhin). - 回滚 “
groupArray的返回值不能为 Nullable” 的修改(因为对于Nullable类型上的groupArray/groupArrayLast/groupArraySample会破坏二进制兼容性,很可能导致TOO_LARGE_ARRAY_SIZE或CANNOT_READ_ALL_DATA)。#49971 (Azat Khuzhin). - 默认启用设置
enable_memory_bound_merging_of_aggregation_results。如果你从 22.12 之前的版本更新,我们建议在更新完成之前将该标志设置为false。#50319 (Nikita Taranov).
新功能
- 新增了存储引擎 AzureBlobStorage 和 azureBlobStorage 表函数。其支持的功能集与 S3 存储引擎/表函数非常相似 [#50604] (https://github.com/ClickHouse/ClickHouse/pull/50604) (alesapin) (SmitaRKulkarni.
- 新增原生 ClickHouse Keeper 命令行客户端,可通过
clickhouse keeper-client使用 #47414 (pufit). - 添加
urlCluster表函数。重构所有 *Cluster 表函数以减少代码重复。使模式推断适用于所有可能的 *Cluster 函数签名和命名集合。关闭 #38499。#45427(attack204)、Pavel Kruglov。 - 查询缓存现在可以用于生产环境工作负载。#47977 (Robert Schulze)。查询缓存现在可以支持带有
totals和extremes修饰符的查询。#48853 (Robert Schulze)。将allow_experimental_query_cache设置标记为弃用以保持向后兼容。它已在 https://github.com/ClickHouse/ClickHouse/pull/47977 中移除。#49934 (Timur Solodovnikov)。 - 地理数据类型(
Point、Ring、Polygon和MultiPolygon)已可用于生产环境。#50022(Alexey Milovidov)。 - 为 PostgreSQL、MySQL、MeiliSearch 和 SQLite 表引擎添加模式推断。解决了 #49972。#50000(Nikolay Degterinsky)。
- 在
CREATE USER u IDENTIFIED BY 'p'这类查询中,密码类型将会根据服务器上config.xml中的default_password_type设置自动确定。关闭了 #42915。 #44674 (Nikolay Degterinsky)。 - 新增 bcrypt 密码身份验证类型。关闭 #34599。#44905(Nikolay Degterinsky)。
- 新增关键字
INTO OUTFILE 'file.txt' APPEND。#48880 (alekar)。 - 新增了
system.zookeeper_connection表,用于显示 Keeper 连接相关信息。#45245 (mateng915). - 新增函数
generateRandomStructure,用于随机生成表结构。它可以与表函数generateRandom搭配使用。#47409 (Kruglov Pavel)。 - 允许在没有
ELSE分支的情况下使用CASE,并扩展transform()以处理更多类型。同时修复了一些问题:在 decimal 类型与其他数值类型混用时会导致 transform() 返回错误结果。#48300(Salvatore Mesoraca)。此更改关闭了 #2655。此更改关闭了 #9596。此更改关闭了 #38666。 - 为 S3 表添加了使用 KMS 密钥的服务端加密,并为 S3 磁盘添加了
header设置。关闭了 #48723 问题。#48724(Johann Gan)。 - 为后台任务(合并和变更)添加 MemoryTracker。引入了
merges_mutations_memory_usage_soft_limit和merges_mutations_memory_usage_to_ram_ratio设置,用于指定合并和变更的软性内存限制。如果达到该限制,ClickHouse 将不会调度新的合并或变更任务。同时引入了MergesMutationsMemoryTracking指标,用于监控后台任务当前的内存使用情况。重新提交 #46089。关闭 #48774。#48787(Dmitry Novik)。 - 函数
dotProduct现在可用于数组。 #49050 (FFFFFFFHHHHHHH). - 支持
SHOW INDEX语句,以提高与 MySQL 的兼容性。#49158 (Robert Schulze)。 - 为表函数
url添加对虚拟列_file和_path的支持。- 改进表函数url的错误信息。- 修复 #49231 - 修复 #49232。#49356 (Ziyi Tan)。 - 在 users.xml 文件中添加
grants字段,用于为用户指定权限。#49381(pufit)。 - 通过使用 Grace 哈希连接算法支持 FULL/RIGHT JOIN。 #49483 (lgbo).
WITH FILL修饰符会按排序前缀分组进行填充。通过use_with_fill_by_sorting_prefix设置进行控制(默认启用)。相关讨论:#33203#issuecomment-1418736794。#49503(Igor Nikonov)。- 当未指定 "--query"(或 "-q")时,clickhouse-client 现在可以在 "--multiquery" 之后直接接受查询。例如:clickhouse-client --multiquery "select 1; select 2;"。#49870 (Alexey Gerasimchuk)。
- 为从副本接收 Hello 数据包添加了单独的
handshake_timeout。修复了 #48854。#49948(Kruglov Pavel)。 - 添加了一个名为 "space" 的函数,用于返回由指定次数空格字符组成的字符串。#50103 (Robert Schulze)。
- 新增 --input_format_csv_trim_whitespaces 选项。#50215(Alexey Gerasimchuk)。
- 允许在正则表达式树(regexp tree)字典中,
dictGetAll函数将多个匹配的值以数组形式返回。关闭 #50254。#50255(Johann Gan)。 - 新增
toLastDayOfWeek函数,用于将日期或带时间的日期向后取整到最近的星期六或星期日。#50315(Victor Krasnov)。 - 支持通过指定
ignore_data_skipping_indices来忽略数据跳过索引。#50329 (Boris Kuschel)。 - 添加
system.user_processes表和SHOW USER PROCESSES查询,用于在用户级别显示内存信息和 ProfileEvents。#50492 (János Benjamin Antal)。 - 添加服务器和格式设置
display_secrets_in_show_and_select,用于显示表、数据库、表函数和字典的机密信息。新增权限displaySecretsInShowAndSelect,用于控制哪些用户可以查看机密信息。 #46528 (Mike Kot). - 允许为某个数据库中的所有表设置行策略(ROW POLICY)。#47640 (Ilya Golshtein)。
性能优化
- 默认压缩 marks 和 primary key,可显著减少冷查询时间。升级说明:对压缩 marks 和 primary key 的支持在 22.9 版本中引入。如果您启用了压缩 marks 或 primary key,或者安装了 23.5 或更新的版本(这些版本默认启用压缩 marks 和 primary key),则将无法降级到 22.8 或更早的版本。您也可以在服务器配置文件的
<merge_tree>部分,通过指定compress_marks和compress_primary_key设置,显式禁用压缩 marks 或 primary key。#42587(Alexey Milovidov)。 - 新增设置项 s3_max_inflight_parts_for_one_file 用于限制针对同一文件,通过分片(multipart)上传请求并发加载的分片数量上限。 #49961 (Sema Checherinda).
- 在读取多个文件时,减少每个文件的并行解析线程数。解决了 #42192。#46661(SmitaRKulkarni)。
- 仅在聚合投影读取的 granule 数量少于正常读取时才使用聚合投影。这在查询命中表的主键(PK)但未命中投影时会有所帮助。修复了 #49150。#49417(Nikolai Kochetov)。
- 如果没有插入任何数据,则不要在
ANY哈希连接中存储数据块。#48633 (vdimir)。 - 修复了在进行 JIT 编译时的聚合组合器
-If问题,并为聚合函数启用 JIT 编译。解决 #48120。#49083(Igor Nikonov)。 - 对于从远程表读取,我们使用粒度更小的任务(而不是一次读取整个 part),以便任务窃取机制能够更好地发挥作用;任务大小由要读取的列的数据量决定;从 S3 读取时始终使用 1 MB 的缓冲区;缓存段的边界按 1 MB 对齐,这样即使在小任务场景下也能保持合适的大小,同时还能防止碎片化。#49287(Nikita Taranov)。
- 新增了以下设置:-
merge_max_block_size_bytes用于限制后台操作的内存使用量。-vertical_merge_algorithm_min_bytes_to_activate用于为激活纵向合并添加另一条条件。 #49313 (Nikita Mikhaylov)。 - 从本地文件系统读取时的读取缓冲区默认大小调整为更合适的数值。同时引入了两个新的设置项:
max_read_buffer_size_local_fs和max_read_buffer_size_remote_fs。#49321 (Nikita Taranov)。 - 改进
SPARSE_HASHED/HASHED字典的内存占用和性能(例如,SPARSE_HASHED现在的内存占用减少了 2.6 倍,且速度提升约 2 倍)。 #49380 (Azat Khuzhin)。 - 在合适的情况下为
system.query_log和system.query_thread_log表应用LowCardinality以进行优化,从而加快对这些表的查询。#49530(Alexey Milovidov)。 - 通过并行读取提升本地
Parquet文件的读取性能。#49539(Michael Kolupaev)。 - 在某些场景下,将
RIGHT/FULL JOIN的性能提升最多 2 倍,尤其是在将一个较小的左表与一个较大的右表进行连接时。#49585 (lgbo)。 - 通过为 Rust 启用 LTO,将 BLAKE3 性能提升了 11%。#49600 (Azat Khuzhin)。现在它的性能已经与 C++ 相当。
- 优化
system.opentelemetry_span_log的结构。在合适的地方使用LowCardinality。虽然这个表整体设计得有点糟糕(甚至对常见属性也使用 Map 数据类型),但这样会稍微好一些。#49647(Alexey Milovidov)。 - 尝试在
grace_hashjoin 中预先保留哈希表的容量。 #49816 (lgbo)。 - 对
uniqExactIf状态进行并行合并。修复 #49885。#50285(flynn)。 - Keeper 改进:向 Keeper 添加
CheckNotExists请求,可提升 Replicated 表的性能。#48897(Antonio Andelic)。 - Keeper 性能优化:在处理过程中避免对同一请求进行两次序列化,并缓存大型请求的反序列化结果。由新的协调设置
min_request_size_for_cache控制。#49004 (Antonio Andelic)。 - 在选择要合并的数据片段时,如果许多分区没有可合并的内容,则减少对 ZooKeeper 发送的
List请求数量。 #49637 (Alexander Tokmakov). - 重构 FS 缓存中的锁机制 #44985 (Kseniia Sumarokova).
- 当可以进行简单的 count 查询优化时,禁用纯并行副本。#50594(Raúl Marín)。
- 不要在 Iceberg schema 推断中为所有键发送 HEAD 请求,只为用于读取数据的键发送。 #50203 (Kruglov Pavel)。
enable_memory_bound_merging_of_aggregation_results设置项默认启用。#50319(Nikita Taranov)。
实验性特性
DEFLATE_QPL编解码器将所需的最低 SIMD 版本降低到 SSE 4.2。qpl 文档变更——Intel® QPL 依赖运行时内核调度器和 CPUID 检查来选择最佳可用实现(SSE/AVX2/AVX512)——在 ClickHouse 中重构了用于构建 qpl 的 CMake 文件,以与上游最新的 qpl 对齐。#49811 (jasperzhu)。- 增加了对仅使用纯并行副本执行 JOIN 的初始支持。#49544 (Raúl Marín)。
- 在使用“零拷贝复制”时,对清理
Outdated数据部分提供了更高的并行度。#49630 (Alexander Tokmakov)。 - 并行副本:1)修复了在对非复制存储并禁用了
parallel_replicas_for_non_replicated_merge_tree设置时使用并行副本会出现的NOT_FOUND_COLUMN_IN_BLOCK错误。2)现在allow_experimental_parallel_reading_from_replicas有 3 个可能值——0、1 和 2。0 - 禁用;1 - 启用,在失败时静默禁用并行副本(在 FINAL 或 JOIN 的情况下);2 - 启用,在失败时抛出异常。3)如果在 SELECT 查询中使用了 FINAL 修饰符并启用了并行副本,当allow_experimental_parallel_reading_from_replicas设置为 1 时,ClickHouse 将尝试禁用并行副本,否则将抛出异常。#50195 (Nikita Mikhaylov)。 - 启用并行副本时,将始终跳过不可用的服务器(该行为由
skip_unavailable_shards设置控制,默认启用且只能关闭)。修复了此问题:#48565。#50293 (Nikita Mikhaylov)。
改进
BACKUP命令在创建备份时不会解密加密磁盘上的数据,而是会将这些数据以加密形式保存在备份中。此类备份只能恢复到具有相同(或扩展)加密密钥列表的加密磁盘上。#48896(Vitaly Baranov)。- 新增支持在 ATTACH PARTITION FROM 和 REPLACE PARTITION FROM 语句的 FROM 子句中使用临时表。#49436 (Roman Vasin).
- 为
MergeTree表新增了async_insert设置。它与查询级别设置async_insert含义相同,用于为特定表启用异步插入。注意:对通过clickhouse-client执行的插入查询无效,在这种情况下请使用查询级别设置。#49122 (Anton Popov). - 在创建配额语句的参数中新增对大小后缀的支持。#49087 (Eridanus).
- 扩展
first_value和last_value,使其支持 NULL。#46467 (lgbo)。 - 为
extractKeyValuePairs添加别名str_to_map和mapFromString,并关闭 https://github.com/clickhouse/clickhouse/issues/47185。#49466(flynn)。 - 为与内存使用和可用情况相关的异步指标添加了对 CGroup version 2 的支持。此更改关闭了 #37983。#45999(sichenzhao)。
- Cluster 表函数应始终跳过不可用的分片。关闭 #46314。#46765(zk_kiger)。
- 允许 CSV 文件的表头中出现空列名。#47496 (你不要过来啊).
- 新增 S3 兼容的 Google Cloud Storage 表函数
gcs。与oss和cosn函数类似,它只是s3表函数的一个别名,并未引入任何新特性。#47815 (Kuba Kaflik)。 - 为 S3 新增对严格分块大小的支持(兼容 CloudFlare R2 S3 存储)。 #48492 (Azat Khuzhin).
- 在
system.clusters中新增了关于Replicated数据库副本信息的新列:database_shard_name、database_replica_name、is_active。为SYSTEM DROP DATABASE REPLICA查询新增了可选的FROM SHARD子句。#48548(Alexander Tokmakov)。 - 在 system.replicas 表中新增列
zookeeper_name,用于指示复制表的元数据存储在哪个(辅助)Zookeeper 集群上。#48549 (cangyin)。 IN运算符现已支持比较Date和Date32。修复 #48736。#48806(flynn)。- 为
HDFS增加对擦除码的支持,作者:@M1eyu2018、@tomscut。 #48833 (M1eyu)。 - 实现从辅助 ZooKeeper 集群执行
SYSTEM DROP REPLICA,可能可以关闭 #48931。#48932(wangxiaobo)。 - 为 MongoDB 添加对 Array 数据类型的支持。关闭 #48598。#48983(Nikolay Degterinsky)。
- 支持在表中存储
Interval数据类型。 #49085 (larryluogit). - 允许在未显式指定窗口框架的情况下使用
ntile窗口函数:ntile(3) OVER (ORDER BY a),关闭 #46763。#49093(vdimir)。 - 新增了设置项(
number_of_mutations_to_delay、number_of_mutations_to_throw),用于在数据表已经存在大量未完成 mutation 时,对会创建 mutation 的ALTER查询(ALTER UPDATE、ALTER DELETE、ALTER MODIFY COLUMN等)进行延迟处理或直接抛出异常。 #49117 (Anton Popov). - 在 filesystem cache 中捕获由
create_directories抛出的异常。#49203(Kseniia Sumarokova)。 - 将嵌入的示例复制到
system.functions中新的字段example,以补充description字段的信息。 #49222 (Dan Roscigno)。 - 为 MongoDB 字典启用连接选项。示例:
xml <source> <mongodb> <host>localhost</host> <port>27017</port> <user></user> <password></password> <db>test</db> <collection>dictionary_source</collection> <options>ssl=true</options> </mongodb> </source>### 面向用户的更改文档条目。#49225 (MikhailBurdukov)。 - 为
kolmogorovSmirnovTest的asymp计算方法添加了别名asymptotic。改进了文档。#49286 (Nikita Mikhaylov). - 聚合函数 groupBitAnd/Or/Xor 现在可以处理有符号整数数据,使其与标量函数 bitAnd/Or/Xor 的行为保持一致。#49292 (exmy)。
- 将函数文档拆分为更细粒度的字段。 #49300 (Robert Schulze)
- 在服务器内所有表之间共享多个线程,用于加载过期的数据部件。该线程池及其队列的大小由
max_outdated_parts_loading_thread_pool_size和outdated_part_loading_thread_pool_queue_size设置进行控制。#49317(Nikita Mikhaylov)。 - 当
LowCardinality列在多个数据块之间共享字典时,不要高估处理数据的大小。这个改动关闭了 #49322。另见 #48745。#49323(Alexey Milovidov)。 - 通过
OUTFILE使用时,Parquet 写入器现在会采用合理的行组大小。#49325 (Michael Kolupaev)。 - 如果为别名加上引号,则允许将
ARRAY等受限关键字用作别名。关闭 #49324。#49360(Nikolay Degterinsky)。 - 数据部件的加载和删除作业已从表级线程池迁移到服务器级共享线程池。线程池大小通过顶层配置中的设置
max_active_parts_loading_thread_pool_size、max_outdated_parts_loading_thread_pool_size和max_parts_cleaning_thread_pool_size进行控制。表级设置max_part_loading_threads和max_part_removal_threads已被废弃。#49474 (Nikita Mikhaylov). - 在 Play UI 的 URL 中允许使用
?password=pass参数。浏览器历史记录中的密码会被替换。#49505 (Mike Kot). - 允许从远程文件系统读取零大小对象。(因为空文件不会被备份,因此最终可能导致元数据文件中一个 blob 也没有)。关闭 #49480。#49519 (Kseniia Sumarokova)。
- 在线程组(
ThreadGroup)脱离后,将线程的MemoryTracker关联到total_memory_tracker。#49527 (Dmitry Novik)。 - 修复在查询中多次使用同一查询参数时的参数化视图问题。 #49556 (Azat Khuzhin).
- 在查询上下文中释放为上一次发送的 ProfileEvents 快照分配的内存。作为对 #47564 的后续更新。#49561(Dmitry Novik)。
- 函数 "makeDate" 现在提供了一个接受“年份” & “一年中的第几天”参数的、与 MySQL 兼容的重载。#49603 (Robert Schulze)。
- 为
RegExpTreeDictionary添加对dictionary表函数的支持。 #49666 (Han Fei). - 添加了加权公平 IO 调度策略。新增动态资源管理器,允许在运行时更新 IO 调度层级,而无需重启服务器。#49671 (Sergei Trifonov)。
- 在分片上传到 GCS 完成后添加 compose 请求。这样可以对通过 multipart upload 上传的对象使用复制操作。建议将
s3_strict_upload_part_size设置为一个明确的值,因为对由不同大小的分片创建的对象执行 compose 请求时可能会失败。#49693 (Antonio Andelic). - 对于
extractKeyValuePairs函数:改进“尽力而为”式的解析逻辑,使其接受key_value_delimiter作为值的有效组成部分。这也简化了分支逻辑,并且可能略微提升性能。#49760 (Arthur Passos)。 - 为
system.processors_profile_log添加了initial_query_id字段 #49777 (helifu). - 系统日志表现在可以使用自定义排序键。#49778(helifu)。
- 在
system.query_log中新增了字段partitions,用于指示参与计算的分区。#49779(helifu)。 - 为
ReplicatedMergeTree新增了enable_the_endpoint_id_with_zookeeper_name_prefix设置(默认禁用)。启用后,会将 ZooKeeper 集群名称添加到表的服务器间通信端点中。这样在存在具有相同路径但使用不同辅助 ZooKeeper 的复制表时,可以避免出现Duplicate interserver IO endpoint错误。#49780 (helifu)。 - 向
clickhouse-local添加查询参数。关闭 #46561。#49785(Nikolay Degterinsky)。 - 现在默认允许从 YAML 文件加载字典和函数。在之前的版本中,这需要在配置文件中编辑
dictionaries_config或user_defined_executable_functions_config,因为它们只接受*.xml文件。#49812(Alexey Milovidov)。 - Kafka 表引擎现在支持使用别名列。#49824(Aleksandr Musorin)。
- 添加一个设置,用于限制
extractKeyValuePairs生成的键值对最大数量,作为一种防护机制,以避免过度使用内存。#49836 (Arthur Passos). - 增加对一种(不常见)情况的支持:
IN运算符中的参数是单元素元组。#49844 (MikhailBurdukov)。 bitHammingDistance函数现在支持String和FixedString数据类型。修复了 #48827。#49858(flynn)。- 修复 OS X 客户端中的超时重置错误。 #49863 (alekar).
- 在函数
bitCount中添加对大整数类型的支持,例如 UInt128、Int128、UInt256 和 Int256。这样可以在大规模位掩码上计算汉明距离,以支持 AI 应用。#49867 (Alexey Milovidov)。 - 在加密磁盘中使用指纹替代密钥 ID,从而简化加密磁盘的配置。#49882 (Vitaly Baranov)。
- 新增 PostgreSQL 的 UUID 数据类型支持。关闭 #49739。#49894(Nikolay Degterinsky)。
- 函数
toUnixTimestamp现在接受Date和Date32参数。#49989 (Victor Krasnov)。 - 仅统计字典使用的服务器内存。 #49995 (Azat Khuzhin).
- 服务器将允许将
SQL_*设置(例如SQL_AUTO_IS_NULL)视为无操作(no-op),以实现对 MySQL 的兼容性。此更改解决了 #49927。#50013(Alexey Milovidov)。 - 在 ON CLUSTER 查询中保留 initial_query_id,在
distributed_ddl_entry_format_version=5时有助于进行内部排查。 #50015 (Azat Khuzhin). - 通过使用别名(
allow_experimental_projection_optimization对应optimize_use_projections,allow_experimental_lightweight_delete对应enable_lightweight_delete),保留已重命名设置的向后不兼容性。 #50044 (Azat Khuzhin). - 支持通过将 my_hostname 设置为 FQDN,在 keeper 中注册集群节点。新增 invisible 设置以支持多个计算组:一个 compute group 作为一个集群,对其他 compute group 不可见。 #50186 (Yangkuan Liu).
- 修复 PostgreSQL 即使可以指定
LIMIT n仍会读取全部数据的问题。#50187(Kseniia Sumarokova)。 - 为包含子查询的查询添加新的 Profile 事件(
QueriesWithSubqueries/SelectQueriesWithSubqueries/InsertQueriesWithSubqueries)。#50204(Azat Khuzhin)。 - 在 users.xml 文件中添加
roles字段,使其能够通过配置文件指定带授权的角色。 #50278 (pufit)。 - 在 AsynchronousMetrics 中上报
CGroupCpuCfsPeriod和CGroupCpuCfsQuota。- 在服务器启动期间遵循 cgroup v2 内存限制。#50379 (alekar)。 - 为 SIGQUIT 添加一个信号处理程序,使其行为与 SIGINT 相同。关闭问题 #50298。#50435(Nikolay Degterinsky)。
- 如果由于对象体积过大导致 JSON 解析失败,输出解析停止的最后位置以便进行调试。 #50474 (Valentin Alexeev).
- 支持非固定精度的小数。关闭 #49130。#50586(Kruglov Pavel)。
构建/测试/打包改进
- 全新升级的
keeper-bench。所有内容都可以通过 YAML/XML 文件进行自定义:- 请求生成器 - 每种类型的请求生成器都可以拥有一组特定字段 - 只需在multi键下以相同方式配置即可生成多个请求 - 对于 multi 中的每个请求或子请求,可以定义一个weight字段来控制分布 - 定义为测试运行需要预先设置的树结构 - 可以定义主机并自定义所有超时时间,同时可以控制为每个主机生成多少会话 - 使用min_value和max_value字段定义的整数是随机数生成器。#48547(Antonio Andelic)。 - macOS 不支持 io_uring,本地运行测试时不要选择它,以避免间歇性失败。 #49250 (Frank Chen).
- 支持命名故障注入以便测试。 #49361 (Han Fei).
- 允许在不提供
prctl(进程控制)系统调用的操作系统上运行 ClickHouse,例如 AWS Lambda。#49538(Alexey Milovidov)。 - 修复了 qpl 中 contrib/isa-l 与 isa-l 之间的构建冲突问题 49296。 #49584 (jasperzhu)。
- 现在仅在显式启用(“-DENABLE_UTILS=1”)时才会构建工具程序,而不再默认构建,从而缩短了典型开发构建的链接时间。#49620 (Robert Schulze)。
- 将 idxd-config 的构建描述提取到独立的 CMake 文件中,以防止将来被误删。#49651(jasperzhu)。
- 在 master 中添加启用分析器的 CI 检查,作为对 #49562 的后续。#49668(Dmitry Novik)。
- 切换到 LLVM/Clang 16。#49678 (Azat Khuzhin).
- 支持使用 clang-17 构建 ClickHouse。#49851(Alexey Milovidov)。#50410(Alexey Milovidov)。
- ClickHouse 现在更容易集成到其他 CMake 项目中了。#49991 (Amos Bird)。(强烈不建议这样做 —— Alexey Milovidov)。
- 修复 #47151 之后出现的异常 QEMU 额外日志输出,参见 https://s3.amazonaws.com/clickhouse-test-reports/50078/a4743996ee4f3583884d07bcd6501df0cfdaa346/stateless_tests__release__databasereplicated__[3_4].html。#50442(Mikhail f. Shiryaev)。
- ClickHouse 可以在 Linux RISC-V 6.1.22 上运行,从而关闭了 #50456。#50457(Alexey Milovidov)。
- 将内部 protobuf 升级到 v3.18(修复误报的 CVE-2022-1941)。#50400 (Robert Schulze).
- 将内部使用的 libxml2 更新到 v2.10.4(修复误报的 CVE-2023-28484 和 CVE-2023-29469)。 #50402 (Robert Schulze).
- 将 c-ares 升级到 v1.19.1(误报的 CVE-2023-32067、误报的 CVE-2023-31130、误报的 CVE-2023-31147)。#50403 (Robert Schulze)。
- 修正 libgsasl 中被错误标记的 CVE-2022-2469。 #50404 (Robert Schulze).
Bug 修复(官方稳定版中用户可见的异常行为)
- ActionsDAG:纠正不当的优化 #47584 (Salvatore Mesoraca)。
- 在 Keeper 中正确处理并发快照 #48466 (Antonio Andelic)。
- MergeTreeMarksLoader 现在持有 DataPart 而不是 DataPartStorage #48515(SmitaRKulkarni)。
- 修复序列状态 #48603(Ilya Golshtein)。
- 在先前失败时对备份/恢复操作进行并发检查 #48726 (SmitaRKulkarni)。
- 修复在附加具有不存在 ZK 路径的表时 ReadonlyReplica 指标未增加的问题 #48954 (wangxiaobo)。
- 在部分位置修复了可能因未捕获异常而调用 terminate 的问题 #49112 (Kruglov Pavel)。
- 修复在包含多个 StorageJoin 的查询中出现的 “key not found” 错误 #49137 (vdimir).
- 修复在使用可为空(Nullable)主键时查询结果错误的问题 #49172 (Duc Canh Le)。
- 在大端机器上修复 reinterpretAs*() 系列函数 #49198 (Suzy Wang)。
- (实验性 zero-copy 复制)使 zero-copy part 的加锁更加原子 #49211 (alesapin).
- 修复在加载过期数据分片时的竞争条件 #49223 (Alexander Tokmakov).
- 修复当所有键列值为 NULL 且使用 ROLLUP 分组时会返回错误结果的问题 #49282 (Shuai li).
- 修复在带有 SHARDS 的 HASHED 字典中计算 load_factor 的问题 #49319 (Azat Khuzhin)。
- 不允许为别名列配置压缩 CODEC #49363 (Timur Solodovnikov).
- 修复删除现有 part 目录时的缺陷 #49365 (alesapin)。
- 正确修复在使用 HMAC 时的 GCS 问题 #49390 (Antonio Andelic).
- 修复在通过 remote() 读取时未构建子查询集合的模糊测试缺陷 #49425(Alexander Gololobov)。
- 将
shutdown_wait_unfinished_queries取反 #49427 (Konstantin Bogdanov). - (实验性零拷贝复制)修复了另一个零拷贝 Bug #49473 (alesapin)。
- 修复 Postgres 数据库配置 #49481(Mal Curtis)。
- 正确处理
s3Cluster参数 #49490 (Antonio Andelic)。 - 修复
TraceCollector析构函数中的 bug。#49508 (Yakov Olkhovskiy). - 修复 AsynchronousReadIndirectBufferFromRemoteFS 在执行短距离 seek 操作时出错的问题 #49525 (Michael Kolupaev).
- 修复字典加载顺序 #49560 (Alexander Tokmakov).
- 禁止修改 Object('json') 列的数据类型 #49563 (Nikolay Degterinsky)。
- 修复压力测试(逻辑错误:期望 7134 >= 11030)#49623(Kseniia Sumarokova)。
- 修复 DISTINCT 的 bug #49628 (Alexey Milovidov).
- 修复:当未排序列包含零值时的 DISTINCT 排序问题 #49636 (Igor Nikonov).
- 修复 UBSan 与 fuzzer 发现的大整数中的 off-by-one 错误 #49645(Alexey Milovidov)。
- 修复重启后从稀疏列读取数据的问题 #49660 (Anton Popov).
- 在使用 fibers 时修复
SpanHolder::finish()中的断言 #49673(Kruglov Pavel)。 - 修复在使用稀疏参数时的短路函数和 mutation #49716 (Anton Popov).
- 修复将追加写入的文件纳入增量备份的问题 #49725 (Vitaly Baranov).
- 修复在包含 Object 类型列的表上执行 lightweight delete mutation 时出现的 "There is no physical column _row_exists in table" 错误。 #49737 (Alexander Gololobov).
- 修复 randomStringUTF8(uneven number) 的 msan 问题 #49750 (Robert Schulze).
- 修复聚合函数 kolmogorovSmirnovTest #49768 (FFFFFFFHHHHHHH)。
- 修复原生协议中的配置别名 #49776 (Azat Khuzhin)。
- 修复在单元素元组数组上使用
arrayMap时的问题 #49789 (Anton Popov). - 修复单查询 IO/BACKUP 限流设置 #49797(Azat Khuzhin)。
- 修复在 profile 定义中将值设为 NULL 的问题 #49831 (Vitaly Baranov).
- 修复了在投影与
aggregate_functions_null_for_empty设置(用于query_plan_optimize_projection)配合使用时出现的一个缺陷 #49873 (Amos Bird)。 - 修复在重启后处理 Distributed 异步 INSERT 待处理批次的问题 #49884 (Azat Khuzhin).
- 修复
CacheMetadata::doCleanup中的断言 #49914 (Kseniia Sumarokova)。 - 修复 OptimizeRegularExpression 中
is_prefix的问题 #49919 (Han Fei). - 修复指标
WriteBufferFromS3Bytes、WriteBufferFromS3Microseconds和WriteBufferFromS3RequestsErrors#49930(Aleksandr Musorin)。 - 修复 protobuf 中的 IPv6 编码 #49933(Yakov Olkhovskiy)。
- 修复在文本格式中对
Nullable的错误解析可能导致的逻辑错误 #49960(Kruglov Pavel)。 - 新增设置 output_format_parquet_compliant_nested_types,以生成兼容性更好的 Parquet 文件 #50001 (Michael Kolupaev)。
- 修复压力测试 “Not enough space to add ...” 中的逻辑错误 #50021(Kseniia Sumarokova)。
- 避免在
ReplicatedMergeTree的 attach 线程中启动表时发生死锁 #50026 (Antonio Andelic). - 第二次尝试修复在使用 fibers 时 SpanHolder::finish() 中的断言 #50034 (Kruglov Pavel)。
- 为 DDL 的 OpenTelemetry 上下文序列化添加正确的转义处理 #50045 (Azat Khuzhin).
- 修复损坏的 projection 部分的上报 #50052 (Amos Bird).
- 修复 JIT 编译中不等于 NaN 的问题 #50056 (Maksim Kita)。
- 修复在使用未带参数的 Replicated 数据库时发生的崩溃 #50058 (Azat Khuzhin).
- 修复在
multiIf中使用常量条件和可为空参数时导致的崩溃 #50123 (Anton Popov). - 修复针对日期相关键的索引分析错误 #50153(Amos Bird)。
- 在不存在 ORDER BY 列时,不允许修改 ORDER BY #50154 (Han Fei).
- 修复当二元运算符包含 null 常量参数时的索引分析错误 #50177 (Amos Bird).
- clickhouse-client:不允许同时使用
--query和--queries-file#50210(Alexey Gerasimchuk)。 - 修复
INTO OUTFILE扩展(APPEND/AND STDOUT)以及WATCH EVENTS的未定义行为(UB)#50216(Azat Khuzhin)。 - 修复
CustomSeparatedIgnoreSpaces格式在行尾跳过空格的问题 #50224 (Kruglov Pavel)。 - 修复 Iceberg 元数据解析 #50232 (Kseniia Sumarokova).
- 修复
WITH子句中嵌套的分布式SELECT查询 #50234 (Azat Khuzhin)。 - 修复 keyed siphash 中的 msan 相关问题 #50245 (Robert Schulze).
- 修复 Poco 套接字在非阻塞模式下的缺陷,改为使用真正的非阻塞套接字 #50252 (Kruglov Pavel).
- 修复备份条目校验和的计算 #50264 (Vitaly Baranov).
- 修复比较函数对 NaN 的处理 #50287 (Maksim Kita).
- 修复 JIT 聚合中可空键的问题 #50291 (Maksim Kita).
- 修复 clickhouse-local 在写入空 Arrow 或 Parquet 输出时崩溃的问题 #50328 (Michael Kolupaev)。
- 修复在调用 Pool::Entry::disconnect() 时发生的崩溃 #50334 (Val Doroshchuk).
- 通过延长目录锁的持有时间改进了分片拉取过程 #50339 (SmitaRKulkarni).
- 修复在两个参数均为常量时的 bitShift* 系列函数 #50343(Kruglov Pavel)。
- 修复在预处理请求时因异常导致的 Keeper 死锁。#50387 (frinkr).
- 修复常量整数值的哈希计算 #50421 (Robert Schulze).
- 修复 data skipping 索引中的 merge_tree_min_rows_for_seek/merge_tree_min_bytes_for_seek #50432(Azat Khuzhin)。
- 限制加载过期数据分片时的进行中任务数量 #50450 (Nikita Mikhaylov).
- Keeper 修复:在安装快照后应用未提交的状态 #50483 (Antonio Andelic)。
- 修复不正确的常量折叠 #50536 (Alexey Milovidov)。
- 修复压力测试中的逻辑错误(Not enough space to add ...)#50583(Kseniia Sumarokova)。
- 修复了
values表函数中将Null转换为LowCardinality(Nullable)时的错误 #50637 (Kruglov Pavel). - 撤销无效的 RegExpTreeDictionary 优化 #50642(Johann Gan)。
ClickHouse 版本 23.4,2023-04-26
向后不兼容的变更
- 函数 formatDateTime() 中的格式说明符 '%M' 现在会输出月份名称而不是分钟,从而使行为与 MySQL 保持一致。可以通过设置
formatdatetime_parsedatetime_m_is_month_name = 0来恢复之前的行为。#47246(Robert Schulze)。 - 此变更仅在使用虚拟文件系统缓存时才会产生影响。如果虚拟文件系统缓存配置中的
path不为空且不是绝对路径,则它会被放置在<clickhouse server data directory>/caches/<path_from_cache_config>中。#48784(Kseniia Sumarokova)。 - 现在会拒绝主/次索引和排序键使用相同表达式的情况。可以通过设置
allow_suspicious_indices禁用此行为。#48536(凌涛)。
新功能
- 支持新的聚合函数
quantileGK/quantilesGK,类似于 Spark 中的 approx_percentile。采用 Greenwald-Khanna 算法,详见:http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf。#46428(李扬)。 - 新增语句
SHOW COLUMNS,用于展示从 system.columns 提炼出的简要信息。 #48017 (Robert Schulze)。 - 为
SYSTEM SYNC REPLICA查询新增了LIGHTWEIGHT和PULL修饰符。LIGHTWEIGHT版本仅等待抓取和删除范围操作(忽略合并和变更)。PULL版本从 ZooKeeper 拉取新条目,但不会等待其完成。修复了 #47794。#48085(Alexander Tokmakov)。 - 添加
kafkaMurmurHash函数,以兼容 Kafka 的默认分区器 DefaultPartitioner。修复 #47834。#48185(Nikolay Degterinsky)。 - 允许通过
GRANT CURRENT GRANTS轻松创建一个与当前用户拥有相同权限的用户。#48262 (pufit)。 - 添加统计聚合函数
kolmogorovSmirnovTest。关闭 #48228。#48325(FFFFFFFHHHHHHH)。 - 在
system.replicas表中新增了lost_part_count列。该列的值表示对应表中丢失数据分片(parts)的总数。该值存储在 ZooKeeper 中,可在监控中替代非持久化的ReplicatedDataLossprofile event 使用。#48526 (Sergei Trifonov). - 添加
soundex函数以提高兼容性。关闭 #39880。#48567(FriendLey)。 - JSONExtract 现已支持
Map类型。 #48629 (李扬). - 添加
PrettyJSONEachRow格式,用于输出带有换行分隔符和 4 个空格缩进的美化 JSON。#48898(Kruglov Pavel)。 - 添加
ParquetMetadata输入格式以读取 Parquet 文件的元数据。#48911 (Kruglov Pavel)。 - 添加
extractKeyValuePairs函数,用于从字符串中提取键值对。输入字符串可能包含噪声(例如日志文件 / 不必是完全符合键值对格式的内容),算法会根据传递给函数的参数查找匹配的键值对。目前该函数接受以下参数:data_column(必需)、key_value_pair_delimiter(默认为:)、pair_delimiters(默认为\space \, \;)以及quoting_character(默认为双引号)。#43606(Arthur Passos)。 - 现在,函数 replaceOne()、replaceAll()、replaceRegexpOne() 和 replaceRegexpAll() 可以传入非常量的模式和替换参数。#46589 (Robert Schulze)。
- 新增了用于处理
Map类型列的函数:mapConcat、mapSort、mapExists。#48071 (Anton Popov)。
性能改进
- 读取
Parquet格式文件的速度现在快得多。IO 和解码已并行化(由max_threads设置控制),并且只读取所需的数据范围。#47964(Michael Kolupaev)。 - 当我们运行类似这样的带有 IN(子查询)的变更:
ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table)时,如果表t有多个 part,那么对于每个 part,都会在内存中为子查询SELECT id FROM huge_table构建一个 set。如果 part 很多,就可能消耗大量内存(并导致 OOM)和 CPU。解决方案是为当前正在由 mutation 任务构建的 set 引入一个短生命周期的缓存。如果同一 mutation 的另一个任务并发执行,它可以在缓存中查找该 set,等待其构建完成并重用它。#46835(Alexander Gololobov)。 - 在执行
ALTER TABLE查询时,仅在必要时检查依赖关系。#48062(Raúl Marín)。 - 优化函数
mapUpdate。#48118(Anton Popov)。 - 现在会显式向本地副本发送内部查询,并通过 loopback 接口接收其数据。对于并行副本,不再遵循
prefer_localhost_replica设置。这样做是为了更好的调度并使代码更简洁:发起方只负责协调读取过程和合并结果,持续响应请求,而所有次级查询负责读取数据。注意:使用 loopback 接口本身性能并不高,但如果不这样做,某些副本可能会出现任务饥饿,从而导致查询执行更慢,且无法充分利用所有可用资源。协调器的初始化现在更加惰性。所有传入请求都包含有关读取算法的信息,我们在第一个请求到达时使用该信息初始化协调器。如果任何副本决定使用不同的算法进行读取,将抛出异常并中止该查询。#48246(Nikita Mikhaylov)。 - 当
IN子句右侧的子查询仅用于分析跳过索引,并且通过设置禁用了它们(use_skip_indexes=0)时,不再为其构建 set。此前这可能会影响查询性能。#48299(Anton Popov)。 - 在读取
FROM file(...)之后立即并行化查询处理。与 #38755 相关。#48525(Igor Nikonov)。现在在从任意数据源读取之后就会并行化查询处理。受影响的数据源主要是简单或外部存储,例如表函数url、file。#48727(Igor Nikonov)。该行为由设置parallelize_output_from_storages控制,默认未开启。 - 降低了 ThreadPool 互斥锁的争用(对于数量巨大的小任务,可能提升性能)。#48750(Sergei Trifonov)。
- 降低了多个
ALTER DELETE变更的内存使用。#48522(Nikolai Kochetov)。 - 当启用
skip_unavailable_shards设置时,移除了多余的连接尝试。#48771(Azat Khuzhin)。
实验性功能
- 查询缓存中的条目现在会被压缩到
max_block_size大小并进行压缩。 #45912 (Robert Schulze). - 现在可以在查询缓存中定义按用户的配额。 #48284 (Robert Schulze).
- 针对并行副本的一些修复。 #48433 (Nikita Mikhaylov).
- 在加密磁盘上实现 zero-copy replication(实验性功能)。 #48741 (Vitaly Baranov).
改进
- 将
connect_timeout_with_failover_ms的默认值提升至 1000 ms(因为在 https://github.com/ClickHouse/ClickHouse/pull/47229 中引入了异步连接)。关闭 #5188。#49009(Kruglov Pavel)。 - 围绕数据湖进行了一系列改进:- 让
Iceberg能够处理非分区数据。- 支持Iceberg格式版本 v2(此前仅支持 v1)。- 支持为DeltaLake/Hudi读取分区数据。- 通过使用 Delta 的 checkpoint 文件更快地读取DeltaLake元数据。- 修复了错误的Hudi读取行为:此前会错误地选择要读取的数据,因此只能正确读取小表。- 使这些引擎能够感知并应用数据变更(此前状态在表创建时就被固定)。- 使用 Spark 为Iceberg/DeltaLake/Hudi编写并完善了测试。#47307(Kseniia Sumarokova)。 - 为 socket 添加异步连接和异步写入支持。使跨分片创建连接和发送查询/外部表操作变为异步。使用 fibers 重构代码。修复并关闭 #46931。该 PR 合并后,我们将能够默认提高
connect_timeout_with_failover_ms的取值(https://github.com/ClickHouse/ClickHouse/issues/5188)。#47229(Kruglov Pavel)。 - 支持在配置中使用
keeper/keeper_server段作为zookeeper的替代。关闭 #34766、#34767。#35113 (李扬)。 - 现在可以在以 ClickHouse 表作为数据源的字典的 named_collections 中设置 secure 标志。解决了#38450 问题。#46323(Ilya Golshtein)。
bitCount函数现在支持FixedString和String数据类型。 #49044 (flynn)。- 为 Backup 查询中与 [Zoo]Keeper 相关的所有操作新增了可配置的重试机制。#47224 (Nikita Mikhaylov).
- 默认为 S3 启用
use_environment_credentials,从而默认构建完整的 provider 链。 #47397 (Antonio Andelic). - 目前,
JSON_VALUE函数与 Spark 的get_json_object函数类似,都支持通过路径(如'$.key')从 JSON 字符串中获取值。但它们仍然存在一些差异:1. Spark 的get_json_object在路径不存在时会返回null,而JSON_VALUE会返回空字符串;2. Spark 的get_json_object对于复杂类型的值(例如 JSON 对象/数组)会返回该复杂值,而JSON_VALUE会返回空字符串。 #47494 (KevinyhZou). - 针对
use_structure_from_insertion_table_in_table_functions,改进了插入表结构向表函数传播的灵活性。修复了名称映射和使用虚拟列时的问题。不再需要使用auto设置。#47962 (Yakov Olkhovskiy)。 - 如果查询已被终止或超出限制,则不要继续重试连接 Keeper。 #47985 (Raúl Marín)。
- 在
BSONEachRow中支持 Enum 类型的输入和输出,允许所有 map 键类型,并在输出时避免额外计算。#48122 (Kruglov Pavel)。 - 在
ORC/Arrow/Parquet格式中支持更多 ClickHouse 数据类型:Enum(8|16)、(U)Int(128|256)、Decimal256(针对 ORC),允许从 Int32 值读取 IPv4(ORC 将 IPv4 输出为 Int32,此前无法将其读回),修复ORC从二进制数据读取 Nullable(IPv6) 时的问题。 #48126 (Kruglov Pavel). - 为表
system.storage_policies新增列perform_ttl_move_on_insert和load_balancing,并将列volume_type的类型修改为Enum8。 #48167 (lizhuoyu5). - 新增对
BACKUP ALL命令的支持,该命令会备份所有表和数据库,包括临时表和系统表。#48189 (Vitaly Baranov). - 函数 mapFromArrays 支持将
Map类型作为输入。#48207 (李扬)。 - 某些
SHOW PROCESSLIST的输出现在已排序。#48241 (Robert Schulze)。 - 针对远程 IO、本地 IO 及备份操作的按查询/按服务器限流(服务器级设置:
max_remote_read_network_bandwidth_for_server、max_remote_write_network_bandwidth_for_server、max_local_read_bandwidth_for_server、max_local_write_bandwidth_for_server、max_backup_bandwidth_for_server,查询级设置:max_remote_read_network_bandwidth、max_remote_write_network_bandwidth、max_local_read_bandwidth、max_local_write_bandwidth、max_backup_bandwidth)。 #48242 (Azat Khuzhin)。 - 在
CapnProto格式中支持更多类型:Map、(U)Int(128|256)、Decimal(128|256)。在输入/输出时允许进行整数类型转换。#48257(Kruglov Pavel)。 - 不要在正常情况下抛出 CURRENT_WRITE_BUFFER_IS_EXHAUSTED 错误。 #48288 (Raúl Marín).
- 添加新设置
keeper_map_strict_mode,为在KeeperMap表上执行的操作提供额外的严格保证。#48293(Antonio Andelic)。 - 检查 simple dictionary 的主键类型是否为原生无符号整数类型。为兼容性新增设置
check_dictionary_primary_key(将check_dictionary_primary_key = false以禁用检查)。#48335 (lizhuoyu5). - 无需为
KeeperMap复制变更操作,因为没有必要。#48354(Antonio Andelic)。 - 允许在 Protobuf 格式中将未命名的 Tuple 读写为嵌套的 Message。Tuple 元素与 Message 字段按位置匹配。#48390 (Kruglov Pavel)。
- 在新计划器中支持
additional_table_filters和additional_result_filter设置,并为additional_result_filter添加文档条目。 #48405 (Dmitry Novik)。 parseDateTime现在支持格式字符串 '%f'(表示小数秒)。#48420 (Robert Schulze).- 在
formatDateTime()中,格式字符串 "%f" 现在在被格式化的值不包含小数秒时会打印 "000000",可以通过设置 "formatdatetime_f_prints_single_zero = 1" 来恢复之前的行为(打印单个零)。#48422 (Robert Schulze). - 不再为 KeeperMap 复制 DELETE 和 TRUNCATE 操作。 #48434 (Antonio Andelic).
- 在 generateRandom 函数中生成有效的 Decimal 和 Bool 值。#48436 (Kruglov Pavel)。
- 允许在 SELECT 查询的表达式列表中使用末尾逗号,例如
SELECT a, b, c, FROM table。关闭了 #37802。#48438(Nikolay Degterinsky)。 - 使用客户端参数
--user和--password覆盖环境变量CLICKHOUSE_USER和CLICKHOUSE_PASSWORD。修复了 #38909。#48440(Nikolay Degterinsky)。 - 在遇到可重试错误时,为
MergeTree表的数据 part 加载添加了重试机制。 #48442 (Anton Popov). - 为
arrayMin、arrayMax、arrayDifference函数新增对Date、Date32、DateTime、DateTime64数据类型的支持。解决了 #21645 中提出的问题。#48445(Nikolay Degterinsky)。 - 添加对
{server_uuid}宏的支持。它可用于在自动扩缩容集群中标识副本,当运行期间不断有新副本被添加或移除时尤为有用。此更改修复了 #48554。#48563(Alexey Milovidov)。 - 安装脚本在可行时会创建硬链接,而不是进行复制。#48578(Alexey Milovidov)。
- 支持
SHOW TABLE语法,其含义等同于SHOW CREATE TABLE。关闭 #48580。#48591(flynn)。 - HTTP 临时缓冲区现在支持通过从虚拟文件系统缓存中逐出数据来运作。 #48664 (Vladimir C).
- 使 schema 推断适用于
CREATE AS SELECT。关闭 #47599。#48679(flynn)。 - 为
ReplicatedMergeTree新增了replicated_max_mutations_in_one_entry设置项,用于限制每个MUTATE_PART记录中的变更命令数量(默认值为 10000)。 #48731 (Alexander Tokmakov). - 在 AggregateFunction 类型中,不要将 arena 中未使用的字节计入
read_bytes。#48745 (Raúl Marín). - 修复了在使用 MySQL 字典源和命名集合时,某些与 MySQL 相关的设置未被处理的问题。解决了 #48402。#48759(Kseniia Sumarokova)。
- 如果用户将
max_single_part_upload_size设置得非常大,可能会因为 AWS S3 SDK 中的一个 Bug 而导致崩溃。此修复解决了 #47679。#48816(Alexey Milovidov)。 - 修复
RabbitMQ中的数据竞争(报告),并重构代码。#48845(Kseniia Sumarokova)。 - 为
system.parts和system.part_log添加name和part_name别名。关闭 #48718。#48850 (sichenzhao)。 - 函数 "arrayDifferenceSupport()"、"arrayCumSum()" 和 "arrayCumSumNonNegative()" 现已支持宽整数类型 (U)Int128/256 的输入数组。#48866 (cluster)。
clickhouse-client中的多行命令历史现在不再添加前导空格。这使得粘贴操作更加自然。#48870(Joanna Hulboj)。- 在极少数情况下,当在 LXC 中运行 ClickHouse 并使用 LXCFS 时,我们做了一点小改进。LXCFS 存在一个问题:有时在读取
/proc中的文件时会返回错误 “Transport endpoint is not connected”。该错误此前已被正确记录到 ClickHouse 服务器日志中。我们另外通过重新打开文件来规避此问题。这是一个极其微小的改动。#48922 (Real)。 - 改进预取的内存统计。在 CI 中随机化预取配置。#48973 (Kseniia Sumarokova).
- 为 GCS 上的原生复制操作正确设置请求头。 #48981 (Antonio Andelic).
- 在命令行中新增对使用连字符而非下划线来指定设置名称的支持,例如可以使用
--max-threads来替代--max_threads。此外,支持使用 Unicode 破折号类字符(例如用—替代--)——当你与另一家公司的团队协作,而该团队的一位经理从 MS Word 中复制粘贴了代码时,这会非常有用。#48985 (alekseygolub)。 - 在使用 SSL 用户证书进行身份验证失败时,添加回退到密码身份验证的机制。关闭 #48974。#48989(Nikolay Degterinsky)。
- 改进嵌入式仪表板。解决 #46671。#49036 (Kevin Zhang)。
- 为日志消息添加 profile event 统计,以便可以轻松按严重性查看各级日志消息的数量。 #49042 (Alexey Milovidov)。
- 在之前的版本中,存在 DOS 或 macOS Classic 换行符时,
LineAsString格式在是否启用并行解析的情况下表现不一致。此更改关闭了 #49039。#49052(Alexey Milovidov)。 - 关于未解析查询参数的异常消息现在也会包含该参数的名称。重新实现 #48878。关闭 #48772。 #49061(Alexey Milovidov)。
构建/测试/打包改进
- 更新时区。以下时区已更新:Africa/Cairo、Africa/Casablanca、Africa/El_Aaiun、America/Bogota、America/Cambridge_Bay、America/Ciudad_Juarez、America/Godthab、America/Inuvik、America/Iqaluit、America/Nuuk、America/Ojinaga、America/Pangnirtung、America/Rankin_Inlet、America/Resolute、America/Whitehorse、America/Yellowknife、Asia/Gaza、Asia/Hebron、Asia/Kuala_Lumpur、Asia/Singapore、Canada/Yukon、Egypt、Europe/Kirov、Europe/Volgograd、Singapore。 #48572 (Alexey Milovidov).
- 减少头文件中的依赖数量以加快构建速度。#47984 (Dmitry Novik).
- 在测试中随机化 marks 和索引的压缩方式。#48286 (Alexey Milovidov).
- 将内部 ZSTD 从 1.5.4 升级到 1.5.5。#46797 (Robert Schulze).
- 在测试中随机化从 compact parts 到 wide parts 的纵向合并。#48287 (Raúl Marín).
- 支持 HDFS 中的 CRC32 校验和,并修复性能问题。#48614 (Alexey Milovidov).
- 移除 GCC 支持的残余代码。#48671 (Robert Schulze).
- 添加启用新 analyzer 基础设施的 CI 任务。#48719 (Dmitry Novik).
Bug 修复(官方稳定版本中用户可见的异常行为)
- 修复 system.query_views_log 在处理由后台线程推送的物化视图时的问题 #46668(Azat Khuzhin)。
- 修复多个
RENAME COLUMN相关的错误 #46946(alesapin)。 - 修复 clickhouse-format 中的一些次要高亮显示问题 #47610 (Natasha Murashkina)。
- 修复 LLVM 的 libc++ 中的一个 bug,该 bug 会在上传大小超过 INT_MAX 的 S3 分片时导致崩溃 #47693 (Azat Khuzhin)。
- 修复
sparkbar函数中的溢出 #48121 (Vladimir C)。 - 修复 S3 中的竞态条件 #48190 (Anton Popov).
- 由于出现不一致的行为,禁用聚合函数的 JIT #48195 (Alexey Milovidov).
- 修复 ALTER 语句格式(小改动) #48289 (Natasha Murashkina).
- 修复 RabbitMQ 中的 CPU 使用率问题(该问题在 23.2 版本中于 #44404 之后有所恶化)#48311(Kseniia Sumarokova)。
- 修复在 Distributed 表上执行 Merge 时 EXPLAIN PIPELINE 崩溃的问题 #48320 (Azat Khuzhin).
- 修复将 LowCardinality 序列化为 Arrow 字典时的问题 #48361(Kruglov Pavel)。
- 重置 TemporaryFileStream 中缓存文件段的下载器 #48386 (Vladimir C).
- 修复在执行 DROP/REPLACE PARTITION 时可能出现的 SYSTEM SYNC REPLICA 卡住问题 #48391 (Azat Khuzhin).
- 修复在加载依赖字典的分布式表时的启动错误 #48419(MikhailBurdukov)。
- 在对系统表执行自动重命名时不检查依赖关系 #48431(Raúl Marín)。
- 仅更新 KeeperMap 存储中受影响的行 #48435 (Antonio Andelic)。
- 修复 VFS 缓存中的潜在段错误 #48469(Kseniia Sumarokova)。
- 如果未提供常量字符串,
toTimeZone函数会抛出错误 #48471 (Jordi Villar)。 - 修复 Protobuf 中 IPv4 处理的逻辑错误,并添加对 Date32 的支持 #48486 (Kruglov Pavel)。
- system.settings 系统表中的 “changed” 标志在处理多值设置时计算不正确 #48516 (MikhailBurdukov)。
- 修复启用压缩时的
Memory存储 #48517 (Anton Popov)。 - 修复在客户端重新连接时,bracketed-paste 模式导致密码输入混乱的问题 #48528(Michael Kolupaev)。
- 修复键为 IP 和 UUID 类型的嵌套 map #48556 (Yakov Olkhovskiy).
- 修复在使用哈希字典并行加载器时出现的未捕获异常 #48571 (Azat Khuzhin).
groupArray聚合函数在可空类型上处理空结果时现在能正常工作 #48593 (lgbo)。- 修复 Keeper 中一个错误:在 ACL 中使用
auth方案时,有时不会创建节点。#48595(Aleksei Filatov)。 - 允许对 IPv4 与 UInt 使用比较运算符 #48611(Yakov Olkhovskiy)。
- 修复可能由缓存引起的错误 #48636(Kseniia Sumarokova)。
- 对空数据执行的异步插入将不再抛出异常。 #48663 (Anton Popov).
- 在
RENAME TABLE失败时修复表的依赖关系 #48683 (Azat Khuzhin). - 如果主键包含重复列(这种情况仅在 projection 中才可能出现),在先前的版本中可能会导致一个 bug #48838(Amos Bird)。
- 修复 ZooKeeper 在 join send_thread/receive_thread 时的竞争条件 #48849 (Alexander Gololobov)。
- 修复在零拷贝复制中尝试删除被忽略的已分离 part 时出现的意外 part 名称错误 #48862(Michael Lex)。
- 修复从 Parquet/Arrow 读取
Date32列时未得到Date32列的问题 #48864 (Kruglov Pavel). - 修复从带有行级策略且包含点号列的表中进行查询时出现的
UNKNOWN_IDENTIFIER错误 #48976 (Kruglov Pavel)。 - 修复按空 Nullable 字符串进行聚合时的问题 #48999 (LiuNeng)。
ClickHouse 23.3 LTS 版本,2023-03-30
升级说明
- 轻量级 DELETE 已达到生产可用级别并默认启用。针对 MergeTree 表的
DELETE查询现在默认可用。 *domain*RFC和netloc函数的行为有轻微变更:放宽了 URL authority 中允许的符号集合,以更好地符合相关规范。#46841(Azat Khuzhin)。- 禁止基于 KafkaEngine 创建在列上带有 DEFAULT/EPHEMERAL/ALIAS/MATERIALIZED 子句的表。#47138(Aleksandr Musorin)。
- 移除了“异步连接排空(asynchronous connection drain)”功能。相关设置和指标也一并移除。该功能为内部特性,因此移除不应影响那些此前从未使用或了解过该功能的用户。#47486(Alexander Tokmakov)。
- 在
arraySum/Min/Max/Avg/Product、arrayCumSum/CumSumNonNegative、arrayDifference、数组构造、IN 运算符、查询参数、groupArrayMovingSum、统计函数、min/max/any/argMin/argMax、PostgreSQL 线协议、MySQL 表引擎和函数、sumMap、mapAdd、mapSubtract、arrayIntersect中支持 256 位 Decimal 数据类型(超过 38 位数字)。在arrayIntersect中增加对大整数的支持。涉及矩(moment)的统计聚合函数(例如corr或各种TTest)将使用Float64作为其内部表示(此前使用的是Decimal128,但没有必要),并且在方差为无穷大时,这些函数可以返回nan而不是inf。此前某些函数虽然允许在Decimal256数据类型上使用,但会返回Decimal128——现在这一点已修复。此更改关闭了 #47569。此更改关闭了 #44864。此更改关闭了 #28335。#47594(Alexey Milovidov)。 - 将 backup_threads/restore_threads 改为服务器级设置(而非用户级设置)。#47881(Azat Khuzhin)。
- 不再允许常量二级索引和非确定性二级索引。#46839(Anton Popov)。
新功能
- 通过设置
parallel_replicas_custom_key和parallel_replicas_custom_key_filter_type,新增了一种在副本之间划分负载的模式。如果集群由单个分片和多个副本组成,将会随机选择最多max_parallel_replicas个副本并将其视作分片。对于每个分片,在请求发送到该分片之前,会在发起端的查询中添加相应的过滤条件。如果集群由多个分片组成,其行为将与sample_key相同,但可以定义任意自定义键。#45108 (Antonio Andelic)。 - 新增在取消时显示部分结果的选项:添加了查询设置
partial_result_on_first_cancel,允许被取消的查询(例如由于 Ctrl-C)返回部分结果。#45689(Alexey Perevyshin)。 - 为临时表添加了对任意表引擎的支持(
Replicated和KeeperMap引擎除外)。关闭 #31497。#46071(Roman Vasin)。 - 通过在 Keeper 中使用集中式存储,为用户定义的 SQL 函数新增复制支持。#46085 (Aleksei Filatov)。
- 实现
system.server_settings(类似于system.settings),用于存储服务器配置。#46550 (pufit). - 新增对
UNDROP TABLE查询的支持。关闭 #46811。#47241(chen)。 - 允许为具名集合单独授予权限(例如,只为某些集合授予
SHOW/CREATE/ALTER/DROP named collection访问权限,而不是一次性对所有集合授予)。修复 #40894。新增访问类型NAMED_COLLECTION_CONTROL,该访问类型不会默认授予用户,除非在用户配置中显式添加(执行GRANT ALL时需要该权限),同时,show_named_collections不再是必须为默认用户手动指定的选项,默认用户仍然可以像在 23.2 中那样拥有完整访问权限。#46241(Kseniia Sumarokova)。 - 允许使用嵌套的自定义磁盘。之前,自定义磁盘仅支持扁平结构。#47106 (Kseniia Sumarokova)。
- 引入
widthBucket函数(同时提供兼容性的别名WIDTH_BUCKET)。#42974。#46790(avoiderboi)。 - 根据指定的格式字符串新增函数
parseDateTime/parseDateTimeInJodaSyntax。parseDateTime按 MySQL 语法将字符串解析为 DateTime,parseDateTimeInJodaSyntax按 Joda 语法进行解析。#46815 (李扬)。 - 将
dummy UInt8用作表函数null的默认结构。关闭 #46930。#47006(flynn)。 - 在
parseDateTimeBestEffort函数中增加了对带逗号的日期格式(例如Dec 15, 2021)的支持。关闭了 #46816。#47071(chen)。 - 为 HTTP 接口新增了设置
http_wait_end_of_query和http_response_buffer_size,它们分别对应 URL 参数wait_end_of_query和buffer_size。这使得可以在 profiles 中修改这些设置。#47108 (Vladimir C)。 - 添加
system.dropped_tables表,用于显示在Atomic数据库中已被删除但尚未彻底移除的表。#47364 (chen)。 - 添加
INSTR作为positionCaseInsensitive的别名,以实现与 MySQL 的兼容性。解决 #47529。#47535(flynn)。 - 新增
toDecimalString函数,用于将数字转换为具有固定小数位数的字符串。#47838 (Andrey Zvonov)。 - 新增 MergeTree 设置项
max_number_of_mutations_for_replica。它将每个副本的分片变更(mutation)数量限制为指定值。0 表示对每个副本的变更数量不设上限(执行仍然可能受其他设置约束)。 #48047 (Vladimir C)。 - 添加了 Map 相关函数
mapFromArrays,用于由一对数组构造 map。 #31125 (李扬)。 - 允许在 Parquet/ORC/Arrow 输出格式中控制压缩,并新增对更多压缩输入格式的支持。修复了 #13541。#47114(Kruglov Pavel)。
- 为原生协议添加 SSL 用户证书身份验证。解决 #47077。#47596 (Nikolay Degterinsky)。
- 为
parseDateTime添加 *OrNull() 和 *OrZero() 变体,并添加别名str_to_date以实现与 MySQL 的一致性。#48000 (Robert Schulze). - 添加了
REGEXP运算符(类似于 "LIKE"、"IN"、"MOD" 等运算符),以提高与 MySQL 的兼容性 #47869 (Robert Schulze)。
性能优化
- 内存中的标记现采用压缩存储方式,内存占用减少约 3–6 倍。 #47290 (Michael Kolupaev).
- 在之前的版本中,对大量文件进行备份的速度慢得难以置信。现在则快得难以置信。#47251 (Alexey Milovidov)。为备份的 I/O 操作引入了一个单独的线程池,可以让其独立于其他线程池进行扩展,从而提升性能。#47174 (Nikita Mikhaylov)。在备份处理的最后阶段,使用 MultiRead 请求和重试机制来收集元数据。#47243 (Nikita Mikhaylov)。如果备份和恢复的数据都在 S3 中,则从现在起将使用服务端复制。#47546 (Vitaly Baranov)。
- 修复了使用
FINAL的查询中过度读取的问题。 #47801 (Nikita Taranov). - 在服务器启动时,
max_final_threads会被设置为当前 CPU 核心数(使用与max_threads相同的算法)。这提升了在拥有大量 CPU 的服务器上执行final时的并发度。#47915 (Nikita Taranov)。 - 允许在多线程中为具有 CLICKHOUSE 源的 DIRECT 字典执行读取管线。要启用此功能,请在
CREATE DICTIONARY语句中为该 source 的SETTINGS部分设置dictionary_use_async_executor=1。#47986 (Vladimir C)。 - 优化包含单个可空键的聚合操作性能。 #45772 (LiuNeng).
- 为
hasTokenOrNull、hasTokenCaseInsensitive和hasTokenCaseInsensitiveOrNull引入了对小写tokenbf_v1索引的支持。 #46252 (ltrk2). - 通过使用 SIMD 先搜索前两个字符来优化
position和LIKE函数。#46289 (Jiebin Sun). - 优化对
system.detached_parts的查询,该表可能会非常大。考虑到块大小限制,添加了多个来源;在每个块中都使用 IO 线程池来计算分片大小,即并行执行系统调用。#46624 (Sema Checherinda)。 - 将 ReplicatedMergeTree 表的
max_replicated_merges_in_queue默认值从 16 增加到 1000,从而在具有大量副本的集群(例如在 ClickHouse Cloud 中使用共享存储的集群)上可以更快速地执行后台合并操作。#47050(Alexey Milovidov)。 - 将
clickhouse-copier更新为使用GROUP BY而不是DISTINCT来获取分区列表。对于大型表,这将查询耗时从 500 多秒降低到不足 1 秒。#47386 (Clayton McClure)。 - 修复
ASOF JOIN中的性能退化问题。#47544 (Ongkong)。 - 在 Keeper 中进一步增加批处理。通过避免在读取请求时打断批次来提升性能。#47978 (Antonio Andelic).
- 允许对列具有不同 DEFAULT 表达式的 Merge 表使用 PREWHERE。 #46831 (Azat Khuzhin).
实验性功能
- 并行副本:通过更好地利用本地副本提升整体性能,并且默认禁止对非复制 MergeTree 表使用并行副本读取。#47858 (Nikita Mikhaylov)。
- 在启用实验性 Analyzer 时,支持对使用
Join、Dictionary和EmbeddedRocksDB表的 JOIN 将过滤条件下推到左表。#47280 (Maksim Kita)。 - 现在使用零拷贝复制的 ReplicatedMergeTree 对 Keeper 的负载更小。#47676 (alesapin)。
- 修复了使用 MaterializedPostgreSQL 创建物化视图的问题。#40807 (Maksim Buren)。
改进
- 默认启用
input_format_json_ignore_unknown_keys_in_named_tuple。#46742 (Kruglov Pavel). - 允许在向物化视图推送数据时忽略错误(新增设置
materialized_views_ignore_errors,默认值为false,但在将日志无条件刷新到system.*_log表时,该设置为true)。 #46658 (Azat Khuzhin). - 在内存中跟踪分布式发送中的文件队列。#45491 (Azat Khuzhin).
- 现在,通过 HTTP 协议执行的所有查询,其响应中都会添加
X-ClickHouse-Query-Id和X-ClickHouse-Timezone这两个响应头。此前,这只对SELECT查询生效。#46364 (Anton Popov)。 - 来自
MongoDB的外部表:支持通过包含 host:port 列表的 URI 连接到副本集,并在 MongoDB 字典中支持 readPreference 选项。示例 URI:mongodb://db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/?replicaSet=myRepl&readPreference=primary。 #46524 (artem-yadr)。 - 此项改进对用户应当是透明的。基于查询计划重新实现投影分析。新增设置项
query_plan_optimize_projection=1,用于在旧版和新版实现之间切换。修复 #44963。#46537(Nikolai Kochetov)。 - 在输出格式中默认使用 Parquet v2 格式而不是 v1。新增设置项
output_format_parquet_version用于控制 Parquet 版本,可选值为1.0、2.4、2.6、2.latest(默认)。 #46617 (Kruglov Pavel). - 现在可以使用新的配置语法来配置名称中包含点号(
.)的 Kafka 主题。 #46752 (Robert Schulze)。 - 修复用于检查 Hyperscan 模式中有问题重复的启发式算法。 #46819 (Robert Schulze).
- 当由不同副本并发创建块时,不要因 ZK 节点已存在而向 system.errors 报错。 #46820 (Raúl Marín).
- 提高
clickhouse-local的已打开文件数量上限。这样它就能够在拥有大量 CPU 核心的服务器上读取web表。在已打开文件过多的情况下,也不要因为这个原因而停止从 URL 表引擎读取数据。此更改关闭了 #46852。#46853(Alexey Milovidov)。 - 当无法解析数字时抛出的异常,现在具有更易读的异常消息。#46917(Robert Schulze)。
- 在每处理完一个任务后更新
system.backups,以跟踪备份进度。 #46989 (Aleksandr Musorin). - 在 Native 输入格式中允许类型转换。新增
input_format_native_allow_types_conversion设置用于控制该行为(默认启用)。#46990(Kruglov Pavel)。 - 在
range函数中支持使用 IPv4 来生成 IP 范围。#46995 (Yakov Olkhovskiy)。 - 当无法将某个 part 从一个卷/磁盘移动到另一个卷/磁盘时,改进异常消息。#47032 (alesapin).
- 在
JSONType函数中支持Bool类型。此前对于 bool 值会错误地返回Null类型。#47046 (Anton Popov)。 - 使用
_request_body参数配置预定义的 HTTP 查询。#47086 (Constantine Peresypkin)。 - 在内置 UI 的 SQL 编辑器中,按下 Enter 键时会自动缩进。#47113(Alexey Korepanov)。
- 使用 'sudo' 进行自解压时,将尝试把解压出的文件的 uid 和 gid 设为当前执行用户的值。#47116 (Yakov Olkhovskiy)。
- 此前,
repeat函数的第二个参数只接受无符号整数类型,这意味着它无法接受诸如 -1 之类的值,其行为与 Spark 中的同名函数不一致。此次更新中,repeat函数已调整为与 Spark 函数的行为保持一致,现在可以接受相同类型的输入,包括负整数。我们已进行了大量测试,以验证更新后实现的正确性。#47134(KevinyhZou)。注意:此变更日志条目由 ChatGPT 重写。 - 从堆栈跟踪中移除
::__1部分。在堆栈跟踪中将std::basic_string<char, ...显示为String。#47171(Mike Kot)。 - 重新实现 interserver 模式以避免重放攻击(注意,此更改与旧版服务器向后兼容)。#47213 (Azat Khuzhin)。
- 改进对正则表达式分组的识别,并优化
regexp_tree字典。#47218 (Han Fei)。 - Keeper 改进:新增 4LW 命令
clrs,用于清理 Keeper 使用的资源(例如释放未使用的内存)。#47256(Antonio Andelic)。 - 为编解码器
DoubleDelta(bytes_size)、Gorilla(bytes_size)、FPC(level, float_size)添加可选参数,这样可以在clickhouse-compressor中在不指定列类型的情况下使用这些编解码器。修复在clickhouse-compressor中使用这些编解码器时可能出现的进程中止和算术错误。修复:(https://github.com/ClickHouse/ClickHouse/discussions/47262)。#47271(Kruglov Pavel)。 - 为
runningDifference函数添加对 bigint 类型的支持。修复 #47194。#47322(Nikolay Degterinsky)。 - 为具有过期时间的 S3 凭证添加一个过期缓冲窗口,以避免在某些边界情况下出现
ExpiredToken错误。可以通过expiration_window_seconds配置进行控制,默认值为 120 秒。#47423(Antonio Andelic)。 - 在
Avro格式中支持 Decimal 和 Date32。#47434(Kruglov Pavel)。 - 如果检测到从
Ordinary到Atomic的转换被中断,则不要启动服务器,并输出更清晰的错误信息,其中包含故障排查说明。#47487(Alexander Tokmakov)。 - 向
system.opentelemetry_span_log新增一列kind。该列存储 OpenTelemetry 中定义的 SpanKind 的值。#47499(Frank Chen)。 - 允许在
Protobuf格式中仅使用根字段名作为列名来读写嵌套数组。此前,列名必须包含所有嵌套字段名(例如a.b.c Array(Array(Array(UInt32)))),现在只需使用a Array(Array(Array(UInt32)))即可。 #47650 (Kruglov Pavel)。 - 为
SYSTEM SYNC REPLICA增加了可选的STRICT修饰符,使查询等待复制队列变为空(与 https://github.com/ClickHouse/ClickHouse/pull/45648 之前的行为相同)。#47659(Alexander Tokmakov)。 - 改进了一些 OpenTelemetry Span 日志的命名。#47667 (Frank Chen).
- 避免使用过长的聚合函数组合器链(在分析阶段可能导致查询变慢)。修复了 #47715。#47716(Alexey Milovidov)。
- 支持在参数化视图中使用子查询;解决了 #46741 #47725(SmitaRKulkarni)。
- 修复 MySQL 集成中的内存泄漏(当
connection_auto_close=1时可复现)。#47732 (Kseniia Sumarokova). - 改进了与 Decimal 参数相关代码中的错误处理,使错误消息更加详尽。此前,当传入不正确的 Decimal 参数时,生成的错误消息不够清晰或帮助不大。通过此次更新,已修正为打印出更详细且更有用的错误信息,从而更容易识别并纠正与 Decimal 参数相关的问题。#47812(Yu Feng)。注意:此变更日志条目由 ChatGPT 重写。
- 参数
exact_rows_before_limit用于让rows_before_limit_at_least能够准确反映在达到 limit 之前返回的行数。该 pull request 解决了当查询涉及跨多个分片的分布式处理或排序操作时遇到的问题。在此更新之前,这些场景未按预期工作。#47874(Amos Bird)。 - ThreadPools 指标自检。#47880 (Azat Khuzhin).
- 添加
WriteBufferFromS3Microseconds和WriteBufferFromS3RequestsErrorsprofile 事件。#47885(Antonio Andelic)。 - 在 ClickHouse 安装中添加
--link和--noninteractive(-y) 选项。修复 #47750。#47887(Nikolay Degterinsky)。 - 修复了在附加到其依赖表不可用的物化视图时出现的
UNKNOWN_TABLE异常。这在尝试从备份恢复状态时可能会很有用。#47975 (MikhailBurdukov)。 - 修复在加密磁盘配置中未添加可选
path字段时出现的问题。#47981(Kseniia Sumarokova)。 - 实现参数化视图对 CTE 的支持:已更新以便在评估标量子查询时允许使用查询参数。#48065(SmitaRKulkarni)。
- 支持大整数
(U)Int128/(U)Int256、任意键类型的Map以及任意精度(不限于 3 和 6)的DateTime64。 #48119 (Kruglov Pavel)。 - 允许在行输入格式中忽略因未知枚举值导致的错误。#48133 (Alexey Milovidov).
构建/测试/打包改进
- ClickHouse 现在使用
C++23进行构建。#47424(Robert Schulze)。 - 在 AST Fuzzer 中对
EXPLAIN查询进行模糊测试。#47803 #47852(flynn)。 - 将压力测试与自动化的向后兼容性检查(现称为升级检查)拆分开来。#44879(Kruglov Pavel)。
- 更新 Docker 使用的 Ubuntu 镜像,以减少一些虚假的安全报告。#46784(Julio Jimenez)。请注意,ClickHouse 没有依赖项,也不需要 Docker。
- 在使用 "curl | sh" 下载 ClickHouse 时,新增一个提示,用于在已存在
clickhouse可执行文件时允许删除。提示为 "ClickHouse binary clickhouse already exists. Overwrite? [y/N]"。#46859(Dan Roscigno)。 - 修复在旧发行版(例如 Amazon Linux 2)以及 ARM 平台上,服务器启动期间出现的找不到 glibc 2.28 符号的错误。#47008(Robert Schulze)。
- 为 clang 16 做准备。#47027(Amos Bird)。
- 新增一个 CI 检查,以确保 ClickHouse 能在 ARM 上配合旧版本 glibc 运行。#47063(Robert Schulze)。
- 增加样式检查,以防止错误使用
NDEBUG宏。#47699(Alexey Milovidov)。 - 略微加快了构建速度。#47714(Alexey Milovidov)。
- 将
vectorscan升级到 5.4.9。#47955(Robert Schulze)。 - 添加单元测试,以断言 Apache Arrow 的致命日志不会导致进程中止。该测试覆盖了 ClickHouse/arrow#16 中的更改。#47958(Arthur Passos)。
- 恢复原生 macOS 调试服务器构建版本的可启动性。#48050(Robert Schulze)。注意:此更改仅与开发相关,因为 ClickHouse 官方构建是通过交叉编译完成的。
错误修复(官方稳定版本中用户可见的异常行为)
- 修复 formats 解析器被重置的问题,并在
Kafka中测试对错误消息的处理 #45693 (Kruglov Pavel)。 - 修复 Keeper 中的数据大小计算 #46086 (Antonio Andelic)。
- 修复了在
ReplicatedMergeTree表和Atomic数据库上自动重试DROP TABLE查询时的一个 bug。在极少数情况下,如果 ZooKeeper 会话在执行 DROP 期间过期,且同时创建了一个在 ZooKeeper 中具有相同路径的新复制表,则可能会导致Can't get data for node /zk_path/log_pointer和The specified key does not exist错误。#46384(Alexander Tokmakov)。 - 修复在规范化查询时出现的错误别名递归问题,该问题会导致某些查询无法运行。#46609 (Raúl Marín).
- 修复二进制格式中 IPv4/IPv6 的序列化/反序列化 #46616 (Kruglov Pavel)。
- ActionsDAG:在优化过程中不要更改
and运算的结果 #46653 (Salvatore Mesoraca)。 - 在客户端异常退出时改进查询取消机制 #46681 (Alexander Tokmakov)。
- 修复聚合优化中的算术运算问题 #46705 (Duc Canh Le).
- 修复
clickhouse-local在推断 JSONEachRow 模式时可能发生的异常中止问题 #46731 (Kruglov Pavel). - 修复在更改已过期角色时出现的问题 #46772 (Vitaly Baranov)。
- 修复多步骤处理中合并 PREWHERE 列累积的问题 #46785(Alexander Gololobov)。
- 在 HTTP 读取缓冲区中使用初始 Range 请求来获取文件大小。否则,某些远程文件将无法被处理。#46824(Antonio Andelic)。
- 修复在使用 URL 表时进度条显示不正确的问题 #46830(Antonio Andelic)。
- 修复
maxIntersections函数中的 MSan 报告 #46847(Alexey Milovidov)。 - 修复
Map数据类型中的一个缺陷 #46856(Alexey Milovidov)。 - 修复当 LIKE 模式包含被引号括起来的不可转义字符时,某些 LIKE 搜索返回错误结果的问题 #46875 (Robert Schulze).
- 修复 - 当 FillingTransform 处理空数据块时,WITH FILL 会导致中止 #46897 (Yakov Olkhovskiy).
- 修复在 JSON 中从字符串推断日期和整数类型的问题 #46972 (Kruglov Pavel)。
- 修复在获取数据期间零拷贝复制磁盘选择上的错误 #47010 (alesapin)。
- 修复 systemd 服务定义中的拼写错误 #47051(Palash Goel)。
- 修复在使用 CROSS JOIN 且 algorithm = auto 时出现的 NOT_IMPLEMENTED 错误 #47068(Vladimir C)。
- 修复在将 'part_type' 配置为 'InMemory' 模式(实验性功能)时,'ReplicatedMergeTree' 表无法插入两条相似数据的问题。 #47121 (liding1992).
- External dictionaries / library-bridge:修复错误 "unknown library method 'extDict_libClone'" #47136 (alex filatov).
- 修复 Grace 哈希连接在使用
LIMIT时的竞争条件 #47153(Vladimir C)。 - 修复具体列的 PREWHERE 支持 #47154(Azat Khuzhin)。
- 修复 Query Status 中可能出现的死锁 #47161 (Kruglov Pavel)。
- 禁止对同一个
Join表执行 INSERT SELECT 操作,因为这会导致死锁 #47260 (Vladimir C)。 - 在基于
min_age_to_force_merge_seconds的合并中跳过已合并的分区 #47303 (Antonio Andelic). - 修改 find_first_symbols,使其在 find_first_not_symbols 中按预期工作 #47304 (Arthur Passos)。
- 修复 CSV 中大数字推断问题 #47410 (Kruglov Pavel).
- 对包含别名的表达式禁用逻辑表达式优化器。 #47451 (Nikolai Kochetov).
- 修复
decodeURLComponent中的错误 #47457(Alexey Milovidov)。 - 修复包含投影的 EXPLAIN 图 #47473 (flynn).
- 修复查询参数 #47488 (Alexey Milovidov).
- 参数化视图:修复缺陷。 #47495 (SmitaRKulkarni).
- 数据格式模糊测试器,以及相应的修复。#47519 (Alexey Milovidov).
- 修复对
DateTime64的单调性检查 #47526(Antonio Andelic)。 - 修复 Nullable LowCardinality 列的“块结构不匹配”问题 #47537(Nikolai Kochetov)。
- 正确修复了 Apache Parquet 中的一个缺陷 #45878 #47538(Kruglov Pavel)。
- 修复在文档大小不合法时
BSONEachRow并行解析的问题 #47540(Kruglov Pavel)。 - 在执行
SYSTEM FLUSH DISTRIBUTED命令时保留system.distribution_queue中的错误 #47541 (Azat Khuzhin). - 检查
BSONEachRow格式中的重复列 #47609 (Kruglov Pavel). - 修复在移动操作期间等待零拷贝锁的问题 #47631 (alesapin)。
- 修复按分区聚合 #47634 (Nikita Taranov).
- 修复
BSONEachRow格式中将元组序列化为数组时的错误 #47690(Kruglov Pavel)。 - 修复
polygonsSymDifferenceCartesian中导致崩溃的问题 #47702 (pufit). - 修复从使用
zlib和gzip压缩的存储File读取数据的问题 #47796 (Anton Popov). - 改进 PostgreSQL 的空查询检测(适用于 Go 语言 pgx 驱动)#47854(Azat Khuzhin)。
- 修复 LowCardinality 类型的 DateTime 单调性检查问题 #47860 (Antonio Andelic).
- 在 RESTORE ASYNC 中使用 restore_threads(而不是 backup_threads)#47861(Azat Khuzhin)。
- 修复在包含投影的 ReplicatedMergeTree 上执行 DROP COLUMN 操作的问题 #47883 (Antonio Andelic)。
- 修复 Replicated 数据库恢复问题 #47901 (Alexander Tokmakov)。
- 针对过于冗长的 HTTP 警告的热修复 #47903 (Alexander Tokmakov)。
- 修复
catboostEvaluate中的 “Field value too long” 错误 #47970 (Robert Schulze). - 修复 #36971:Watchdog:在子进程退出时以非零退出码退出 #47973(Коренберг Марк)。
- 修复 “index file
cidxis unexpectedly long” 问题 #48010 (SmitaRKulkarni). - 修复 MaterializedPostgreSQL 查询以获取属性(replica identity)#48015(Solomatov Sergei)。
- parseDateTime(): 修复未定义行为 UB(有符号整数溢出) #48019 (Robert Schulze).
- 为 Avro 中的 Record 使用唯一名称,以避免复用其 schema #48057 (Kruglov Pavel)。
- 正确配置 Keeper 中的 TCP/HTTP 套接字超时时间 #48108(Antonio Andelic)。
- 修复
Avro格式中可能发生的对空指针的成员调用问题 #48184(Kruglov Pavel)。
ClickHouse 版本 23.2,2023-02-23
向后不兼容的变更
- 为函数 "toDayOfWeek()"(别名:"DAYOFWEEK")扩展了一个
mode参数,用于表示一周是从星期一还是星期日开始,以及计数是从 0 还是从 1 开始。为与其他日期时间函数保持一致,mode参数被插入到时间参数和时区参数之间。这会破坏当前对(此前未在文档中说明的)双参数语法 "toDayOfWeek(time, time_zone)" 的使用。修复方法是将函数改写为 "toDayOfWeek(time, 0, time_zone)"。#45233(Robert Schulze)。 - 将设置项
max_query_cache_size重命名为filesystem_cache_max_download_size。#45614(Kseniia Sumarokova)。 default用户默认将不再拥有访问类型SHOW NAMED COLLECTION的权限(例如,default用户将不再能够像之前那样向其他用户授予 ALL,因此该 PR 为向后不兼容)。#46010(Kseniia Sumarokova)。- 如果在 FORMAT 子句之前指定 SETTINGS 子句,这些设置也会应用于格式化。#46003(Azat Khuzhin)。
- 移除对设置
materialized_postgresql_allow_automatic_update的支持(该设置默认是关闭的)。#46106(Kseniia Sumarokova)。 - 略微提升了
countDigits在真实数据集上的性能。这解决了 #44518。在以前的版本中,countDigits(0)返回0;现在返回1,这更加正确,也与现有文档保持一致。#46187(Alexey Milovidov)。 - 禁止创建使用 "Delta" 或 "DoubleDelta" 编解码器与 "Gorilla" 或 "FPC" 编解码器组合压缩的新列。可以通过设置 "allow_suspicious_codecs = true" 来绕过该限制。#45652(Robert Schulze)。
新功能
- 添加对
StorageIceberg和表函数iceberg的支持,用于访问 S3 上的 Iceberg 表存储。 #45384 (flynn). - 允许通过
SETTINGS disk = '<disk_name>'(而不是storage_policy)来配置存储,并支持通过显式创建磁盘SETTINGS disk = disk(type=s3, ...)。#41976 (Kseniia Sumarokova)。 - 在
system.part_log中公开ProfileEvents计数器。#38614(Bharat Nallan)。 - 对现有的
ReplacingMergeTree引擎进行增强,以允许插入重复数据。它在一个 MergeTree 引擎中同时利用ReplacingMergeTree和CollapsingMergeTree的特性。被删除的数据在查询时不会返回,但也不会从磁盘上移除。#41005 (youennL-cs)。 - 添加
generateULID函数。修复 #36536。#44662(Nikolay Degterinsky)。 - 添加
corrMatrix聚合函数,用于计算每一对列之间的相关性。此外,由于聚合函数covarSamp和covarPop与corr类似,顺便也添加了covarSampMatrix、covarPopMatrix。@alexey-milovidov 关闭了 #44587。#44680(FFFFFFFHHHHHHH)。 - 引入
arrayShuffle函数,用于对数组进行随机排列。 #45271 (Joanna Hulboj). - 支持 Arrow 中的
FIXED_SIZE_BINARY类型和 Parquet 中的FIXED_LENGTH_BYTE_ARRAY类型,并将它们映射为FixedString。新增设置项output_format_parquet_fixed_string_as_fixed_byte_array/output_format_arrow_fixed_string_as_fixed_byte_array,用于控制FixedString的默认输出类型。关闭 #45326。#45340(Kruglov Pavel)。 - 在 system.replication_queue 中添加新列
last_exception_time。 #45457 (Frank Chen). - 新增两个函数,使 SipHash128 支持使用用户自定义密钥/种子。 #45513 (Salvatore Mesoraca).
- 允许表函数
format使用三参数版本。关闭 #45808。#45873 (FFFFFFFHHHHHHH)。 - 为
x、w、S增加对JodaTime格式的支持。参见 https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html。#46073(zk_kiger)。 - 新增对窗口函数
ntile的支持。(lgbo) - 新增设置
final,用于将FINAL修饰符隐式应用于每个表。#40945 (Arthur Passos)。 - 新增
arrayPartialSort和arrayPartialReverseSort函数。#46296(Joanna Hulboj)。 - 新的 HTTP 参数
client_protocol_version允许在使用 Native 格式时为 HTTP 响应设置客户端协议版本。#40397。#46360(Geoff Genz)。 - 新增函数
regexpExtract,用于兼容 Spark 函数REGEXP_EXTRACT。它与现有函数extract类似。#46469 (李扬)。 - 新增函数
JSONArrayLength,用于返回最外层 JSON 数组中的元素个数。如果输入的 JSON 字符串无效,则返回 NULL。 #46631 (李扬)。
性能优化
- 如果 PREWHERE 条件是由多个条件构成的合取(cond1 AND cond2 AND ...),上述逻辑就会生效。它会将那些需要读取相同列的条件分组成多个步骤。在每个步骤之后,会计算完整条件中对应的那一部分,并可能对结果行进行过滤。这样可以在后续步骤中读取更少的行,从而节省 IO 带宽并减少计算量。该逻辑目前默认是禁用的。一旦确认不会带来任何回归问题,在未来的某个版本中会默认启用,因此强烈建议在测试中使用。它可以通过两个设置进行控制:"enable_multiple_prewhere_read_steps" 和 "move_all_conditions_to_prewhere"。 #46140 (Alexander Gololobov)。
- 新增了一个选项,可在表的分区键与 GROUP BY 的分组键兼容时独立聚合各分区。通过设置
allow_aggregate_partitions_independently进行控制。由于适用范围有限(请参阅文档),该选项默认处于禁用状态。 #45364 (Nikita Taranov). - 允许对 Compact 格式的分片(part)使用 Vertical merge 算法。这将使 ClickHouse 服务器在执行后台操作时显著减少内存占用。由此关闭了 #46084。#45681 #46282(Anton Popov)。
- 通过使用批量读取器优化
Parquet读取器。#45878 (LiuNeng). - 新增基于异步 Linux io_uring 子系统的
local_filesystem_read_method读取方法io_uring,与默认的pread方法相比,几乎在所有场景下都提升了读取性能。 #38456 (Saulius Valatka)。 - 当在逻辑上等价时,将把
if表达式作为参数的聚合函数改写。例如,可以将avg(if(cond, col, null))改写为avgIf(cond, col)。这有助于提升性能。#44730 (李扬)。 - 使用 AVX-512 指令提升 lower/upper 函数的性能。#37894 (yaqi-zhao).
- 移除在具有大于等于 32 核且禁用 SMT 的系统上,ClickHouse 只使用一半核心这一限制(即在 BIOS 中禁用超线程时的情况)。 #44973 (Robert Schulze)。
- 通过列式执行提升函数
multiIf的性能,速度提升 2.3 倍。 #45296 (李扬)。 - 当 needle 为空时,为
position函数添加快速路径。 #45382 (李扬). - 默认启用
query_plan_remove_redundant_sorting优化功能。该优化最初在 #45420 中实现。#45567(Igor Nikonov)。 - 增大 HTTP 分块传输编码的块大小,以提升通过 HTTP 接口执行大查询时的性能。#45593 (Geoff Genz)。
- 优化了在包含大量
Array/Map/Nested列的表上执行短SELECT查询时的性能。 #45630 (Anton Popov). - 提升大整数和 Decimal 类型过滤时的性能。#45949 (李扬)。
- 这一改动可以有效降低从 ColumnNullable(UInt8) 获取过滤器的开销,并提升整体查询性能。为评估该改动的影响,我们采用了 TPC-H 基准测试,同时将列类型从非可空修改为可空,并以其查询的 QPS 作为性能指标进行测量。#45962(Zhiguo Zhou)。
- 将虚拟列
_part和_partition_id的类型更改为LowCardinality(String)。修复了 #45964。#45975(flynn)。 - 在小数位数不变时提升 Decimal 转换的性能。#46095 (Alexey Milovidov)。
- 允许提高读取数据时的预取量。#46168 (Kseniia Sumarokova).
- 将
arrayExists(x -> x = 1, arr)重写为has(arr, 1),性能提升 1.34 倍。 #46188 (李扬). - 修复在非远程磁盘上进行垂直合并时内存占用过高的问题。对远程磁盘遵守
max_insert_delayed_streams_for_parallel_write设置。#46275 (Nikolai Kochetov). - 将 zstd 更新到 v1.5.4。该版本在性能和压缩比方面有一些小幅改进。如果你运行的副本使用不同版本的 ClickHouse,可能会看到类似
Data after merge/mutation is not byte-identical to data on another replicas.的错误信息,并附带解释。这类信息是正常现象,无需担心。 #46280 (Raúl Marín)。 - 修复由 #39737 导致的性能退化问题。#46309(Alexey Milovidov)。
- 即使在复制队列很大的情况下,
replicas_status接口也会快速响应。#46310 (Alexey Milovidov)。 - 为聚合函数
sum、一元算术函数和比较函数添加 AVX-512 支持。#37870 (zhao zhou)。 - 重写了与 marks 分布及整体读取协调相关的代码,以获得尽可能大的性能提升。关闭了 #34527。#43772(Nikita Mikhaylov)。
- 在查询(子查询)中移除多余的 DISTINCT 子句。在查询计划层实现。它对 DISTINCT 子句进行了与
optimize_duplicate_order_by_and_distinct类似的优化。可通过query_plan_remove_redundant_distinct设置启用。相关内容:#42648。#44176(Igor Nikonov)。 - 一些查询改写优化:
sumIf(123, cond) -> 123 * countIf(1, cond)、sum(if(cond, 123, 0)) -> 123 * countIf(cond)、sum(if(cond, 0, 123)) -> 123 * countIf(not(cond))#44728(李扬)。 - 改进了在顶层查询计划中,受内存限制的合并与有序聚合(AIO)之间的交互方式。此前,在某些其实不需要的场景下,我们在 AIO 中会回退到显式排序。#45892 (Nikita Taranov)。
- 并发合并现在默认使用轮询(round-robin)方式进行调度,以确保公平且避免饥饿现象。此前在负载很高的分片上,由于使用严格优先级调度策略,大型合并任务可能会被小型合并任务“饿死”。新增
background_merges_mutations_scheduling_policy服务器配置选项,用于选择调度算法(round_robin或shortest_task_first)。#46247 (Sergei Trifonov)。
改进
- 在 ZooKeeper 会话丢失时,默认启用 INSERT 的重试机制。该功能已在生产环境中使用。#46308 (Alexey Milovidov)。
- 为命名元组在 JSON 对象中添加忽略未知键的支持(
input_format_json_ignore_unknown_keys_in_named_tuple)。#45678(Azat Khuzhin)。 - 支持将带有
final的查询中使用排序键表达式的where子句下推到prewhere以进行优化。#38893。#38950 (hexiaoting)。 - 为备份新增监控指标:
num_processed_files和processed_files_size,用于描述实际处理的文件数量和大小。#42244 (Aleksandr)。 - 在服务器间出现 DNS 错误时增加了重试机制。#43179(Anton Kozlov)。
- Keeper 改进:尝试在磁盘上预分配空间,以避免出现不可预期的磁盘空间耗尽问题。新增设置
max_log_file_size,用于指定 Keeper 的 Raft 日志文件的最大大小。#44370 (Antonio Andelic)。 - 在副本为只读时,优化副本延迟 API 的处理逻辑。#45148 (mateng915).
- 在
clickhouse-client中,如果空密码不正确,则以交互方式提示输入密码。关闭 #46702。#46730(Nikolay Degterinsky)。 - 将对非 Float* 类型列使用的
Gorilla压缩标记为可疑。#45376 (Robert Schulze)。 - 正在执行合并操作的副本名称会显示在
postpone_reason列中。 #45458 (Frank Chen). - 将异常堆栈跟踪信息保存到 part_log 中。 #45459 (Frank Chen).
regexp_tree字典已打磨完善,现在与 https://github.com/ua-parser/uap-core 兼容。#45631(Han Fei)。- 更新了对
SYSTEM SYNC REPLICA的检查,并解决了 #45508 #45648 中的问题(SmitaRKulkarni)。 - 将设置
replication_alter_partitions_sync重命名为alter_sync。 #45659 (Antonio Andelic)。 generateRandom表函数和引擎现在支持LowCardinality数据类型。这对于测试非常有用,例如可以编写INSERT INTO table SELECT * FROM generateRandom() LIMIT 1000。这是调试 #45590 所必需的。#45661(Alexey Milovidov)。- 实验性的查询结果缓存现在支持更模块化的配置。#45679 (Robert Schulze)。
- 将 “query result cache” 重命名为 “query cache”。 #45682 (Robert Schulze).
- 添加
SYSTEM SYNC FILE CACHE命令。它会执行sync系统调用。#8921。#45685 (DR)。 - 新增一个 S3 设置
allow_head_object_request。本 PR 将在 https://github.com/ClickHouse/ClickHouse/pull/45288 中引入的、使用GetObjectAttributes请求替代HeadObject的做法改为可选(且默认禁用)。#45701(Vitaly Baranov)。 - 新增基于连接名称覆盖连接设置的功能(这意味着你现在无需为每个连接单独存储密码,只需将所有内容放入
~/.clickhouse-client/config.xml,甚至可以为不同连接使用不同的历史记录文件,这也很实用)。#45715 (Azat Khuzhin)。 - Arrow 格式:支持
duration类型。解决 #45669 问题。#45750 (flynn)。 - 增强查询缓存的日志记录,以便更好地排查和分析缓存行为。 #45751 (Robert Schulze).
- 查询缓存的服务器级设置现在支持在运行时重新配置。#45758(Robert Schulze)。
- 当表函数的参数使用命名集合指定时,在日志中隐藏密码。 #45774 (Vitaly Baranov).
- 改进内部 S3 客户端,使其能够针对不同类型的 URL 正确识别区域和重定向。#45783 (Antonio Andelic)。
- 在 generateRandom 中新增对 Map、IPv4 和 IPv6 类型的支持,主要用于测试。#45785 (Raúl Marín)。
- 在 IP 类型上支持使用 empty/notEmpty。#45799(Yakov Olkhovskiy)。
- 列
num_processed_files被拆分成两列:num_files(用于 BACKUP)和files_read(用于 RESTORE)。列processed_files_size被拆分成两列:total_size(用于 BACKUP)和bytes_read(用于 RESTORE)。#45800(Vitaly Baranov)。 - 为了 MySQL 兼容性,新增对
SHOW ENGINES查询的支持。#45859 (Filatenkov Artur). - 改进了混淆器处理查询的方式。#45867 (Raúl Marín)。
- 改进将边界值 65535(2149-06-06)转换为 Date 类型时的行为。#46042 #45914 (Joanna Hulboj).
- 添加
check_referential_table_dependencies设置,用于在执行DROP TABLE时检查引用表依赖关系。此 PR 解决了 #38326。#45936(Vitaly Baranov)。 - 修复
tupleElement,使其在参数为Null时返回Null。关闭 #45894。#45952(flynn)。 - 当没有任何文件匹配 S3 通配符时抛出错误。关闭 #45587。#45957(chen)。
- 使用集群状态数据检查备份/恢复的并发情况。#45982 (SmitaRKulkarni).
- ClickHouse Client:在模糊搜索中使用“exact”匹配,它能正确实现大小写不敏感,并采用更适合匹配 SQL 查询的算法。 #46000 (Azat Khuzhin).
- 禁止使用错误的视图创建语法
CREATE View X TO Y AS SELECT。关闭 #4331。#46043(flynn)。 Log系列存储支持设置storage_policy。修复了 #43421。#46044(flynn)。- 改进结果为空时的
JSONColumns格式。关闭 #46024。#46053(flynn)。 - 为 SipHash128 添加参考实现。 #46065 (Salvatore Mesoraca).
- 新增一个新指标,用于记录通过 mmap 进行内存分配的耗时和字节数。#46068 (李扬)。
- 当前,对于
leftPad、rightPad、leftPadUTF8、rightPadUTF8这类函数,第二个参数length必须为 UInt8|16|32|64|128|256 之一。对于 ClickHouse 用户来说,这个限制过于严格,而且也与arrayResize、substring等其他类似函数的行为不一致。#46103(李扬)。 - 在 debug 构建中,当
welchTTest函数计算得到的统计量为 NaN 时,修复其断言问题,并将其行为与其他类似函数统一。将studentTTest的行为改为返回 NaN 而不是抛出异常,因为之前的行为在使用中不够方便。关闭 #41176 和 #42162。#46141(Alexey Milovidov)。 - 更方便地使用大整数以及带 WITH FILL 的 ORDER BY。在对大(128 位和 256 位)整数使用 ORDER BY 且配合 WITH FILL 时,允许使用普通整数作为 WITH FILL 的起始和结束点。修复了对于起始或结束点为负数的大整数范围会产生错误结果的问题。关联问题 #16733 已关闭。参见 #46152(Alexey Milovidov)。
- 在 issue 中,为
system.tables表添加了parts、active_parts和total_marks列。#46161(attack204)。 - 函数 "multi[Fuzzy]Match(Any|AnyIndex|AllIndices}" 现在会拒绝那些在 vectorscan 中极有可能被非常缓慢地执行的正则表达式。#46167 (Robert Schulze)。
- 当启用
insert_null_as_default且列未定义默认值时,将使用该列类型的默认值。本 PR 还修复了在 LowCardinality 列中针对 null 使用默认值的情况。#46171(Kruglov Pavel)。 - 对于 S3 客户端,建议优先显式定义访问密钥。如果将
use_environment_credentials设置为true,并且用户通过查询或配置提供了访问密钥,则会优先使用用户提供的密钥,而不是环境变量中的密钥。#46191(Antonio Andelic)。 - 为函数
formatDateTime()添加别名DATE_FORMAT(),以提高与 MySQL SQL 方言的兼容性,并为函数formatDateTime扩展格式替代符"a"、"b"、"c"、"h"、"i"、"k"、"l"、"r"、"s"、"W"。 - 添加与并行副本(
s3Cluster和MergeTree表)回调任务相关的ProfileEvents和CurrentMetrics。#46313 (Alexey Milovidov). - 为使用
KeeperMap存储引擎的表添加对DELETE和UPDATE操作的支持。#46330 (Antonio Andelic)。 - 支持在
RENAME查询中使用查询参数。修复了 #45778。#46407(Nikolay Degterinsky)。 - 使用 REPLACE 转换器修复参数化 SELECT 查询。解决了 #33002。#46420(Nikolay Degterinsky)。
- 在计算异步指标 "NumberOfDatabases" 时,将用于临时/外部表的内部数据库排除在外。这样可使其行为与系统表 "system.databases" 保持一致。#46435 (Robert Schulze)。
- 在
distribution_queue表中新增了last_exception_time列。#46564 (Aleksandr). - 在参数化视图中支持在 IN 子句中使用参数。 #46583 (SmitaRKulkarni).
- 不要在服务器启动时加载命名集合(改为在首次访问时再加载)。 #46607 (Kseniia Sumarokova).
构建/测试/打包改进
- 引入由 LLVM 运行时实现的 GWP-ASan。此更改关闭了 #27039。#45226(Han Fei)。
- 为了让我们的测试变得不那么稳定、更容易随机失败:在测试中为 MergeTree 设置添加随机化。#38983(Anton Popov)。
- 在 PowerPC 上启用 HDFS 支持,从而修复以下功能测试:02113_hdfs_assert.sh、02244_hdfs_cluster.sql 和 02368_cancel_write_into_hdfs.sh。#44949(MeenaRenganathan22)。
- 为 clickhouse-keeper 添加 systemd.service 文件。修复 #44293。#45568(Mikhail f. Shiryaev)。
- ClickHouse 的 poco fork 从 "contrib/" 移动到了 "base/poco/"。#46075(Robert Schulze)。
- 为
clickhouse-watchdog添加一个用于重启子进程的选项。但这一选项并不是特别有用。#46312(Alexey Milovidov)。 - 如果环境变量
CLICKHOUSE_DOCKER_RESTART_ON_EXIT被设置为 1,Docker 容器将以子进程的方式运行clickhouse-server而不是作为第一个进程运行,并在其退出时重新启动它。#46391(Alexey Milovidov)。 - 修复 Systemd 服务文件。#46461(SuperDJY)。
- 将构建 ClickHouse 所需的最低 Clang 版本从 12 提升到 15。#46710(Robert Schulze)。
- 将 Intel QPL 从 v0.3.0 升级到 v1.0.0,并构建 libaccel-config,将其静态链接到 QPL 库(而不是动态链接)。#45809(jasperzhu)。
Bug 修复(官方稳定版本中用户可见的异常行为)
- 在
StorageRabbitMQ中精确按照rabbitmq_flush_interval_ms或rabbitmq_max_block_size刷新数据。修复 #42389。修复 #45160。#44404(Kseniia Sumarokova)。 - 在
sparkBar函数中使用PODArray进行渲染,以便更好地控制内存使用。关闭 #44467。#44489 (Duc Canh Le)。 - 修复 quantilesExactExclusive 和 quantilesExactInclusive 函数返回未排序数组元素的问题。 #45379 (wujunfu).
- 修复在启用 OpenTelemetry 时 HTTPHandler 中的未捕获的异常。#45456 (Frank Chen)。
- 不要将 8 位数字推断为日期。这可能导致读取到错误的数据。 #45581 (Kruglov Pavel)。
- 修复了对
odbc_bridge_use_connection_pooling设置的使用方式,使其能够被正确使用。#45591 (Bharat Nallan)。 - 当缓存中的回调被调用时,缓存对象本身可能已经被销毁。为保证安全,我们按值捕获成员。对任务调度来说这同样是安全的,因为任务调度会在存储被销毁之前被停用。解决 #45548。#45601(Han Fei)。
- 修复在将 Delta 或 DoubleDelta 编解码器与 Gorilla 编解码器组合使用时出现的数据损坏。#45615 (Robert Schulze)。
- 在使用 N-gram 布隆过滤器索引时正确进行类型检查,以避免无效读取。#45617 (Antonio Andelic).
- 有人报告了几起与
c-ares相关的段错误。它们是在我之前的 Pull Request 中引入的。在 Alexander Tokmakov 的帮助下,我已经修复了这些问题。#45629(Arthur Passos)。 - 在遇到重复主键时修正键描述。这种情况可能会出现在投影(projection)中。详情参见 #45590。#45686(Amos Bird)。
- 为备份设置压缩方法和级别。关闭了 #45690。#45737(Pradeep Chhetri)。
- 应使用
select_query_typed.limitByOffset而不是select_query_typed.limitOffset。#45817(刘陶峰)。 - 在使用 experimental analyzer 时,像
SELECT number FROM numbers(100) LIMIT 10 OFFSET 10;这样的查询会得到错误结果(该 SQL 返回空结果集)。这是由于查询规划器额外添加了一个不必要的 offset 步骤所致。#45822(刘陶峰)。 - 向后兼容 —— 允许从 UInt64 到 IPv4 的隐式类型收窄转换,这是
INSERT ... VALUES ...表达式所必需的。 #45865 (Yakov Olkhovskiy)。 - 修复 IPv6 解析器在处理缺失首个八位组的混合 IPv4 地址时的错误(例如
::.1.2.3)。 #45871 (Yakov Olkhovskiy). - 向
system.processes表和SHOW PROCESSLIST查询中添加query_kind列,并移除重复代码。此更改修复了一个问题:全局配置参数max_concurrent_select_queries在带有INTERSECT或EXCEPT链的查询中未被正确应用。#45872 (Alexey Milovidov)。 - 修复函数
stochasticLinearRegression中的崩溃问题。该问题由 WingFuzz 发现。#45985 (Nikolai Kochetov)。 - 修复带有
INTERSECT和EXCEPT修饰符的SELECT查询在从启用了稀疏列(由设置ratio_of_defaults_for_sparse_serialization控制)的表中读取数据时发生崩溃的问题。 #45987 (Anton Popov). - 修复在带有 FINAL 的 DESC 排序中顺序读取(read in order)优化的问题,关闭 #45815。#46009(Vladimir C)。
- 修复在紧凑数据片段中读取多级不存在的嵌套列的问题。 #46045 (Azat Khuzhin).
- 修复
system.processes中elapsed列存在 10 倍误差的问题。 #46047 (Azat Khuzhin). - 针对“将域 IP 类型(IPv4、IPv6)替换为原生类型”的后续修复 https://github.com/ClickHouse/ClickHouse/pull/43221。#46087(Yakov Olkhovskiy)。
- 修复在参数已具有值时配置中的环境变量替换问题。关闭了 #46131。关闭了 #9547。#46144(pufit)。
- 修复在
grouping sets中不正确的谓词下推。关闭 #45947。#46151 (flynn)。 - 修复在使用常量键的
fulls_sorting_join中可能导致处理管道卡住的问题。#46175(Vladimir C)。 - 不要在格式化时将 tuple 函数改写为字面量,否则可能导致结果不正确。 #46232 (Salvatore Mesoraca).
- 修复在以 Arrow 格式读取 LowCardinality(Nullable) 数据时可能出现的越界错误。#46270(Kruglov Pavel)。
- 修复
SYSTEM UNFREEZE查询因抛出异常CANNOT_PARSE_INPUT_ASSERTION_FAILED而失败的问题。#46325 (Aleksei Filatov)。 - 修复在反序列化由存储
HashTable的函数产生的聚合状态时,因整数溢出而可能发生的崩溃问题。 #46349 (Nikolai Kochetov)。 - 修复在使用
VALUES格式异步插入无效数据时可能出现的LOGICAL_ERROR。#46350(Anton Popov)。 - 修复了在尝试执行
ALTER ... MOVE PART ... TO TABLE时出现的 LOGICAL_ERROR。此类查询实际上从未真正被支持过。#46359 (Alexander Tokmakov)。 - 在启用
parallel_distributed_insert_select时,修复并行分布式 INSERT SELECT 中 s3Cluster 的 schema 推断。#46381 (Kruglov Pavel)。 - 修复类似
ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ...的查询,其中arr1和arr2是同一Nested列中的字段。 #46387 (Anton Popov). - 调度器可能无法调度某个任务。如果发生这种情况,应中止整个 MulityPartUpload 过程,并且
UploadHelper必须等待已调度的任务完成。#46451 (Dmitry Novik)。 - 修复在列默认类型不同的 Merge 引擎表上的
PREWHERE行为(修复当列的默认类型不同时出现的一些NOT_FOUND_COLUMN_IN_BLOCK错误;并在跨表列类型相同时允许使用PREWHERE,仅在类型不同时加以禁止)。#46454(Azat Khuzhin)。 - 修复在
ORDER BY中使用常量值时可能出现的崩溃。修复了 #46466。#46493(Nikolai Kochetov)。 - 如果在查询级别指定了
disk设置,而在合并树(MergeTree)配置的设置部分中指定了storage_policy,则不再抛出异常。disk将覆盖配置中的设置。 #46533 (Kseniia Sumarokova). - 修复函数
arrayMap中对常量LowCardinality参数的不正确处理。此错误在发行版中可能导致段错误,在调试版本中会导致逻辑错误Bad cast。#46569(Alexey Milovidov)。 - 修复 #46557。#46611(Alexander Gololobov)。
- 修复当服务器无法在 1 分 30 秒内启动时,
clickhouse-serversystemd 单元无限重启的问题(禁用 systemd 服务在启动clickhouse-server时的超时逻辑)。#46613(Azat Khuzhin)。 - 在异步插入过程中分配的内存缓冲区在全局上下文中被释放,但对应用户和查询的 MemoryTracker 计数器未被正确更新,从而导致误报的内存不足(OOM)异常。#46622 (Dmitry Novik)。
- 已更新为不再从 table_join 中清除 on_expression,因为后续的 analyze 运行仍会使用它,从而修复了 #45185。#46487(SmitaRKulkarni)。
ClickHouse 版本 23.1,2023-01-26
ClickHouse 版本 23.1
升级说明
SYSTEM RESTART DISK查询现在变为 no-op(无操作)。#44647 (alesapin)。HASHED/SPARSE_HASHED字典的PREALLOCATE选项现在变为 no-op(无操作)。#45388 (Azat Khuzhin)。它不再带来显著优势。- 禁止在非 Float32 或非 Float64 类型的列上使用
Gorilla编解码器。#45252 (Robert Schulze)。这原本就没有意义,并且会导致结果不一致。 - 使用已废弃语法创建的
*MergeTree表在并行 quorum 插入时可能工作不正确。因此,对此类表完全禁用了并行 quorum 插入的支持。这不会影响使用新语法创建的表。#45430 (Alexander Tokmakov)。 - 使用
GetObjectAttributes请求替代HeadObject请求来获取 AWS S3 中对象的大小。此更改例如修复了在升级 AWS SDK 之后对没有显式区域的端点的处理。#45288 (Vitaly Baranov)。已经对 AWS S3 和 Minio 进行了测试,但请注意,各种 S3 兼容服务(GCS、R2、B2)可能存在细微的不兼容。这一更改也可能要求你调整 ACL,以允许GetObjectAttributes请求。 - 禁止在时区名称中使用路径。例如,不允许像
/usr/share/zoneinfo/Asia/Aden这样的时区名称;应使用 IANA 时区数据库名称,如Asia/Aden。#44225 (Kruglov Pavel)。 - 禁止包含等值连接和常量表达式组合(例如
JOIN ON t1.x = t2.x AND 1 = 1)的查询,因为它们会产生不正确的结果。#44016 (Vladimir C)。
新功能
- 用于通过遍历正则表达式树来提取键的字典源,可用于解析 User-Agent。#40878 (Vage Ogannisian)。#43858 (Han Fei)。
- 新增参数化视图功能,现已支持为 View 表引擎指定查询参数。已解决 #40907。#41687 (SmitaRKulkarni)。
- 新增
quantileInterpolatedWeighted/quantilesInterpolatedWeighted函数。#38252 (Bharat Nallan). - 为
Map类型提供 array join 支持,类似于 Spark 中的explode函数。#43239 (李扬)。 - 支持 SQL 标准的二进制和十六进制字符串字面量。#43785 (Mo Xuan)。
- 允许使用 Joda-Time 风格格式化
DateTime。详见 Joda-Time 文档。#43818(李扬)。 - 为
formatDateTime实现了用于格式化秒的小数部分的格式化符(%f)。#44060 (ltrk2)。#44497 (Alexander Gololobov)。 - 添加了
age函数,用于计算两个日期或日期时间值之间的差值,并以完整时间单位的数量表示。关闭 #41115。#44421(Robert Schulze)。 - 为字典添加
Null源。关闭了 #44240。#44502(mayamika)。 - 允许通过
s3_storage_class配置项来设置 S3 存储类,例如<s3_storage_class>STANDARD/INTELLIGENT_TIERING</s3_storage_class>。已关闭 #44443。#44707 (chen)。 - 在解析命名元组时,如果 JSON 对象中缺少元素,则插入默认值。新增设置项
input_format_json_defaults_for_missing_elements_in_named_tuple来控制此行为。修复 #45142#issuecomment-1380153217。 #45231(Kruglov Pavel)。 - 在 ProfileEvents 中记录服务器启动时间(
ServerStartupMilliseconds)。修复 #43188。#45250(SmitaRKulkarni)。 - 重构并改进 Kafka/RabbitMQ/NATS 流式引擎,并为所有格式添加支持,同时对格式做了一些重构: - 修复基于行的格式在生成带后缀/前缀的消息时的问题。现在每条消息都会使用所有分隔符进行完整格式化,并且可以使用对应的输入格式解析回去。 - 支持 Native、Parquet、ORC 等块式格式。每个数据块都会被格式化为一条独立消息。单条消息中的行数取决于块大小,因此可以通过设置
max_block_size来进行控制。 - 新增引擎设置kafka_max_rows_per_message/rabbitmq_max_rows_per_message/nats_max_rows_per_message。它们控制在基于行的格式中,每条消息中被格式化的行数。默认值:1。 - 修复 NATS 表引擎的高内存占用问题。 - 在 NATS 生产者中支持任意二进制数据(之前只支持以 \0 结尾的字符串)。 - 在文档中补充缺失的 Kafka/RabbitMQ/NATS 引擎设置。 - 重构 Kafka/RabbitMQ/NATS 的生产与消费逻辑,将其与 WriteBuffers/ReadBuffers 的语义解耦。 - 重构输出格式:移除 Kafka/RabbitMQ/NATS 中对每一行使用的回调(现在那里不再使用回调),允许直接使用 IRowOutputFormat,明确行结束和行间分隔符的语义,并使输出格式可以被重置以便重新开始格式化。 - 为 formatRow 函数添加正确的实现(格式重构带来的额外收益)。#42777(Kruglov Pavel)。 - 支持在
CapnProto格式中将Nested表读写为由Struct组成的List。将Decimal32/64读写为Int32/64。修复了 #43319。#43379(Kruglov Pavel)。 - 向
system.text_log添加了message_format_string列。该列包含用于格式化日志消息的模板。#44543(Alexander Tokmakov)。从而可以对 ClickHouse 日志进行多种分析。 - 尝试在 CSV/TSV/CustomSeparated 输入格式中自动检测包含列名(以及可能包含类型)的表头行。 新增设置 input_format_tsv/csv/custom_detect_header 以启用该行为(默认启用)。修复并关闭 #44640。 #44953(Kruglov Pavel)。
实验性功能
- 添加了一种实验性的倒排索引,作为新的二级索引类型,用于高效文本搜索。#38667(larryluogit)。
- 添加了实验性的查询结果缓存。#43797(Robert Schulze)。
- 添加了用于 IO 请求的可扩展且可配置的调度子系统(尚未与 IO 代码本身集成)。#41840(Sergei Trifonov)。该功能目前完全没有任何作用,敬请欣赏。
- 添加了
SYSTEM DROP DATABASE REPLICA,用于移除Replicated数据库中失效副本的元数据。解决了 #41794。#42807(Alexander Tokmakov)。
性能优化
- 启动时不再加载
MergeTree表中的非活跃数据部分。#42181 (Anton Popov)。 - 在包含大量小文件的场景下,降低了从存储
S3和表函数s3读取时的延迟。现在,从存储S3读取时,配置项remote_filesystem_read_method和remote_filesystem_read_prefetch会生效。#43726 (Anton Popov). - 针对在 Parquet/ORC 文件中读取结构体字段的优化。仅加载所需字段。#44484 (lgbo).
- 此前,通过 HTTP 接口执行查询时,两级聚合算法被错误地禁用了。现已重新启用,从而带来了显著的性能改进。 #45450 (Nikolai Kochetov).
- 为 StorageFile 新增了 mmap 支持,有望提升 clickhouse-local 的性能。#43927 (pufit)。
- 在 HashedDictionary 中添加了对分片(sharding)的支持,以实现并行加载(可随分片数量几乎线性扩展)。 #40003 (Azat Khuzhin).
- 提升查询解析速度。#42284 (Raúl Marín)。
- 当
expr是LowCardinality列时,始终将类似expr = x1 OR ... OR expr = xN的 OR 链替换为expr IN (x1, ..., xN)。在这种情况下,将忽略optimize_min_equality_disjunction_chain_length设置。#42889 (Guo Wangyang)。 - 通过优化与 ThreadStatus 相关的代码,略微提升了性能。#43586 (Zhiguo Zhou).
- 通过实现自动向量化来优化按列的三值逻辑求值。在该微基准测试的性能测试中,我们在 ICX 设备(Intel Xeon Platinum 8380 CPU)上观测到最高可达 21 倍 的性能提升。#43669(Zhiguo Zhou)。
- 尽量避免在
system.tables表上获取读锁。#43840 (Raúl Marín)。 - 优化 ThreadPool。基于在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核心,160 线程)上进行的 SSB(Star Schema Benchmark)性能实验表明,此更改可以将对 ThreadPoolImpl::mutex 的锁争用有效减少 75%,提高 CPU 利用率,并将整体性能提升 2.4%。 #44308 (Zhiguo Zhou).
- 现在,只有当缓存的哈希表大小足够大时(阈值是基于经验确定并硬编码在代码中的),才会启用用于预测哈希表大小的优化。#44455(Nikita Taranov)。
- 对从远程文件系统进行异步读取进行了小幅性能提升。#44868 (Kseniia Sumarokova).
- 为以下表达式添加快速路径:-
col like '%%'; -col like '%'; -col not like '%'; -col not like '%'; -match(col, '.*')。#45244(李扬)。 - 对过滤(WHERE 子句)的正常执行路径进行了小幅优化。#45289 (Nikita Taranov).
- 为
toUnixTimestamp64*提供单调性信息,以便在索引分析中进行更多代数优化。#44116 (Nikita Taranov)。 - 允许配置用于查询处理的临时数据(溢写到磁盘),使其能够与文件系统缓存协同工作(占用缓存磁盘空间)#43972(Vladimir C)。这主要提升了 ClickHouse Cloud 的表现,但如果你清楚如何配置,也可以用于自主管理的部署。
- 让
system.replicas表支持并行获取副本状态。解决了 #43918。#43998(Nikolay Degterinsky)。 - 在备份到 S3 时优化内存使用:现在将文件复制到 S3 时会直接写入,而不再使用
WriteBufferFromS3(该组件可能会占用大量内存)。 #45188 (Vitaly Baranov). - 为异步块 ID 添加缓存。这将在启用异步插入去重时减少对 ZooKeeper 的请求次数。#45106 (Han Fei).
改进项
- 在不带参数调用 generateRandom 时,使用插入表的结构。#45239 (Kruglov Pavel)。
- 允许在
JSONExtract函数中,将存储在 JSON 中字符串字段里的浮点数隐式转换为整数。例如:JSONExtract('{"a": "1000.111"}', 'a', 'UInt64')->1000,之前会返回 0。#45432 (Anton Popov)。 - 向表
system.formats添加了字段supports_parallel_parsing和supports_parallel_formatting,以改进自检能力。 #45499 (Anton Popov)。 - 改进对 CustomSeparated/Template 格式中 CSV 字段的读取,并关闭 #42352 和 #39620。#43332(Kruglov Pavel)。
- 统一查询耗时的度量方式。 #43455 (Raúl Marín).
- 在
SELECT查询中存在虚拟列时,改进在表函数 file/hdfs/s3 中自动使用插入表结构的机制,以避免可能出现的Block structure mismatch或number of columns mismatch错误。 #43695 (Kruglov Pavel). - 为函数
range增加对有符号参数的支持。修复了 #43333。#43733(sanyu)。 - 移除冗余排序,例如去除子查询中与 ORDER BY 子句相关的排序步骤。该功能基于查询计划实现。它对
ORDER BY子句的优化与optimize_duplicate_order_by_and_distinct类似,但更加通用,因为它适用于任意冗余的排序步骤(不仅限于由 ORDER BY 子句引起的排序),并且可应用于任意深度的子查询。相关问题:#42648。#43905(Igor Nikonov)。 - 为 BACKUP 新增可禁用文件去重的选项(对于不启用去重的备份,可以使用 ATTACH 来替代完整的 RESTORE)。例如:
BACKUP foo TO S3(...) SETTINGS deduplicate_files=0(默认值为deduplicate_files=1)。#43947(Azat Khuzhin)。 - 重构并改进文本格式的 schema 推断。新增设置
schema_inference_make_columns_nullable,用于控制是否将结果类型设为Nullable(默认启用);#44019 (Kruglov Pavel)。 - 对
PROXYv1协议提供了更好的支持。#44135 (Yakov Olkhovskiy)。 - 将清理线程最近一次对 part 的检查信息添加到
system.parts表中。#44244 (Dmitry Novik)。 - 在只读模式下禁止使用表函数进行插入。 #44290 (SmitaRKulkarni).
- 添加配置项
simultaneous_parts_removal_limit,用于限制 CleanupThread 单次迭代可处理的 part 数量。#44461 (Dmitry Novik)。 - 当查询中只需要虚拟列时,不要初始化
ReadBufferFromS3。这可能有助于解决 #44246 中的问题。#44493(chen)。 - 防止列名提示中出现重复的列名。关闭 #44130。#44519(Joanna Hulboj)。
- 允许在磁盘 endpoint 中使用宏替换。修复 #40951。#44533(SmitaRKulkarni)。
- 在启用
input_format_json_read_object_as_string时改进了模式推断。#44546(Kruglov Pavel)。 - 添加一个用户级设置
database_replicated_allow_replicated_engine_arguments,用于禁止在DatabaseReplicated中创建带参数的ReplicatedMergeTree表。#44566(alesapin)。 - 防止用户误将
index_granularity设置为零(无效值)。修复了 #44536。#44578(Alexey Milovidov)。 - 在 config.xml 的
kerberos部分中,新增了通过keytab参数指定服务 keytab 文件路径的功能。#44594 (Roman Vasin)。 - 使用已输入的查询部分进行模糊搜索(传递给用 Rust 编写并以静态方式链接到 ClickHouse 的
skim库)。 #44600 (Azat Khuzhin)。 - 默认启用
input_format_json_read_objects_as_strings,以便在 JSON Object 类型仍为试验性特性时能够读取嵌套的 JSON 对象。#44657 (Kruglov Pavel)。 - 改进异步插入的去重:当用户进行重复的异步插入操作时,我们应当先在内存中进行去重,然后再查询 Keeper。#44682 (Han Fei).
Avro输入/输出格式会将 bool 类型解析为 ClickHouse 的 bool 类型。#44684 (Kruglov Pavel)。- 在 Arrow/Parquet/ORC 中支持布尔类型。修复 #43970。#44698(Kruglov Pavel)。
- 读取 UUID 时不要贪婪地解析超出引号的内容——这可能会导致错误数据被误判为解析成功。#44686 (Raúl Marín).
- 在 Int64 溢出时推断为 UInt64,并修复 schema 推断中的部分转换。#44696 (Kruglov Pavel)。
- 以前在
Replicated数据库中解析依赖关系是通过一种比较取巧的方式实现的,现在改为使用显式图来正确处理。#44697 (Nikita Mikhaylov)。 - 修复
output_format_pretty_row_numbers在跨数据块时无法保持计数器连续的问题。关闭 #44815。#44832(flynn)。 - 不要在
system.errors中报告因在后台清理进程中并发合并数据片段而产生的错误。#44874 (Raúl Marín)。 - 优化并修复 Distributed async INSERT 的指标。#44922(Azat Khuzhin)。
- 新增用于禁止并发备份和恢复的设置,解决了 #43891 问题。实现:* 新增服务器级别设置以禁止并发备份和恢复,这些设置会在 Context 中创建 BackupWorker 时读取并应用。* 设置默认值为 true。* 在开始备份或恢复之前,增加检查以确认是否有其他备份/恢复正在运行。对于内部请求,会通过 backup_uuid 检查其是否来自本节点。#45072 (SmitaRKulkarni)。
- 为系统日志新增
<storage_policy>配置参数。#45320 (Stig Bakken)。
构建/测试/打包改进
- 为 ClickHouse 客户端/本地历史记录中的模糊搜索,对用 Rust 编写的
skim库进行静态链接。#44239 (Azat Khuzhin). - 由于 Rust,我们移除了对共享库链接的支持。实际上,Rust 只是移除它的一个借口,我们本来也打算移除它。#44828 (Alexey Milovidov).
- 从软件包中移除对
adduser工具的依赖,因为我们并不使用它。这修复了 #44934。#45011 (Alexey Milovidov). - 将
SQLite库更新到最新版本。它用于 SQLite 数据库和表集成引擎。同时修复了一个 TSan 误报问题。这关闭了 #45027。#45031 (Alexey Milovidov). - 修改 CRC-32 以解决 PowerPC 中 WeakHash 冲突问题。#45144 (MeenaRenganathan22).
- 更新 aws-c* 子模块。#43020 (Vitaly Baranov).
- 自动合并处于 green 状态的 backport PR 和已批准且为 green 状态的 PR。#41110 (Mikhail f. Shiryaev).
- 推出一个用于查看 ClickHouse CI 状态的网站。源码。
Bug 修复
- 将域 IP 类型(IPv4、IPv6)替换为原生类型。#43221(Yakov Olkhovskiy)。这会自动补齐代码中部分缺失的实现。
- 修复在备份过程中 mutation 操作被终止时的备份流程。#45351(Vitaly Baranov)。
- 修复
Invalid number of rows in Chunk异常信息。#41404。#42126(Alexander Gololobov)。 - 修复在排序后执行表达式时可能会使用未初始化的值的问题。关闭 #43386 #43635(Kruglov Pavel)。
- 改进在聚合组合器中对 NULL 的处理,修复在使用冷门优化
optimize_rewrite_sum_if_to_count_if时可能出现的段错误或逻辑错误。关闭 #43758。#43813(Kruglov Pavel)。 - 修复
CREATE USER/ROLE查询的 SETTINGS 相关约束。#43993 (Nikolay Degterinsky)。 - 修复了表元数据中
EPHEMERAL列默认值无法解析的问题。#44026(Yakov Olkhovskiy)。 - 修复从兼容性设置中解析到错误版本的问题。#44224(Kruglov Pavel)。
- 使对 datetime 执行 interval 减法的行为与加法保持一致。#44241 (ltrk2)。
- 取消视图结果大小的上限。 #44261 (lizhuoyu5).
- 当
do_not_evict_index_and_mrk_files=1时,修复缓存中可能出现的逻辑错误。修复了 #42142。#44268(Kseniia Sumarokova)。 - 修复写穿缓存中可能出现的缓存写入过早中断问题(在本不应停止缓存时,错误假设可能导致缓存被停止)。#44289 (Kseniia Sumarokova).
- 修复在将带有常量参数的
IN函数作为常量参数并与LowCardinality一起使用时可能发生的崩溃。修复了 #44221。#44346(Nikolai Kochetov)。 - 修复了参数化聚合函数对复杂参数(如数组)的支持问题。此更改解决了 #30975。在此更改之前,聚合函数
sumMapFiltered无法在分布式查询中使用。#44358(Alexey Milovidov)。 - 修复 BSON schema 推断中读取 ObjectId 的问题。#44382 (Kruglov Pavel)。
- 修复 ReplicatedMergeTree 中的竞争条件,该问题可能导致在合并完成前过早删除临时 part。此问题可能会导致出现
No such file or directory: xxx之类的错误。修复了 #43983。#44383(alesapin)。 - 如果未指定集群名称,一些无效的
SYSTEM ... ON CLUSTER查询会产生意外的行为。现已修复,现在无效查询会按预期抛出SYNTAX_ERROR。修复 #44264。#44387(Alexander Tokmakov)。 - 修复在 ORC 格式下读取 Map 类型的问题。 #44400 (Kruglov Pavel).
- 修复了在 Parquet/ORC 格式中读取输入数据时访问不存在列的问题。此前这种情况可能会导致
INCORRECT_NUMBER_OF_COLUMNS错误。相关问题 #44333。#44405(Kruglov Pavel)。 - 此前,
bar函数使用相同的 '▋'(U+258B "Left five eighths block")字符来显示 5/8 和 6/8 的条形。此更改通过在显示 6/8 条形时改用 '▊'(U+258A "Left three quarters block")来纠正这一行为。#44410(Alexander Gololobov)。 - 在配置文件中将 profile 设置放在 profile 设置约束之后会导致这些约束失效。#44411(Konstantin Bogdanov)。
- 修复在运行包含数据的
EXPLAIN AST INSERT查询时出现的SYNTAX_ERROR。修复 #44207。#44413(save-my-heart)。 - 修复在 CSV 格式中读取带有 CRLF 的 bool 值的问题。修复 #44401。#44442(Kruglov Pavel)。
- 不要对 LowCardinality 字典执行 and/or/if/multiIf 函数,因此结果类型不能为 LowCardinality,否则在某些情况下可能会触发
Illegal column ColumnLowCardinality错误。修复了 #43603。#44469(Kruglov Pavel)。 - 通过设置项
max_streams_for_merge_tree_reading修复 mutation 相关问题。#44472 (Anton Popov)。 - 修复在
ASTSelectQuery::formatImpl中使用GROUPING SETS时可能出现的空指针解引用问题(#43049)。#44479(Robert Schulze)。 - 按照设置,对表函数参数、
CAST函数参数以及JSONAsObject的 schema 推断进行类型校验。 #44501 (Kruglov Pavel). - 修复在 LowCardinality 与常量列配合使用时的 IN 函数问题,关闭 #44503。#44506(Duc Canh Le)。
- 修复了在
CREATE TABLE语句中对DEFAULT表达式进行规范化时的一个错误。函数in的第二个参数(或运算符IN的右侧参数)在执行 CREATE 查询时可能会被替换为其求值结果。修复了 #44496。#44547(Alexander Tokmakov)。 - 在包含 WITH ROLLUP、WITH CUBE 或 WITH TOTALS 的查询中,Projections 不会生效。在先前的版本中,此类查询会抛出异常,而不是直接跳过对 Projections 的使用。该更改关闭了 #44614。同时关闭了 #42772。#44615(Alexey Milovidov)。
- 未清理异步块,因为函数
get all blocks sorted by time未返回异步块。#44651 (Han Fei)。 - 修复在包含子查询的 JOIN、UNION 和 TOTALS 查询中出现的
LOGICAL_ERROR错误:The top step of the right pipeline should be ExpressionStep。修复了 #43687。 #44673(Nikolai Kochetov)。 - 避免在 Executable 表引擎中抛出
std::out_of_range异常。#44681 (Kruglov Pavel)。 - 不要对 AST 中的分位数应用
optimize_syntax_fuse_functions,关闭 #44712。#44713(Vladimir C)。 - 修复 Merge 表与 PREWHERE 中类型错误的 bug,关闭 #43324。#44716(Vladimir C)。
- 修复了在关闭过程中(销毁 TraceCollector 时)可能发生的崩溃问题。修复 #44757。#44758(Nikolai Kochetov)。
- 修复了分布式查询处理中的一个潜在崩溃问题。当带有 totals 或 extremes 的查询返回空结果且 Distributed 表与本地表之间存在类型不匹配时,可能会导致崩溃。修复了 #44738。#44760(Nikolai Kochetov)。
- 修复在抓取(
min_compressed_bytes_to_fsync_after_fetch)和变更(min_rows_to_fsync_after_merge/min_compressed_bytes_to_fsync_after_merge)操作中,对小文件(ttl.txt、columns.txt)执行 fsync 的问题。 #44781 (Azat Khuzhin). - 在数据片段在磁盘之间移动的情况下,当查询
system.parts或system.parts_columns表时,可能会出现一种罕见的竞态条件。此问题在 #41145 中被引入,并在 #44809 中修复(Alexey Milovidov)。 - 修复在启用投影优化时可能出现的
Context has expired错误。该问题可在包含特定函数(例如在运行时使用上下文的dictHas/dictGet)的查询中重现。修复了 #44844。#44850(Nikolai Kochetov)。 - 修复了在从远程文件系统读取
LowCardinality字典时可能出现的Cannot read all data错误,对应修复了 #44709。#44875(Nikolai Kochetov)。 - 当无法读取硬件监控传感器时,忽略这些情况,而不是在日志中输出完整的异常信息。#44895 (Raúl Marín)。
- 如果计算出的 INSERT 延迟时间超过该设置值,则改用
max_delay_to_insert的值。相关问题见 #44902。#44916(Igor Nikonov)。 - 修复在包含
UNION的查询中出现的错误Different order of columns in UNION subquery。修复了 #44866。#44920(Nikolai Kochetov)。 - INSERT 操作的延迟可能被错误计算,这会导致始终使用
max_delay_to_insert作为延迟值,而不是正确计算出的数值。应使用简单公式max_delay_to_insert * (parts_over_threshold/max_allowed_parts_over_threshold),即延迟会随着超过阈值的 part 数量成比例增长。修复了 #44902。#44954(Igor Nikonov)。 - 修复在宽 part 带有轻量级删除掩码时的 ALTER TABLE TTL 错误。 #44959 (Mingliang Pan).
- 针对“将域 IP 类型(IPv4、IPv6)替换为原生类型”的后续修复 #43221。#45024(Yakov Olkhovskiy)。
- 针对“将域 IP 类型(IPv4、IPv6)替换为原生类型”更改的后续修复 https://github.com/ClickHouse/ClickHouse/pull/43221。 #45043(Yakov Olkhovskiy)。
- 在解析器中存在可能的缓冲区溢出漏洞。通过模糊测试发现。#45047(Alexey Milovidov)。
- 修复 FileLog 存储引擎中可能出现的 cannot-read-all-data 错误。关闭 #45051、#38257。#45057(Kseniia Sumarokova)。
- 当查询中存在 grouping sets 时,将禁用内存高效聚合(
distributed_aggregation_memory_efficient设置)。#45058(Nikita Taranov)。 - 修复
RANGE_HASHED字典,使在指定update_field时,更新过程中将范围列计入主键的一部分。关闭 #44588。#45061(Maksim Kita)。 - 修复在嵌套 lambda 中捕获
LowCardinality参数时出现的Cannot capture column错误。修复了 #45028。#45065(Nikolai Kochetov)。 - 在使用 minmax/count 投影时,修复
additional_table_filters导致的错误查询结果问题(未应用附加表过滤条件)。#45133(Nikolai Kochetov)。 - 修复了
histogram函数接受负值的错误。#45147 (simpleton). - 修复 StorageJoin 中列可空性错误,关闭 #44940。#45184(Vladimir C)。
- 修复
background_fetches_pool_size设置在运行时增大时的重新加载问题。#45189(Raúl Marín)。 - 在 KV 引擎(例如 KeeperMap、EmbeddedRocksDB)上,当对键使用带有生成不同类型子查询的
IN时,正确处理SELECT查询。#45215(Antonio Andelic)。 - 在某些情况下修复了 SEMI JOIN 与
join_use_nulls的逻辑错误,关闭 #45163,关闭 #45209。#45230 (Vladimir C)。 - 修复从 S3 读取时出现的 heap-use-after-free 问题。 #45253 (Kruglov Pavel).
- 修复当 Avro Union 类型为 ['null', Nested type] 时出现的错误,关闭 #45275。修复将
bytes类型错误推断为Float的问题。#45276 (flynn)。 - 当无法将显式 PREWHERE 与使用
Merge存储引擎的表一起使用时,抛出正确的异常。#45319 (Antonio Andelic). - 在 WSL1 Ubuntu 下,自解压的 ClickHouse 因不一致导致解压失败——
/proc/self/maps报告的是 32 位文件的 inode,而stat报告的是 64 位 inode。#45339(Yakov Olkhovskiy)。 - 修复 Distributed 表启动过程中的竞态条件(可能导致异步 INSERT 文件被处理多次)。 #45360 (Azat Khuzhin).
- 修复在从 S3 存储和表函数
s3读取时,当ListObject请求失败可能导致的崩溃问题。#45371 (Anton Popov)。 - 修复在存在结构不正确的字典(例如 XML 配置中类型不正确)时执行
SELECT ... FROM system.dictionaries会抛出异常的问题。#45399(Aleksei Filatov)。 - 修复在
INSERT INTO ... SELECT * FROM s3Cluster查询中基于插入表结构进行 s3Cluster 架构推断时的问题。 #45422 (Kruglov Pavel). - 修复了在通过 HTTP 解析 JSON/BSONEachRow 时可能导致某些列使用默认值而不是数据中值的一个 bug。#45424(Kruglov Pavel)。
- 修复了从文本源按类型解析 IP 类型数据时出现的错误(代码:632. DB::Exception: Unexpected data ... after parsed IPv6 value ...)。#45425(Yakov Olkhovskiy)。
- 关闭 #45297,添加对空正则表达式的检查。#45428 (Han Fei)。
- 修复可能导致(尤其是在分布式场景下)查询挂起的问题。#45448 (Azat Khuzhin).
- 修复在启用
allow_asynchronous_read_from_io_pool_for_merge_tree且ThreadPool::schedule抛出异常时可能发生的死锁问题。#45481 (Nikolai Kochetov)。 - 修复执行 DETACH 后表仍可能正在使用的问题。 #45493 (Azat Khuzhin).
- 修复在查询被取消且执行过程中启用并行解析时会发生的罕见中止问题。 #45498 (Anton Popov).
- 修复 Distributed 表创建与对其执行 INSERT 之间的竞争条件(可能会在向该表执行 INSERT 时导致 CANNOT_LINK 错误)。 #45502 (Azat Khuzhin).
- 为缓存策略 getter 添加合理的默认值(SLRU)。修复 #45514。#45524(Kseniia Sumarokova)。
- 禁止在变更(mutation)中使用
ARRAY JOIN,解决了 #42637 #44447(SmitaRKulkarni)。 - 修复了在使用表别名和列转换器时限定星号的处理问题。解决了问题 #44736。#44755(SmitaRKulkarni)。