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

2024 更新日志

目录

ClickHouse 版本 v24.12,2024-12-19
ClickHouse 版本 v24.11,2024-11-26
ClickHouse 版本 v24.10,2024-10-31
ClickHouse 版本 v24.9,2024-09-26
ClickHouse 版本 v24.8 LTS,2024-08-20
ClickHouse 版本 v24.7,2024-07-30
ClickHouse 版本 v24.6,2024-07-01
ClickHouse 版本 v24.5,2024-05-30
ClickHouse 版本 v24.4,2024-04-30
ClickHouse 版本 v24.3 LTS,2024-03-26
ClickHouse 版本 v24.2,2024-02-29
ClickHouse 版本 v24.1,2024-01-30
2023 年更新日志

ClickHouse 版本 24.12,2024-12-19

不向后兼容的变更

  • 函数 greatestleast 现在会忽略 NULL 输入值,而此前只要任一参数为 NULL,就会返回 NULL。例如,SELECT greatest(1, 2, NULL) 现在会返回 2。此更改使其行为与 PostgreSQL 兼容,但同时与返回 NULL 的 MySQL 不再兼容。若要保留之前的行为,请将设置 least_greatest_legacy_null_behavior(默认:false)设为 true#65519 #73344kevinyhzou)。
  • 新的 MongoDB 集成现在为默认配置。希望继续使用旧版 MongoDB 驱动(基于 Poco 驱动)的用户,可以启用服务器设置 use_legacy_mongodb_integration#73359Kirill Nikiforov

新功能

  • JSON/Dynamic/Variant 类型从实验特性提升到 beta 阶段。#72294Pavel Kruglov)。我们还将所有修复以及此变更回溯移植到了 24.11 版本。
  • Iceberg 数据存储 格式的模式演进为用户提供了丰富的选项,用于修改其表结构。列的顺序、列名以及简单类型扩展都可以在底层进行变更。#69445Daniil Ivanik)。
  • 通过 Iceberg REST Catalog 集成:新增名为 Iceberg 的数据库引擎,可将整个目录接入 ClickHouse。#71542 (Kseniia Sumarokova)。
  • MergeTree 表的主键索引新增了缓存(可通过表设置 use_primary_key_cache 启用)。如果为主键索引同时启用了懒加载和缓存,则主键索引会按需加载到缓存中(类似 mark cache),而不是一直常驻内存。新增了在对数据分片执行插入 / 合并 / 拉取操作以及表重启时对主键索引进行预热的功能(可通过设置 prewarm_primary_key_cache 启用)。这可以降低共享存储上超大表的内存占用,我们已在超过一千万亿行记录的表上进行了测试。#72102 (Anton Popov)。#72750 (Alexander Gololobov)。
  • 实现 SYSTEM LOAD PRIMARY KEY 命令,用于为指定表的所有数据部分加载主键索引;如果未指定表,则为所有表加载主键索引。这对于进行基准测试以及在查询执行过程中避免额外延迟非常有用。#66252 #67733 (ZAWA_ll)。
  • 新增了一条查询语句,可将 MergeTree 表作为 ReplicatedMergeTree 表附加,反之亦然:ATTACH TABLE ... AS REPLICATEDATTACH TABLE ... AS NOT REPLICATED#65401 (Kirill)。
  • 新增设置项 http_response_headers,用于自定义 HTTP 响应头。例如,你可以让浏览器直接渲染存储在数据库中的图片。由此关闭了 #59620#72656Alexey Milovidov)。
  • 新增函数 toUnixTimestamp64Second,用于将 DateTime64 转换为具有固定秒精度的 Int64 值,从而可以在日期早于 Unix 纪元时返回负值。#70597 (zhanglistar)。#73146 (Robert Schulze)。
  • 新增设置项 enforce_index_structure_match_on_partition_manipulation,以便当源表的 projection 和二级索引集合是目标表对应集合的子集时,允许执行 attach 操作。关闭 #70602#70603zwy991114)。
  • 为 ALTER USER 增加语法 {ADD|MODIFY|DROP SETTING}、ALTER USER {ADD|DROP PROFILE},并在 ALTER ROLE 和 ALTER PROFILE 中提供相同语法。这样就可以修改设置集,而不必每次都整体替换。 #72050 (pufit)。
  • 新增 arrayPRAUC 函数,用于计算精确率-召回率(Precision-Recall)曲线的 AUC(曲线下面积)。 #72073 (Emmanuel)。
  • 为数组类型新增 indexOfAssumeSorted 函数。在数组已按非递减顺序排序的情况下,该函数可以优化查找操作。在超大数组(超过 100,000 个元素)上效果尤为明显。#72517Eric Kurbanov)。
  • 允许聚合函数 groupConcat 接受分隔符作为可选的第二个参数。#72540 (Yarik Briukhovetskyi)。
  • 函数 translate 现在支持字符删除:当 from 参数包含的字符多于 to 参数时,将删除多余的字符。示例:SELECT translate('clickhouse', 'clickhouse', 'CLICK') 现在返回 CLICK#71441 (shuai.xu).

实验性特性

  • 新增 MergeTree 设置项 allow_experimental_reverse_key,用于在 MergeTree 排序键中启用对降序排序的支持。该功能对时间序列分析尤其有用,特别是 TopN 查询。示例用法:ENGINE = MergeTree ORDER BY (time DESC, key) —— 对 time 字段进行降序排序。#71095Amos Bird)。

性能优化

  • JOIN 重新排序。新增了一个选项,可以在查询计划中选择 JOIN 的哪一侧作为内部(构建)表。该行为由 query_plan_join_swap_table 控制,可将其设置为 auto。在此模式下,ClickHouse 将尝试选择行数最少的表。#71577Vladimir Cherkasov)。
  • 现在,当 join_algorithm 设置为 default 时,将使用 parallel_hash 算法(如果可用)。在无法使用 parallel_hash 时,仍会考虑此前的两个可选算法(directhash)。#70788 (Nikita Taranov)。
  • 添加了一个选项,用于从 WHEREON 表达式中提取公共表达式,以减少在执行 JOIN 时使用的哈希表数量。当 JOIN 的 ON 条件在不同的 OR 分支中存在由 AND 连接的公共子表达式时,这一优化是有意义的。可通过 optimize_extract_common_expressions = 1 启用。#71537 (János Benjamin Antal)。
  • 允许在执行 SELECT 时,当对已建立索引的列执行 CAST 为 LowCardinality(String) 时仍然使用索引。这种情况可能出现在对一个 Merge 表执行查询时,其中部分底层表的列类型为 String,而部分为 LowCardinality(String)#71598Yarik Briukhovetskyi)。
  • 在使用并行副本执行查询且启用了本地计划时,不会在 worker 节点上执行索引分析。协调节点会基于其自身(查询发起端)进行的索引分析,为各个 worker 节点选择要读取的范围。这样一来,使用并行副本的短查询可以达到与单节点查询同样低的延迟。#72109Igor Nikonov)。
  • 对于对象存储磁盘,clickhouse disks remove --recursive 的内存占用已减少。#67323 (Kirill)。
  • 恢复从 #57631 引入的,在 compact 格式数据分片中读取单个列子列的优化,该优化此前被误删。#72285Pavel Kruglov)。
  • 通过在比较器中去虚化函数调用,加速对 LowCardinality(String) 列的排序。#72337 (Alexander Gololobov)。
  • 为某些简单数据类型优化函数 argMin/argMax#72350alesapin)。
  • 通过在内存跟踪器中使用共享锁来优化锁机制,减少锁竞争,从而提升在拥有大量 CPU 核心的系统上的性能。 #72375 (Jiebin Sun).
  • 新增设置 use_async_executor_for_materialized_views。使用异步(可能为多线程)方式执行物化视图查询,可以在 INSERT 操作期间加快视图处理速度,但也会消耗更多内存。#72497 (alesapin)。
  • 提升了聚合函数状态反序列化的性能(在数据类型 AggregateFunction 以及分布式查询中)。略微提升了 RowBinary 格式解析的性能。 #72818 (Anton Popov)。
  • 在读取时根据表键的顺序拆分区间并使用并行副本,以减少读取过程中的内存消耗。 #72173 (JIaQi).
  • 在插入批次中分区键仅有一个取值的情况下,加速对 MergeTree 的插入操作。#72348 (alesapin).
  • 在从备份恢复时,实现了并行创建表的功能。在此 PR 之前,RESTORE 命令始终使用单线程创建表,对于包含大量表的备份,这可能会很慢。#72427Vitaly Baranov)。
  • 如果 mark cache 很大,清空它可能会花费较长时间。如果在此期间一直持有 context 的互斥锁,会阻塞许多其他操作,甚至在锁释放之前都无法建立新的客户端连接。而且,为了实现同步其实并不需要一直持有这把互斥锁,通过 shared_ptr 持有对该缓存的本地引用就足够了。#72749 (Alexander Gololobov)。

改进

  • 移除 allow_experimental_join_condition 设置,从而默认允许使用非等值条件。#69910Vladimir Cherkasov)。
  • 服务器端配置(users.xml)中的设置现在也会应用到客户端,这对于格式设置(例如 date_time_output_format)非常有用。 #71178 (Michael Kolupaev)。
  • 根据服务器/用户内存使用情况自动将 GROUP BY/ORDER BY 切换为外部模式(写入磁盘)。通过 max_bytes_ratio_before_external_group_by/max_bytes_ratio_before_external_sort 查询设置进行控制。#71406Azat Khuzhin)。
  • 添加了一种新的取消逻辑:CancellationChecker 会检查每个已启动查询的超时时间,并在达到超时时将其停止。#69880 (Yarik Briukhovetskyi)。
  • 支持通过 ALTERObject 类型转换为 JSON 类型,这意味着可以轻松从已弃用的 Object 类型迁移。#71784 (Pavel Kruglov)。
  • 允许集合中存在 Enum 中未定义的未知值。修复 #72662#72686zhanglistar)。
  • Enum 数据类型添加对字符串搜索运算符(如 LIKE)的支持,实现了 #72661#72732zhanglistar)。
  • 此前一些无意义的 ALTER USER 查询会被接受。修复了 #71227#71286Arthur Passos)。
  • 在为分布式 INSERT ... SELECT 构建执行计划时,遵循 prefer_locahost_replica 设置。 #72190 (filimonov).
  • Azure 违反了 Iceberg 规范,错误地将 Iceberg v1 标记为 Iceberg v2。该问题在这里进行了描述。Azure Iceberg Writer 创建的 Iceberg 元数据文件(以及 manifest 文件)不符合规范。现在我们尝试使用 v2 读取器读取 v1 Iceberg 格式的元数据(因为 Azure 就是这样写的),并在未在 manifest 文件中创建相应字段时抛出错误。#72277Daniil Ivanik)。
  • 现在允许在查询中使用 UNION [ALL] 来创建 MATERIALIZED VIEW。其行为与带有 JOIN 的物化视图相同:只有 SELECT 表达式中的第一个表会作为插入触发源生效,其他所有表都会被忽略。不过,如果对第一个表有多次引用(例如与自身进行 UNION),那么所有这些引用都会作为插入的数据块一并被处理。#72347alesapin)。
  • 在将 ClickHouse 用作字典数据源时,增加了对源查询的验证。#72548Alexey Katsman)。
  • 确保 ClickHouse 在重新加载配置时能感知到来自 ZooKeeper 的更改。#72593 (Azat Khuzhin)。
  • 对已缓存 marks 的内存使用进行更合理的估算,从而降低缓存的总体内存占用。#72630 (Antonio Andelic)。
  • 新增一个名为 StartupScriptsExecutionState 的指标。该指标可以有三个取值:0 = 启动脚本尚未执行完成,1 = 启动脚本执行成功,2 = 启动脚本执行失败。我们需要这个指标,是为了了解启动脚本在云端是否成功执行,尤其是在基础配置发布之后。#72637 (Miсhael Stetsyuk).
  • 将新的 MergeTreeIndexGranularityInternalArraysTotalSize 指标添加到 system.metrics 中。此指标用于定位具有超大数据集、容易受到高
  • 为创建复制表的操作添加重试机制。 #72682 (Vitaly Baranov).
  • total_bytes_with_inactive 添加到 system.tables 中,用于统计非活跃数据部分的总字节数。#72690 (Kai Zhu)。
  • 将 MergeTree 设置添加到 system.settings_changes#72694 (Raúl Marín)。
  • notEmpty 函数增加对 JSON 类型的支持。#72741Pavel Kruglov)。
  • 支持解析来自 GCS S3 的 AuthenticationRequired 错误。 #72753 (Vitaly Baranov).
  • 在函数 ifNullcoalesce 中支持 Dynamic 类型。#72772 (Pavel Kruglov)。
  • toFloat64touInt32 等函数中增加对 Dynamic 的支持。 #72989 (Pavel Kruglov).
  • 添加 S3 请求设置 http_max_fieldshttp_max_field_name_sizehttp_max_field_value_size,并在执行备份或恢复时解析 S3 API 响应的过程中使用这些设置。#72778 (Vitaly Baranov)。
  • 仅在最后一个使用该元数据的表被删除后,才删除 keeper 中 Storage S3(Azure)Queue 的表元数据。#72810 (Kseniia Sumarokova)。
  • 添加了 JoinBuildTableRowCount / JoinProbeTableRowCount / JoinResultRowCount ProfileEvents 事件。#72842 (Vladimir Cherkasov)。
  • 在 MergeTree 排序键和跳过索引中支持子列。 #72644 (Pavel Kruglov).

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

  • 修复 MergeTree 中可能存在交叉的数据分片(在将分片移动到 detached 目录的操作失败后出现,可能是由于对象存储上的操作失败导致)。 #70476 (Azat Khuzhin).
  • 修复了在检测表名过长时的错误检测逻辑。提供诊断信息以提示允许的最大长度。新增函数 getMaxTableNameLengthForDatabase#70810 (Yarik Briukhovetskyi).
  • 修复了在 clickhouse-library-bridge 崩溃后产生的僵尸进程问题(该程序允许运行不安全的库)。#71301 (MikhailBurdukov)。
  • 修复在为 plain_rewritable 磁盘创建目录失败时,事务回滚过程中出现的 NoSuchKey 错误。#71439 (Julia Kartseva)。
  • 修复在 Pretty JSON 格式中对 Dynamic 值的序列化。#71923Pavel Kruglov)。
  • 将自动推断的格式名称添加到 File/S3/URL/HDFS/Azure 引擎的 CREATE 查询中。此前,每次服务器重启都会重新推断格式名称,如果指定的数据文件已被删除,就会在服务器启动时导致错误。#72108Pavel Kruglov)。
  • 修复在旧版分析器中于 JOIN ON 表达式使用 UDF 时出现的错误。#72179 (Raúl Marín)。
  • 修复了 StorageObjectStorage 中的一些小问题,并默认启用了 use_hive_partitioning#72185 (Yarik Briukhovetskyi)。
  • 修复 bug:min_age_to_force_merge_on_partition_only 会卡在反复尝试合并同一个已经被合并为单个 part 的分区上,而不去合并那些仍包含多个 part 的分区。#72209 (Christoph Wurm)。
  • 修复了在处理稀疏列时极少数情况下会发生的 SimpleSquashingChunksTransform 崩溃问题。#72226Vladimir Cherkasov)。
  • 修复了 GraceHashJoin 中的数据竞争问题,该问题可能导致连接结果中缺失某些行。#72233Nikita Taranov)。
  • 在启用 enable_block_number_column 设置时,修复了带有物化 _block_number 列的 ALTER DELETE 查询。#72261 (Anton Popov)。
  • 修复了在并发调用 ColumnDynamic::dumpStructure() 时出现的数据竞争问题,例如在 ConcurrentHashJoin 构造函数中。#72278 (Nikita Taranov)。
  • 修复在 ORDER BY ... WITH FILL 中使用重复列时可能导致的 LOGICAL_ERROR#72387 (Vladimir Cherkasov).
  • 在应用 optimize_functions_to_subcolumns 之后,修复了多种情况下的类型不匹配问题。#72394 (Anton Popov).
  • 改为使用 AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE,而不是 AWS_CONTAINER_AUTHORIZATION_TOKEN_PATH。修复 #71074#72397Konstantin Bogdanov)。
  • 修复在解析 BACKUP DATABASE db EXCEPT TABLES db.table 查询时出现的失败问题。#72429 (Konstantin Bogdanov)。
  • 不再允许创建空的 Variant#72454 (Pavel Kruglov)。
  • 修复 system.mergesresult_part_path 的无效格式问题。#72567Konstantin Bogdanov)。
  • 修复解析仅包含单个元素(例如 {file})的 glob 表达式的问题。 #72572 (Konstantin Bogdanov).
  • 修复在包含 ARRAY JOIN 的分布式查询中为 follower 服务器生成查询时的问题。修复了 #69276#72608Dmitry Novik)。
  • 修复 DateTime64 IN DateTime64 表达式返回空结果的错误。 #72640 (Yarik Briukhovetskyi).
  • 修复了在向包含使用 flatten_nested=0 创建的表的 Replicated 数据库添加新副本时出现的元数据不一致问题。#72685 (Alexander Tokmakov)。
  • 修复 Keeper 内部通信的高级 SSL 配置。#72730Antonio Andelic)。
  • 修复在 S3Queue 无序模式下,当 tracked_files_limit 设置值小于 S3 文件生成速率时触发的 “No such key” 错误。#72738 (Kseniia Sumarokova).
  • 修复当本地不存在该用户时在 RemoteQueryExecutor 中抛出的异常。#72759Andrey Zvonov)。
  • 修复了在启用 enable_block_number_column 设置时,对物化 _block_number 列执行变更操作的问题。 #72854 (Anton Popov).
  • 修复在备份中存在空文件时使用普通可重写磁盘进行备份/恢复的功能。 #72858 (Kseniia Sumarokova).
  • 在 DistributedAsyncInsertDirectoryQueue 中正确取消插入。#72885 (Antonio Andelic).
  • 修复了在将错误数据解析到稀疏列时发生的崩溃(在启用 enable_parsing_to_custom_serialization 设置时可能发生)。#72891 (Anton Popov).
  • 修复在备份恢复过程中可能发生的崩溃。#72947 (Kseniia Sumarokova).
  • 修复了 parallel_hash JOIN 方法中的一个缺陷,该缺陷可能在查询的 ON 子句包含带不等式过滤条件的复杂条件时出现。 #72993 (Nikita Taranov).
  • 在进行 JSON 解析时使用默认的格式设置,以避免反序列化出错。 #73043 (Pavel Kruglov).
  • 修复在使用不支持的存储时事务崩溃的问题。#73045 (Raúl Marín)。
  • 修复在 MemoryTrackingMemoryResident 之间的差值持续增大时可能出现的内存跟踪过高估计问题。#73081 (Azat Khuzhin).
  • 在解析 Tuple 时检查 JSON 中是否存在重复键。此前在解析过程中可能会导致逻辑错误 Invalid number of rows in Chunk#73082Pavel Kruglov)。

构建 / 测试 / 打包改进

  • 之前存放在 /utils 目录中且需要手动从源码编译的所有小型工具,现在都已成为主 ClickHouse 安装包的一部分。关闭相关问题:#72404#72426Nikita Mikhaylov)。
  • 去除在 22.3 中引入的对 /etc/systemd/system/clickhouse-server.service 的删除逻辑。#39323#72259Mikhail f. Shiryaev)。
  • 拆分大型编译单元,以避免因内存 / CPU 限制导致的编译失败。#72352Yakov Olkhovskiy)。
  • OSX:启用 ICU 支持进行构建,从而支持排序规则、字符集转换以及其他本地化功能。#73083Raúl Marín)。

ClickHouse 版本 24.11,2024-11-26

不向后兼容的变更

实验性特性

  • allow_feature_tier 实现为全局开关,用于禁用所有实验性 / beta 特性。#71841 #71145 (Raúl Marín).
  • 修复由于 JSON 子列文件中未转义的特殊字符导致的可能错误 No such file or directory#71182 (Pavel Kruglov).
  • 支持将类型从 String 修改为 JSON。此 PR 还将 JSON 和 Dynamic 类型的序列化更改为新版本 V2。旧版本 V1 仍可以通过启用设置 merge_tree_use_v1_object_and_dynamic_serialization 来使用(可在升级期间使用,以便在不出现问题的情况下回滚版本)。#70442 (Pavel Kruglov).
  • 通过从 JSON 字符串进行序列化/反序列化,实现从 Map/Tuple/Object 到新 JSON 的简单 CAST 转换。#71320 (Pavel Kruglov).
  • 默认不允许在 ORDER BY/GROUP BY/PARTITION BY/PRIMARY KEY 中使用 Variant/Dynamic 类型,因为这可能导致意外结果。#69731 (Pavel Kruglov).
  • 禁止在 min/max 函数中使用 Dynamic/Variant 类型,以避免产生混淆。#71761 (Pavel Kruglov).

新功能

性能优化

  • 针对在整个 part 内索引粒度为常量的情况优化了索引粒度值的内存使用。新增支持始终为 part 选择常量粒度(通过设置 use_const_adaptive_granularity),从而确保其在内存中的使用始终是优化的。这有助于在大型负载场景(共享存储中包含数万亿行数据)下,避免数据 part 的元数据(索引粒度值)内存占用不断增长。#71786Anton Popov)。
  • 现在,在使用 join_algorithm = 'parallel_hash' 并将输入块在多个线程之间分发以进行并行处理时,我们不再复制输入块中的列。#67782 (Nikita Taranov)。
  • 为不相交的数据片段优化了 Replacing 合并算法。#70977 (Anton Popov).
  • 不再在 metrics 和 system.detached_parts 中列出来自只读和一次写入磁盘的 detached parts。 #71086 (Alexey Milovidov).
  • 默认情况下不要计算开销较大的异步指标。该功能在 #40332 中引入,但如果只是为了单个客户而运行一个开销很重的后台作业并不理想。#71087Alexey Milovidov)。
  • 对于 plain_rewritable 磁盘:列出目录时不要调用对象存储 API,因为这样可能成本较高。相反,将文件名列表存储在内存中。需要权衡的是:初始加载时间会增加,并且存储文件名所需的内存也会增多。#70823 (Julia Kartseva)。
  • 通过缩小临界区来改进 system.query_metric_log 采集间隔的性能和准确性。#71473 (Pablo Marcos)。
  • 通过生成虚拟行来实现顺序读取优化,从而在归并排序时减少数据读取量,在存在多个 part 时尤其有用。 #62125 (Shichao Jin).
  • 新增服务器设置项 async_load_system_database,允许服务器在系统数据库尚未完全加载的情况下启动。当存在大量系统表时,这有助于更快地启动 ClickHouse。#69847 (Sergei Trifonov).
  • clickhouse-compressor 添加 --threads 参数,从而支持并行压缩数据。 #70860 (Alexey Milovidov).
  • 添加了 prewarm_mark_cache 设置,用于在插入、合并、拉取数据分片以及表启动时,将 marks 预加载到 mark cache 中。#71053 (Anton Popov)。
  • 将内存中的 index_granularity 数组缩减至合适大小,以减少 MergeTree 表引擎家族的内存占用。#71595 (alesapin).
  • 对非磁盘读操作关闭文件系统缓存选项 boundary_alignment,以提升从带缓存的独立远程文件读取的性能。 #71827 (Kseniia Sumarokova).
  • 之前,类似 SELECT * FROM table LIMIT ... 的查询会加载实际上未被使用的数据分片索引。#71866Alexander Gololobov)。
  • 默认启用 parallel_replicas_local_plan。在查询发起节点上构建完整的本地执行计划,可以在降低资源消耗的同时提升并行副本的性能,并为应用更多查询优化提供空间。#70171 (Igor Nikonov)。

改进

  • 允许通过文件参数方式使用 ClickHouse,例如 ch queries.sql#71589Raúl Marín)。
  • Vertical 格式(当你用 \G 结束查询时也会启用)获得了 Pretty 系列格式的特性,例如:- 高亮显示数字中的千位分组;- 输出可读的数字提示信息。 #71630Alexey Milovidov)。
  • 将外部用户角色从查询发起方推送到集群中的其他节点。当只有查询发起方能访问外部认证系统(如 LDAP)时,这会很有用。#70332 (Andrey Zvonov)。
  • 为聚合函数 any 添加了别名 anyRespectNullsfirstValueRespectNullsanyValueRespectNulls,同时为聚合函数 anyLast 添加了别名 anyLastRespectNullslastValueRespectNulls。这样可以使用更自然的纯驼峰命名风格,而不是驼峰与下划线混用的写法,例如使用 SELECT anyLastRespectNullsStateIf 而不是 anyLast_respect_nullsStateIf#71403Peter Nguyen)。
  • 添加了配置参数 date_time_utc,使 JSON 日志格式支持 RFC 3339/ISO8601 格式的 UTC 日期时间。#71560 (Ali)。
  • 为 S3 端点的用户身份验证新增了一种 header 类型(access_header)。这样可以以最低优先级指定某个访问 header,并且该 header 会被来自任何其他来源(例如表结构或命名集合)的 access_key_id 覆盖。#71011 (MikhailBurdukov)。
  • 在使用常量数组和被捕获的常量参数时,高阶函数将返回常量。#58400 (Alexey Milovidov)。
  • 查询计划步骤名称(EXPLAIN PLAN json=1)和管道处理器名称(EXPLAIN PIPELINE compact=0,graph=1)现在都带有唯一 id 作为后缀。这样可以将处理器分析器的输出和 OpenTelemetry 跟踪与 explain 的输出一一对应。#63518qhsong)。
  • 添加了一个选项,用于在将对象写入 Azure Blob Storage 之后检查该对象是否存在,可通过设置 check_objects_after_upload 来控制。 #64847 (Smita Kulkarni).
  • clickhouse-local 中默认使用 Atomic 数据库。处理了 #50647 中的第 1 和第 5 条。关闭了 #44817#68024Alexey Milovidov)。
  • 异常会违反 HTTP 协议规范,以便向客户端通知错误。#68800 (Sema Checherinda).
  • 通过创建 replica_dir,并在 DDLWorker 中将副本标记为活动状态,以上报正在运行分布式 DDL 查询的主机。 #69658 (tuanpach).
  • distributed_ddl_output_mode 被设置为 *_only_active 时,数据库 ON CLUSTER 查询将只等待活动副本完成。#69660 (tuanpach)。
  • ON CLUSTER 备份和恢复的错误处理和取消机制进行了改进:- 如果某个主机上的备份或恢复失败,将会在其他主机上自动取消 - 不会因为部分主机失败而其他主机继续工作而产生异常或莫名其妙的错误 - 如果某个主机上的备份或恢复被取消,将会在其他主机上自动取消 - 修复了 test_disallow_concurrency 相关问题——现在禁用并发应当表现得更好 - 备份和恢复现在对 ZooKeeper 断连更加不敏感,具备更高的容错能力。#70027 (Vitaly Baranov).
  • 在 S3Queue 存储中为某些设置提供 ALTER TABLE ... MODIFY/RESET SETTING ... 支持。 #70811 (Kseniia Sumarokova).
  • 新增了可按与重新加载服务器证书相同的流程来重新加载客户端证书的功能。#70997 (Roman Antonov)。
  • 使客户端历史记录大小可配置,并增大其默认大小。#71014Jiří Kozlovský)。
  • 为 Parquet 原生读取器添加布尔类型支持。 #71055 (Arthur Passos).
  • 在与 S3 交互时对更多类型的错误进行重试,例如 "Malformed message"。 #71088 (Alexey Milovidov).
  • 降低部分与 S3 相关消息的日志级别。#71090Alexey Milovidov)。
  • 支持写入名称包含空格的 HDFS 文件。#71105 (exmy).
  • 新增了限制复制表、字典和视图数量的设置。#71179 (Kirill)。
  • 如果前者可用,请使用 AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE 替代 AWS_CONTAINER_AUTHORIZATION_TOKEN。修复了 #71074#71269Konstantin Bogdanov)。
  • 从 ReplicatedMergeTree 重启线程中移除创建 metadata_version ZooKeeper 节点的逻辑。唯一需要创建该节点的情况是,当用户从早于 20.4 的版本直接升级到晚于 24.10 的版本时。ClickHouse 不支持跨越超过一年的升级,因此我们应该抛出异常并要求用户逐步升级,而不是创建该节点。#71385Miсhael Stetsyuk)。
  • 为高级仪表板添加按主机划分的仪表板 Overview (host)Cloud overview (host)#71422 (alesapin)。
  • clickhouse-local 默认使用隐式 SELECT,这使得可以将其用作计算器。改进了隐式 SELECT 模式下的语法高亮效果。#71620 (Alexey Milovidov)。
  • 命令行应用程序现在即使是多条语句也会进行语法高亮显示。#71622 (Alexey Milovidov)。
  • 命令行应用程序在出现错误时将返回非零退出码。在之前的版本中,disks 应用程序在出现错误时会返回零,而其他应用程序在错误码为 256(PARTITION_ALREADY_EXISTS)和 512(SET_NON_GRANTED_ROLE)时也会返回零。#71623Alexey Milovidov)。
  • 当用户/用户组以 ID 指定时,clickhouse su 会失败。此补丁修复了该问题,使其也能接受 UID:GID 形式。 #71626 (Mikhail f. Shiryaev).
  • 允许通过设置 filesystem_cache_prefer_bigger_buffer_size 来禁用文件系统缓存的内存缓冲区自动增大。 #71640 (Kseniia Sumarokova).
  • 在文件系统缓存中,为后台下载的最大文件分段大小新增单独的设置项 background_download_max_file_segment_size#71648 (Kseniia Sumarokova).
  • 稍微改进了 JSON 类型解析:如果当前 JSON 路径所在的块包含多种类型的值,将按特定的 best-effort 顺序依次尝试各类型,从而选择最合适的类型。#71785 (Pavel Kruglov)。
  • 此前,从 system.asynchronous_metrics 读取数据会等待并发更新完成。如果系统处于高负载状态,这可能会耗费较长时间。此更改后,可以随时读取先前已收集的值。#71798 (Alexander Gololobov)。
  • S3Queue 和 AzureQueue:将 polling_max_timeout_ms 设置为 10 分钟,polling_backoff_ms 设置为 30 秒。#71817Kseniia Sumarokova)。
  • history 周期内将 HostResolver 更新三次。#71863 (Sema Checherinda).
  • 在高级仪表板 HTML 页面中,添加了一个用于从 system.dashboards 表中选择仪表板的下拉选择器。#72081Sergei Trifonov)。
  • 在完成授权后检查默认数据库是否存在。修复 #71097#71140Konstantin Bogdanov)。

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

  • 在执行 ATTACH PART 查询期间去重的数据分片,现在不再停留在带有 attaching_ 前缀的状态。#65636 (Kirill)。
  • 修复了在 IN 函数中使用 DateTime64 时精度丢失的问题。#67230 (Yarik Briukhovetskyi).
  • 修复在 ORDER BY ... WITH FILL 中使用带有 IGNORE/RESPECT NULLS 的函数时可能出现的逻辑错误,关闭 #57609#68234Vladimir Cherkasov)。
  • 修复了在触及内存限制时,使用 Native 格式进行异步插入时会出现的罕见逻辑错误。 #68965 (Anton Popov).
  • 修复在 CREATE TABLE 语句中对 EPHEMERAL 列的 COMMENT 定义。 #70458 (Yakov Olkhovskiy).
  • 修复 JSONExtract 与 LowCardinality(Nullable) 搭配使用时的逻辑错误。 #70549 (Pavel Kruglov).
  • 当存在另一个具有相同 zkpath 的副本时,允许执行 SYSTEM DROP REPLICA zkpath。 #70642 (MikhailBurdukov).
  • 修复 AggregateFunctionGroupArraySorted 中的崩溃和内存泄漏。#70820 (Michael Kolupaev)。
  • 在 URL 引擎中新增支持通过用户请求头覆盖 Content-Type。 #70859 (Artem Iurin).
  • 修复 StorageS3Queue 中的逻辑错误 “无法在 /processed 中创建持久节点,因为该节点已存在”。 #70984 (Kseniia Sumarokova).
  • 修复了在某些情况下未能关闭命名会话,导致其一直处于挂起状态的问题。#70998 (Márcio Martins).
  • 修复在投影轻量级删除的 rebuild 选项中未考虑 _row_exists 列的问题。 #71089 (Shichao Jin).
  • 修复在 Oracle Linux UEK 6.10 上运行时出现的 AT_* is out of range 问题。#71109 (Örjan Fors).
  • 修复由于意外竞态条件导致的 system.query_metric_log 中错误的值。#71124 (Pablo Marcos).
  • 修复 quantileExactWeightedInterpolated 聚合函数名称不一致的问题。该缺陷是在 https://github.com/ClickHouse/ClickHouse/pull/69619 中引入的。cc @Algunenano。#71168 (李扬)。
  • 修复在函数比较中使用 Dynamic 时触发 bad_weak_ptr 异常的问题。#71183 (Pavel Kruglov).
  • 检查要读取的 7z 文件是否位于本机。 #71184 (Daniil Ivanik)。
  • 修复在通过 HTTP 和异步插入使用 Native 格式时被忽略的格式设置问题。 #71193 (Pavel Kruglov).
  • 使用设置 use_query_cache = 1 运行的 SELECT 查询,如果出现系统表名称的字面量,将不再被拒绝。例如:SELECT * FROM users WHERE name = 'system.metrics' SETTINGS use_query_cache = true; 现在可以正常工作。#71254Robert Schulze)。
  • 修复了这样一个问题:在启用 enable_filesystem_cache=1,但存储配置中的磁盘未配置任何缓存时,内存使用量会增加。 #71261 (Kseniia Sumarokova).
  • 修复在从 Dynamic 列反序列化 LowCardinality 字典时可能出现的“Cannot read all data”错误。 #71299 (Pavel Kruglov).
  • 修复客户端中并行输出格式清理不完整的问题。 #71304 (Raúl Marín).
  • 在命名集合中补充了缺失的反转义处理。否则,clickhouse-server 将无法启动。#71308 (MikhailBurdukov)。
  • 修复通过原生协议进行的包含空数据块的异步插入。#71312 (Anton Popov).
  • 修复在错误的通配符授权下 AST 格式不一致的问题 #71309#71332 (pufit).
  • 在 data parts 的析构函数中添加 try/catch,以避免调用 std::terminate。 #71364 (alesapin).
  • 检查 JSON 类型提示中的可疑类型和试验性类型。#71369 (Pavel Kruglov).
  • 在非 Linux 操作系统上同样启动 memory worker 线程(修复 #71051)。#71384Alexandre Snarskii)。
  • 修复 Chunk 中 Variant 列的无效行数错误。#71388Pavel Kruglov)。
  • 修复旧版 PostgreSQL 中出现的列 "attgenerated" 不存在的问题,对应 #60651#713960xMihalich)。
  • 为避免服务器日志被大量刷屏,现在会将失败的身份验证尝试记录为 DEBUG 级别,而不是 ERROR 级别。#71405 (Robert Schulze).
  • 修复在向 mongodb 表函数传递错误参数(例如 NULL)时导致的崩溃。 #71426 (Vladimir Cherkasov).
  • 修复启用 optimize_rewrite_array_exists_to_has 时发生的崩溃。#71432 (Raúl Marín).
  • 修复了在插入操作中对设置 max_insert_delayed_streams_for_parallel_write 的使用。此前该设置的行为不正确,在向多个分区写入数据的插入操作中可能导致较高的内存占用。#71474 (Anton Popov).
  • 修复在 arrayJoin 可能出现在 WHERE 条件中的情况下,旧分析器中可能出现的错误 Argument for function must be constant。这是在合并请求 https://github.com/ClickHouse/ClickHouse/pull/65414 之后引入的回归问题。#71476Nikolai Kochetov)。
  • 防止在 SortCursor 中列数为 0 时发生崩溃(旧版分析器)。#71494 (Raúl Marín).
  • 修复由未初始化的 ORC 数据导致的 Date32 超出范围问题。更多详细信息请参阅 https://github.com/apache/incubator-gluten/issues/7823#71500李扬)。
  • 修复在 wide part 中统计 Dynamic 和 JSON 类型列大小的方式。 #71526 (Pavel Kruglov).
  • 修复 Analyzer 在物化视图中的查询使用带有 CTE 的 IN 时的问题。关闭 #65598#71538Maksim Kita)。
  • 避免在约束中使用 UDF 时发生崩溃。#71541 (Raúl Marín)。
  • bitShift 函数中,当发生越界时,返回 0 或默认字符,而不抛出错误。#71580Pablo Marcos)。
  • 修复在某些引擎下使用物化视图时导致的服务器崩溃问题。#71593Pervakov Grigorii)。
  • 对包含常量数组别名的嵌套数据结构执行 array join 时,会导致空指针解引用。此更改已关闭 #71677#71678Alexey Milovidov)。
  • 修复在使用空元组执行 ALTER 操作时出现的 LOGICAL_ERROR。修复了 #71647#71679Amos Bird)。
  • 在使用 NOT IN 运算符的情况下,不要转换作用于分区列的谓词中的常量集合。#71695Eduard Karacharov)。
  • 修复 docker 初始化脚本失败时的日志消息,使其表述更易于理解。#71734 (Андрей).
  • 修复将 LowCardinality(Nullable) 转换为 Dynamic 时的 CAST。此前这可能会导致错误 Bad cast from type DB::ColumnVector<int> to DB::ColumnNullable#71742 (Pavel Kruglov).
  • 修复在 WHERE 条件中对主键为 DateTime64 类型的列使用 toDayOfWeek 时抛出的异常。#71849 (Yakov Olkhovskiy).
  • 修复了解析为稀疏列后填充默认值的逻辑。#71854 (Anton Popov)。
  • 修复在分布式表上当输入为 ALIAS 时 GROUPING 函数出错的问题,关闭 #68602#71855Vladimir Cherkasov)。
  • 修复在启用 allow_experimental_join_condition 时可能导致的崩溃,关闭 #71693#71857Vladimir Cherkasov)。
  • 修复了使用 WITH TIES 子句时 SELECT 语句可能返回行数不足的问题。 #71886 (wxybear).
  • 修复当在 arrayWithConstant 计算中某一列被错误地认为超出数组大小限制时引发的 TOO_LARGE_ARRAY_SIZE 异常。#71894Udi)。
  • clickhouse-benchmark 对耗时超过一秒的查询报告了错误的指标。#71898 (Alexey Milovidov).
  • 修复 clickhouse-client 中进度指示器与进度表之间的数据竞争问题。在使用 FROM INFILE 时会出现该问题。在执行 INSERT 查询期间拦截按键,以切换进度表显示。#71901 (Julia Kartseva)。
  • 使用辅助 keeper 进行集群自动发现。 #71911 (Anton Ivashkin).
  • 修复在 24.6 中损坏的 system.s3/azure_queue_log 表中的 rows_processed 列。关闭 #69975#71946Kseniia Sumarokova)。
  • 修复了 s3/s3Cluster 函数可能返回不完整结果或抛出异常的问题。该问题出现在在 S3 URI 中使用通配符模式(例如 pattern/*),且存在一个键为 pattern/ 的空对象时(此类对象会由 S3 控制台自动创建)。同时,将设置项 s3_skip_empty_files 的默认值从 false 更改为 true#71947 (Nikita Taranov)。
  • 修复 clickhouse-client 语法高亮时的崩溃问题。关闭 #71864#71949Nikolay Degterinsky)。
  • 修复当第一个参数为常量时,在 ORDER BY 中对 MergeTree 表使用二元单调函数会触发 Illegal type 错误的问题。修复了 #71941#71966Nikolai Kochetov)。
  • 仅允许在子查询中使用的 EXPLAIN AST 中包含 SELECT 查询。其他类型的查询会导致逻辑错误:'Bad cast from type DB::ASTCreateQuery to DB::ASTSelectWithUnionQuery' 或 Inconsistent AST formatting#71982 (Pavel Kruglov).
  • 当使用 clickhouse-client 插入记录时,客户端会从服务器读取列描述。但之前存在一个 bug:我们以错误的顺序写入了这些描述,正确的顺序应为 [statistics, ttl, settings]。#71991Han Fei)。
  • 当启用 format_alter_commands_with_parentheses 时,修复 MOVE PARTITION ... TO TABLE ... ALTER 命令的格式问题。#72080 (János Benjamin Antal)。
  • 修复了在使用并行副本的查询中对 RIGHT / FULL JOIN 的处理。现在,RIGHT JOIN 可以使用并行副本执行(右表的读取会分布到各个副本上)。FULL JOIN 无法在节点之间并行化,只能在本地执行。 #71162 (Igor Nikonov).
  • 修复了由于系统调用受限,导致 Docker 容器中的 ClickHouse 向 stderr 输出 "get_mempolicy: Operation not permitted" 的问题。 #70900 (filimonov).
  • 将修复 ZooKeeper 中 metadata_version 记录的操作放在重启线程中,而不是附加线程中。#70297 (Miсhael Stetsyuk)。
  • 这是针对“zero-copy”复制的修复,该功能不受支持,并将被完全移除。当在使用 zero-copy 复制的 ReplicatedMergeTree 中仍有节点在使用某个 blob 时,不要删除该 blob。#71186 (Antonio Andelic)。
  • 这是针对 “zero-copy” 复制的修复,该功能不受支持并将被完全移除。在将一个数据分片移动到 zero-copy 磁盘之前先获取 zero-copy 共享锁,以防在 Keeper 不可用时可能发生的数据丢失。#71845 (Aleksei Filatov)。

ClickHouse 发布 24.10,2024-10-31

向后不兼容的变更

  • 允许在包含 UNION 的查询链中,当子查询被括号括起来时,将 SETTINGS 写在 FORMAT 之前。这修复了 #39712。改变在一个查询中连续两次指定 SETTINGS 子句时的行为。更靠近对应子查询的 SETTINGS 子句将优先生效。在此前的版本中,最外层的 SETTINGS 子句可能会优先于内部子句。#68614Alexey Milovidov)。
  • 默认现在允许对 [PRE]WHERE 子句中的过滤条件进行重排序。可以通过将 allow_reorder_prewhere_conditions 设置为 false 来禁用该行为。#70657Nikita Taranov)。
  • 移除许可证不兼容的 idxd-config 库。同时也移除了实验性的 Intel DeflateQPL 编解码器。#70987Alexey Milovidov)。

新功能

  • 允许使用通配符前缀授予访问权限:GRANT SELECT ON db.table_pefix_* TO user#65311pufit)。
  • 在查询运行期间按下空格键时,客户端会显示一个实时更新的详细指标表。可以在 clickhouse-client 中使用新的 --progress-table 选项全局启用该功能;新的 --enable-progress-table-toggle 选项与 --progress-table 关联,按下 Control+空格可切换进度表的渲染。#63689Maria Khristenko),#70423Julia Kartseva)。
  • 允许对象存储表引擎和数据湖对读取的文件进行缓存,使用由 ETag + 文件路径生成的哈希值作为缓存键。#70135 (Kseniia Sumarokova)。
  • 支持通过查询创建表:CREATE TABLE ... CLONE AS ...。它会克隆源表的 schema,然后将所有分区附加到新创建的表上。此功能仅支持 MergeTree 系列表。修复 #65015#69091tuanpach)。
  • 添加了新的系统表 system.query_metric_log,其中包含来自表 system.events 的各个查询的内存和指标值历史记录,并会定期写入磁盘。#66532Pablo Marcos)。
  • 可以通过隐式 SELECT 来编写简单的 SELECT 查询,从而启用计算器式表达式,例如 ch "1 + 2"。这由一个新的设置 implicit_select 控制。#68502Alexey Milovidov)。
  • 为 clickhouse local 增加对 --copy 模式的支持,将其用作格式转换的快捷方式 #68503#68583Denis Hananein)。
  • 新增一个用于可视化合并过程的内置 HTML 页面,可通过 /merges 路径访问。 #70821 (Alexey Milovidov)。
  • 新增对 arrayUnion 函数的支持。#68989 (Peter Nguyen)。
  • 支持参数化 SQL 别名。#50665 (Anton Kozlov)。
  • 新增了一个聚合函数 quantileExactWeightedInterpolated,它是基于 quantileExactWeighted 的插值版本。可能有人会问,既然已经有了 quantileExactInterpolatedWeighted,那为什么还需要新的 quantileExactWeightedInterpolated?原因在于新函数比旧的更精确。这是为了与 Spark 兼容。#69619李扬)。
  • 新增函数 arrayElementOrNull。当数组索引越界或 Map 中不存在指定键时,返回 NULL#69646李扬)。
  • 允许用户通过在 config.xml 文件中新增加的 message_regexpmessage_regexp_negative 字段中指定正则表达式来过滤日志输出。日志过滤应用于已格式化且无颜色的文本,以提供最直观的开发者体验。#69657Peter Nguyen)。
  • 新增 RIPEMD160 函数,用于计算字符串的 RIPEMD-160 密码哈希值。示例:SELECT HEX(RIPEMD160('The quick brown fox jumps over the lazy dog')) 返回 37F332F68DB77BD9D7EDD4969571AD671CF9DD3B#70087Dergousov Maxim)。
  • 支持在 HDFS 上读取 Iceberg 表。#70268 (flynn).
  • 现在支持以 WITH ... INSERT 形式使用 CTE,此前仅支持 INSERT ... WITH ...#70593 (Shichao Jin)。
  • MongoDB 集成:支持所有 MongoDB 类型,在 MongoDB 端支持 WHERE 和 ORDER BY 语句,并对 MongoDB 不支持的表达式进行限制。请注意,新的集成默认处于禁用状态,如需使用,请在服务器配置中将 <use_legacy_mongodb_integration> 设置为 false#63279Kirill Nikiforov)。
  • 新增了一个函数 getSettingOrDefault,如果在当前 profile 中未找到自定义设置,则返回默认值并避免抛出异常。#69917 (Shankar)。

实验特性

  • 可刷新的物化视图已达到生产可用状态。#70550Michael Kolupaev)现在在 Replicated 数据库中也支持可刷新的物化视图。#60669Michael Kolupaev)。
  • 并行副本功能从实验阶段提升到 beta 阶段。重构了控制并行副本算法行为的相关设置。简要回顾:ClickHouse 针对涉及多个副本的并行读取提供了四种不同算法,由设置 parallel_replicas_mode 进行控制,其默认值为 read_tasks。此外,新增了开关类型设置 enable_parallel_replicas#63151Alexey Milovidov),(Nikita Mikhaylov)。
  • 通过在 Dynamic 中的内部类型上执行函数,大多数函数现在支持 Dynamic 类型。#69691Pavel Kruglov)。
  • 在启用设置 input_format_binary_read_json_as_string/output_format_binary_write_json_as_string 时,允许在 RowBinary 格式下将 JSON 类型作为二进制字符串进行读写。#70288Pavel Kruglov)。
  • 允许在 Native 格式中将 JSON 列序列化/反序列化为单个 String 列。输出时使用设置 output_format_native_write_json_as_string;输入时在列数据之前写入序列化版本 1#70312Pavel Kruglov)。
  • 为 MergeTree 表引入了一种特殊(实验性)的 merge 选择器模式,使其对数据片段数量接近上限的分区执行更为激进的合并策略。该模式由 MergeTree 级别设置 merge_selector_use_blurry_base 控制。#70645Nikita Mikhaylov)。
  • 实现了 Avro 的 Union 类型与 ClickHouse 的 Variant 类型之间的通用序列化/反序列化(ser/de)。修复了 #69713#69712Jiří Kozlovský)。

性能优化

  • 重构 IDiskIObjectStorage 以提升性能。plainplain_rewritable 对象存储中的表将初始化得更快。#68146Alexey MilovidovJulia Kartseva)。在判断 plain_rewritable 磁盘上某个文件或目录是否存在时,不要调用对象存储的 LIST API,因为这在成本上可能不划算。#70852Julia Kartseva)。减少在 plain_rewritable 磁盘中对对象存储 HEAD API 的请求次数。#70915Julia Kartseva)。
  • 新增了支持将数据直接解析为稀疏列的功能。 #69828 (Anton Popov).
  • 提高了对含有大量缺失值的格式(例如 JSONEachRow)的解析性能。 #69875 (Anton Popov).
  • 支持并行读取 Parquet 行组,并在单线程模式下预取这些行组。 #69862 (LiuNeng).
  • pointInPolygon 增加 minmax 索引支持。 #62085 (JackyWoo).
  • 在读取 Parquet 文件时使用 Bloom 过滤器。#62966Arthur Passos)。
  • 无锁重命名数据片段,以避免由于数据片段锁导致 INSERT 操作影响 SELECT 查询(在正常情况下,启用 fsync_part_directory 且并行执行 INSERT 时,SELECT 的 QPS 提升了 2 倍,在高负载下效果更为显著)。注意,目前这仅适用于 ReplicatedMergeTree#64955Azat Khuzhin)。
  • 使 materialize ttl 遵从 ttl_only_drop_parts;仅读取重新计算 TTL 所需的列,并通过用空分片替换的方式来删除分片。 #65488 (Andrey Zvonov).
  • ThreadPool 中优化了线程创建逻辑,以最大限度减少锁竞争。线程创建现在在临界区之外执行,从而在高负载情况下避免作业调度和线程管理的延迟,使 ClickHouse 在高并发负载下更加响应迅速。#68694 (filimonov)。
  • 支持从 ORC 读取 LowCardinality 字符串列。 #69481 (李扬).
  • part_logquery_views_logfilesystem_cache_log 等系统日志中,对 ProfileEvents 使用 LowCardinality#70152 (Alexey Milovidov)。
  • 提升 fromUnixTimestamp/toUnixTimestamp 函数的性能。#71042 (kevinyhzou).
  • 在从阻塞 I/O 进行读取时,不要为整个服务器禁用来自页面缓存的非阻塞读取。此前,如果某个文件系统(例如 tmpfs)不支持 preadv2 系统调用而其他文件系统支持,就会导致性能下降。#70299Antonio Andelic)。
  • ALTER TABLE .. REPLACE PARTITION 不再等待其他分区中正在进行的 mutation/merge 操作完成。#59138 (Vasily Nemkov)。
  • 从 Keeper 同步 ACL 时不要执行验证。创建时已经进行了验证。原则上这问题不大,但在一些部署中,可能会有成万甚至更多已创建的用户,而这些不必要的哈希验证会在服务器启动期间花费很长时间才能完成(此时会从 Keeper 同步所有内容)。#70644 (Raúl Marín)。

改进

  • CREATE TABLE AS 会复制 PRIMARY KEYORDER BY 等类似子句(针对 MergeTree 表)。#69739 (sakulali)。
  • 在 Keeper 中支持 64 位 XID。可以通过 use_xid_64 配置项启用该功能。#69908 (Antonio Andelic)。
  • 当布尔类型的命令行参数未显式提供值时,该参数将被设置为 true(例如 clickhouse-client --optimize_aggregation_in_order --query "SELECT 1")。#70459davidtsuk)。
  • 新增了用户级设置 min_free_disk_bytes_to_perform_insertmin_free_disk_perform_to_throw_insert,用于防止在磁盘接近写满时继续执行插入操作。#69755 (Marco Vilas Boas)。
  • 内嵌的设置文档会比网站上的文档更加详细和完整。这是让网站文档始终从源代码自动生成之前的第一步。这将带来深远影响: - 可以保证涵盖每一个设置; - 默认值不可能过时; - 我们可以为每个 ClickHouse 版本生成对应的文档; - 即使在无法访问互联网的情况下,服务器本身也可以展示这些文档。
  • 允许在函数 replace 中使用空 needle 参数,其行为与 PostgreSQL 保持一致。 #69918 (zhanglistar)。
  • replaceRegexp* 函数中允许 needle 为空。 #70053 (zhanglistar).
  • 根据存储策略,会在 data/database_name/ 目录中创建指向表数据实际路径的符号链接,而不再指向默认磁盘上的 store/... 目录。#61777Kirill)。
  • JSON 解析 Enum 字段时,包含整数值的字符串会被解释为对应的 Enum 元素。此更改解决了 #65119#66801scanhex12)。
  • 允许对空字符串执行 TRIMLEADINGTRAILING 操作,并将其视为空操作(no-op)。关闭 issue #67792#68455Peter Nguyen)。
  • 提升 cast(timestamp as String) 与 Spark 的兼容性。 #69179 (Wenzheng Liu).
  • enable_analyzer 设置为 true 时,始终使用新的 analyzer 来计算常量表达式。支持在无需使用 SELECT 查询来计算常量表达式的情况下,对 executable 表函数的参数进行计算。#69292Dmitry Novik)。
  • 添加 enable_secure_identifiers 设置,以禁止包含特殊字符的标识符。#69411 (tuanpach)。
  • 添加 show_create_query_identifier_quoting_rule,用于定义在 SHOW CREATE TABLE 查询结果中标识符加引号的行为。可选值:user_display:当标识符是关键字时加引号。when_necessary:当标识符是 {"distinct", "all", "table"} 之一且可能导致歧义时(例如作为列名、字典属性名)加引号。always:始终为标识符加引号。 #69448 (tuanpach)。
  • 改进访问实体依赖关系的恢复逻辑 #69563 (Vitaly Baranov)。
  • 当你运行 clickhouse-client 或其他 CLI 应用程序时,如果由于服务器过载导致启动缓慢,而你已经开始输入查询(例如 SELECT),旧版本会在打印欢迎信息之前,先把终端回显中剩余的内容输出出来,比如显示为 SELECTClickHouse local version 24.10.1.1.,而不是 ClickHouse local version 24.10.1.1.。现在这个问题已经修复。此更改关闭了 #31696#69856Alexey Milovidov)。
  • system.replicas 表添加新列 readonly_duration,以便在告警中区分真正的只读副本和哨兵副本。#69871 (Miсhael Stetsyuk)。
  • join_output_by_rowlist_perkey_rows_threshold 设置项的类型更改为无符号整数。 #69886 (kevinyhzou)。
  • 改进 OpenTelemetry span 日志记录,使其包含查询设置。 #70011 (sharathks118).
  • 当 lambda 结果类型不符合预期时,为高阶数组函数添加诊断信息。 #70093 (ttanay).
  • Keeper 改进:在集群变更期间减少锁操作。 #70275 (Antonio Andelic).
  • SHOW GRANTS 命令中添加 WITH IMPLICITFINAL 关键字。修复与隐式授权相关的一个小问题:#70094#70293pufit)。
  • 对 MergeTree 设置遵循 compatibility 参数。compatibility 的取值在服务器启动时从 default profile 中获取,并据此调整默认的 MergeTree 设置。之后对 compatibility 设置的更改不会影响 MergeTree 设置。#70322Nikolai Kochetov)。
  • 在服务器间通信发生错误时,避免将大体积的 HTTP 响应体写入日志,以防止日志刷屏。 #70487 (Vladimir Cherkasov).
  • 添加了新的设置 max_parts_to_move,用于控制一次最多可以移动的数据部分数量。#70520 (Vladimir Cherkasov)。
  • 限制特定日志消息的频率。#70601 (Alexey Milovidov).
  • 在客户端中,对带有 PART 限定符的 CHECK TABLE 的格式化不正确。#70660 (Alexey Milovidov)。
  • 支持使用原生 Parquet 写入器写入列索引和偏移索引。#70669 (LiuNeng).
  • 支持使用 joda 语法解析 DateTime64 的微秒和时区(“joda” 是一个流行的 Java 日期时间库,“joda 语法” 指该库的日期时间格式风格)。 #70737 (kevinyhzou)。
  • 更改了判定云存储是否支持批量删除的方法。#70786 (Vitaly Baranov)。
  • 在原生读取器中添加对 Parquet page v2 的支持。#70807Arthur Passos)。
  • 增加了对同时设置了 storage_policydisk 的表的检查。同时,在使用 disk 设置时,增加了对新旧存储策略兼容性的检查。#70839Kirill)。
  • 添加 system.s3_queue_settingssystem.azure_queue_settings#70841 (Kseniia Sumarokova).
  • 函数 base58Encodebase58Decode 现在接受 FixedString 类型的参数。示例:SELECT base58Encode(toFixedString('plaintext', 9));#70846Faizan Patel)。
  • 为 part log 的每种记录类型添加 partition 列。之前仅对某些记录设置了该列。此更改解决了 #70819#70848Alexey Milovidov)。
  • MergeStartMutateStart 事件添加到 system.part_log 中,有助于合并操作的分析和可视化。#70850Alexey Milovidov)。
  • 添加一个关于已合并源数据片段数量的 profile 事件,用于在生产环境中监控 MergeTree 的扇出度。 #70908 (Alexey Milovidov)。
  • 后台下载到文件系统缓存功能已重新启用。#70929 (Nikita Taranov).
  • 新增一个名为 Trivial 的合并选择器算法,仅供专业场景使用。它的效果不如 Simple 合并选择器。#70969 (Alexey Milovidov)。
  • 支持原子性 CREATE OR REPLACE VIEW#70536 (tuanpach)
  • 为聚合函数 windowFunnel 新增 strict_once 模式,以防止同一事件在同时满足多个条件时被重复计数,关闭 #21835#69738Vladimir Cherkasov)。

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

  • 将配置更新应用到全局上下文对象中,可修复诸如 #62308 之类的问题。#62944Amos Bird)。
  • 修复 ReadSettings 未使用用户设定值、而只使用默认值的问题。#65625Kseniia Sumarokova)。
  • 修复在使用有符号参数时 sumMapFiltered 中的类型不匹配问题。#58408 (Chen768959)。
  • 修复在传入可选时区参数时 toHour 等转换函数的单调性问题。#60264 (Amos Bird)。
  • 放宽对 Merge 表的 supportsPrewhere 检查。这修复了 #61064。该检查在 #60082 中被不必要地过度收紧了。#61091Amos Bird)。
  • 修复对 use_concurrency_control 设置的处理方式,使 concurrent_threads_soft_limit_num 限制能够被正确执行。由于之前该功能存在问题,此更改使并发控制默认启用。#61473Sergei Trifonov)。
  • 修复当 IS NULL 检查被任意其他函数(例如 NOT)包裹时,JOIN ON 子句优化不正确的问题,该问题可能导致结果错误。已关闭 #67915#68049Vladimir Cherkasov)。
  • 防止执行会导致表的 CREATE 查询无效的 ALTER 查询。#68574 (János Benjamin Antal)。
  • 修复 negate (-) 和 NOT 函数在处理元组和数组时 AST 格式化不一致的问题。#68600Vladimir Cherkasov)。
  • 修复了在反序列化过程中将不完整类型插入到 Dynamic 中的问题。这可能会导致参数越界(Parameter out of bound)错误。#69291 (Pavel Kruglov).
  • 零拷贝复制是实验性特性,不应在生产环境中使用:修复在启用零拷贝的 ReplicatedMergeTree 中执行 restore replica 后出现的无限循环问题。 #69293 (MikhailBurdukov)。
  • 将存储引擎 S3Queueprocessing_threads_num 的默认值恢复为 CPU 核心数。#69384Kseniia Sumarokova)。
  • 在将嵌套的 repeated protobuf 字段序列化/反序列化到嵌套列时跳过 try/catch 流程(修复 #41971)。#69556Eliot Hautefeuille)。
  • 修复在 PostgreSQL 引擎中向 FixedString 类型列插入数据时发生的崩溃。#69584 (Pavel Kruglov)。
  • 修复在执行 create view t as (with recursive 42 as ttt select ttt); 时出现的崩溃。#69676 (Han Fei).
  • 修复了当值类型为 DateTime64 时,maxMapState 抛出 “Bad get” 异常的问题。#69787 (Michael Kolupaev).
  • 通过将 useDefaultImplementationForLowCardinalityColumns 重写为返回 true,修复 LowCardinality 列上 getSubcolumn 的问题。 #69831 (Miсhael Stetsyuk).
  • 修复在执行分布式表 DROP 失败后导致分布式发送永久阻塞的问题。#69843 (Azat Khuzhin).
  • 修复包含 WITH FILL 且键为 NaN 的无法取消的查询问题。此更改关闭了 #69261#69845Alexey Milovidov)。
  • 将 analyzer 的默认值修正为旧的兼容性值。#69895 (Raúl Marín).
  • 在删除旧表的过程中执行 CREATE OR REPLACE VIEW 时,不再检查依赖关系。此前,如果要重新创建的视图存在依赖它的表,CREATE OR REPLACE 查询会失败。#69907 (Pavel Kruglov)。
  • 与 Decimal 相关的更新。修复了 #69730#69978Arthur Passos)。
  • 现在,DEFINER/INVOKER 也适用于参数化视图。#69984pufit)。
  • 修复对视图 DEFINER 的解析。#69985 (pufit).
  • 修复了一个错误:在使用 DateDate32 参数的查询中,时区可能导致查询结果发生变化。#70036 (Yarik Briukhovetskyi)。
  • 修复了在包含嵌套视图并带有 WHERE 条件的查询中出现的 Block structure mismatch 错误。修复了 #66209#70054Nikolai Kochetov)。
  • 在计算 tuple 函数时,避免在不同命名元组之间重复使用列。此更改修复了 #70022#70103Amos Bird)。
  • 修复在区间中替换字面量时错误触发的 LOGICAL_ERROR。 #70122 (Pablo Marcos).
  • 在执行 ALTER TABLE MODIFY COLUMN/QUERY 时检查 Nullable(Nothing) 类型,以避免出现包含此数据类型的表。#70123 (Pavel Kruglov).
  • 为非法查询 JOIN ... ON * 提供适当的错误消息,关闭 #68650#70124Vladimir Cherkasov)。
  • 修复在跳过索引时产生的错误结果。#70127 (Raúl Marín).
  • 修复 ColumnObject/ColumnTuple decompress 方法中的数据竞争问题,该问题可能导致释放后仍然使用堆内存(heap use after free)。#70137Pavel Kruglov)。
  • 修复在对 Dynamic 类型的列执行 ALTER COLUMN 时可能出现的挂起问题。 #70144 (Pavel Kruglov).
  • 现在,ClickHouse 会将更多错误视为可重试,并且在出现此类错误时不会将数据部分标记为损坏。 #70145 (alesapin).
  • 在为 JSON 子列创建 Dynamic 类型时,现在会使用正确的 max_types 参数。#70147Pavel Kruglov)。
  • 修复使用 bcrypt 密码认证方式的用户,其密码会显示在 system.query_log 中的问题。 #70148 (Nikolay Degterinsky).
  • 修复原生接口(InterfaceNativeSendBytes)的事件计数器。#70153Yakov Olkhovskiy)。
  • 修复与 JSON 列相关的潜在崩溃问题。 #70172 (Pavel Kruglov).
  • 修复 arrayMinarrayMax 的多个问题。 #70207 (Raúl Marín).
  • 使 JSON 类型解析器遵循 allow_simdjson 设置。 #70218 (Pavel Kruglov).
  • 修复在创建包含两个 SELECT 且使用 INTERSECT 的物化视图时发生的空指针解引用错误,例如:CREATE MATERIALIZED VIEW v0 AS (SELECT 1) INTERSECT (SELECT 1);#70264Konstantin Bogdanov)。
  • 不要使用启动脚本修改全局设置。以前,在启动脚本中更改某个设置会导致它在全局范围内被修改。 #70310 (Antonio Andelic).
  • 修复在减小 max_types 参数时对 Dynamic 类型执行 ALTER 时可能导致服务器崩溃的问题。#70328 (Pavel Kruglov).
  • 修复由于错误使用 WITH FILL 而导致的崩溃。#70338Raúl Marín)。
  • 修复 SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf 中可能出现的 use-after-free 问题。 #70358 (Azat Khuzhin).
  • 修复在对 JSON 子对象的子列执行 GROUP BY 时出现的崩溃。 #70374 (Pavel Kruglov).
  • 如果 part 没有任何行,则不要为垂直合并预取 part。 #70452 (Antonio Andelic).
  • 修复在 WHERE 中使用 lambda 函数时的崩溃。#70464Raúl Marín)。
  • 修复在使用 Replicated 数据库且在次级副本上表函数源不可用时,通过 CREATE ... AS table_function(...) 创建表的问题。 #70511 (Kseniia Sumarokova).
  • wait_for_async_insert=1 的情况下忽略所有异步插入的输出。修复了 #62644 中的问题。#70530Konstantin Bogdanov)。
  • 在从 system.remote_data_paths 中遍历 shadow 目录时,忽略 frozen_metadata.txt 文件。 #70590 (Aleksei Filatov)。
  • 修复在未对齐的内存上创建有状态窗口函数的问题。#70631 (Raúl Marín).
  • 修复了在添加具有非空默认表达式的 Array 类型列后,SELECT 查询和合并操作中极少见的崩溃问题。 #70695 (Anton Popov).
  • 对表函数 s3 执行 INSERT 操作时将会遵循查询设置。 #70696 (Vladimir Cherkasov).
  • 修复在启用跳过不受支持字段时推断 protobuf 模式时出现的无限递归问题。#70697Raúl Marín)。
  • 默认情况下禁用 enable_named_columns_in_function_tuple。 #70833 (Raúl Marín).
  • 修复 S3Queue 表引擎在根据服务器 CPU 核心数推导 processing_threads_num 设置时该设置不生效的问题。#70837Kseniia Sumarokova)。
  • 规范化聚合状态中的具名元组参数。这修复了 #69732#70853Amos Bird)。
  • 修复由于负零导致的双层哈希表中的逻辑错误。此更改关闭了 #70973#70979Alexey Milovidov)。
  • 修复分布式和并行副本查询中 limit bylimit with ties 的行为。 #70880 (Nikita Taranov)。

ClickHouse 发布 24.9,2024-09-26

向后不兼容的变更

  • 现在对具名元组(named tuple)支持类似 a[b].c 的表达式,同时也支持来自任意表达式的具名下标访问,例如 expr().name。这对处理 JSON 很有用。本变更关闭了 #54965。在之前的版本中,形如 expr().name 的表达式会被解析为 tupleElement(expr(), name),查询分析器会尝试查找列 name,而不是对应的元组元素;而在新版本中,它被改为 tupleElement(expr(), 'name')。在大多数情况下,之前的版本本来就无法正常工作,但可以想象一种极为罕见的场景,在这种场景下这一变更可能会导致不兼容:如果你把元组元素的名称存储在某个列或别名中,而该列或别名的名称与元组元素本身的名称不同:SELECT 'b' AS a, CAST([tuple(123)] AS 'Array(Tuple(b UInt8))') AS t, t[1].a。你极不可能写出这样的查询,但我们仍然必须将此变更标记为潜在的向后不兼容变更。#68435 (Alexey Milovidov)。
  • 当启用 print_pretty_type_names 设置时,它会在 SHOW CREATE TABLE 语句、formatQuery 函数以及 clickhouse-clientclickhouse-local 的交互模式中,以更易读的形式打印 Tuple 数据类型。在之前的版本中,此设置仅应用于 DESCRIBE 查询和 toTypeName。本变更关闭了 #65753#68492 (Alexey Milovidov)。
  • 不再允许在 Replicated 数据库中创建表时显式指定 UUID。同样也不再允许为 Replicated 数据库中的 *MergeTree 表显式指定 Keeper 路径和副本名称。该变更引入了新的设置 database_replicated_allow_explicit_uuid,并将 database_replicated_allow_replicated_engine_arguments 的类型从 Bool 更改为 UInt64。#66104 (Alexander Tokmakov)。

新功能

  • 允许单个用户拥有多个身份验证方式,而不是只能有一种。支持将身份验证方式重置为最近添加的方式。如果你想在一段时间内部分实例运行在 24.8,部分实例运行在 24.9,建议在此期间将 max_authentication_methods_per_user 设置为 1,以避免潜在的不兼容问题。#65277Arthur Passos)。
  • 增加对 ATTACH PARTITION ALL FROM 的支持。#61987 (Kirill Nikiforov).
  • 添加 input_format_json_empty_as_default 设置,该设置启用后,会将 JSON 输入中的空字段视为默认值。关闭 #59339#66782Alexis Arnaud)。
  • 新增了函数 overlayoverlayUTF8,用于将字符串中的部分内容替换为另一个字符串。示例:SELECT overlay('Hello New York', 'Jersey', 11) 返回 Hello New Jersey#66933 (李扬).
  • 为分区级轻量级删除添加支持:DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr; #67805 (sunny).
  • 为不同单位(例如秒和分钟)的 Interval 数据类型值实现了比较功能,现在在比较时会将它们转换为最小公共上位类型。 #68057 (Yarik Briukhovetskyi).
  • 添加 create_if_not_exists 设置,使 CREATE 语句默认采用 IF NOT EXISTS 行为。#68164 (Peter Nguyen)。
  • 支持在 Azure 和本地读取 Iceberg 表。#68210 (Daniil Ivanik).
  • 现在支持通过标签删除查询缓存条目。例如,由 SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'abc' 创建的查询缓存条目,现在可以通过 SYSTEM DROP QUERY CACHE TAG 'abc' 删除。#68477Michał Tabaszewski)。
  • 为具名集合添加存储加密。#68615 (Pablo Marcos).
  • URL 表引擎添加虚拟列 _headers,关闭 #65026#68867flynn)。
  • 添加 system.projections 表,用于跟踪所有可用的 projection。#68901Jordi Villar)。
  • 新增函数 arrayZipUnaligned 以实现与 Spark 的兼容性(在 Spark 中命名为 arrays_zip),该函数基于原有的 arrayZip,支持未对齐的数组。#69030 (李扬)。
  • 为 Keeper 客户端命令行应用程序新增了 cp/mv 命令,用于以原子方式复制/移动节点。#69034 (Mikhail Artemenko)。
  • 为函数 arrayAUC 新增参数 scale(默认值:true),以便可以跳过归一化步骤(问题 #69609)。 #69717gabrielmcg44)。

实验特性

  • 新增设置 input_format_try_infer_variants,当某列/数组元素存在多个可能类型时,允许在文本格式的模式推断期间推断出 Variant 类型。 #63798 (Shaun Struwig).
  • 新增聚合函数 distinctDynamicTypes/distinctJSONPaths/distinctJSONPathsAndTypes,用于更好地分析 JSON 列中的类型内容。 #68463 (Kruglov Pavel).
  • 使用一致性哈希实现了一个新算法,用于确定并行副本之间 marks 分布的单位。针对不同的读取模式选择不同数量的 marks,以提升性能。 #68424 (Nikita Taranov).
  • 之前在处理并行副本公告时,part 去重逻辑的算法复杂度为 O(n^2),对于具有大量 part(或分区)的表可能会耗费较长时间。此改动将复杂度降为 O(n*log(n))。 #69596 (Alexander Gololobov).
  • 可刷新物化视图改进:追加模式(... REFRESH EVERY 1 MINUTE APPEND ...)用于向现有表追加行,而不是覆盖整个表;重试机制(默认禁用,可在查询的 SETTINGS 部分配置);SYSTEM WAIT VIEW <name> 查询,可等待当前正在运行的刷新完成;以及若干修复。 #58934 (Michael Kolupaev).
  • 新增 min_max 作为一种新的(实验性)统计类型。它支持对数值列上的范围谓词进行估算,例如 x < 100#67013 (JackyWoo).
  • 改进了从 Variant/Dynamic 列进行的 castOrDefault,使其在内部类型彼此完全不可转换时也能工作。 #67150 (Kruglov Pavel).
  • 现在可通过 MaterializedPostgreSQL 实现对列子集的复制。修复了 issue #33748#69092 (Kruglov Kirill).

性能改进

  • 实现了仅读取 Hive 分区所需的文件。#68963 (Yarik Briukhovetskyi).
  • LEFTINNER 哈希 JOIN 中,当表键在右表中是稠密时,通过按键重排右表来提升 JOIN 性能。#60341 (kevinyhzou).
  • 通过惰性追加行列表的方式,提升 ALL JOIN 的性能。#63677 (kevinyhzou).
  • 在启动过程中异步加载文件系统缓存元数据,以加快重启速度(由设置 load_metadata_asynchronously 控制)。#65736 (Daniel Pozo Escalona).
  • 对函数 arraymap 进行了优化,使其在处理某些常见场景时快得多。#67707 (李扬).
  • 对 ORC 字符串读取做了小幅优化,尤其是在列不包含 NULL 时。#67794 (李扬).
  • 通过减少合并调度步骤的开销,提升了合并操作的整体性能。#68016 (Anton Popov).
  • 当未设置 profile、未设置凭证且 IMDS 不可用时(例如在云外机器上查询公共 bucket 时),加速对 S3 的请求,从而关闭了 #52771#68082 (Alexey Milovidov).
  • RowInputFormatWithNamesAndTypes 中对 format reader 进行去虚函数化,以获得一定的性能提升。#68437 (李扬).
  • uniq 聚合函数在按分组键聚合时增加并行合并,以最大化 CPU 利用率。#68441 (Jiebin Sun).
  • 新增设置 output_format_orc_dictionary_key_size_threshold,允许用户在 ORC 输出格式中为字符串列启用字典编码。这有助于显著减小输出 ORC 文件大小并提升读取性能。#68591 (李扬).
  • 引入新的 Keeper 请求 RemoveRecursive,用于删除节点及其整个子树。#69332 (Mikhail Artemenko).
  • 通过并行向向量索引写入数据,加速向具有向量相似度索引的表插入数据。#69493 (flynn).
  • 通过自适应写缓冲区大小,降低向 JSON 格式插入数据时的内存使用。JSON 列在宽 part 中创建的许多文件只包含少量数据,为它们分配 1MB 缓冲区没有意义。#69272 (Kruglov Pavel).
  • 在并发哈希 JOIN 线程池中避免将线程归还到线程池中,以避免查询过度生成线程。#69406 (Duc Canh Le).

改进

  • CREATE TABLE AS 现在会复制 PRIMARY KEY、ORDER BY 等子句。目前仅适用于 MergeTree 系列表引擎。#69076 (sakulali)。
  • 强化了与小实体解析相关的代码库部分。发现并修复了以下(次要)错误:- 如果 DeltaLake 表按 Bool 类型分区,分区值总是被解释为 false;- ExternalDistributed 表在提供的地址中只使用了单个分片;以及 max_threads 设置及类似参数的值被打印为 'auto(N)' 而不是 auto(N)#52503Alexey Milovidov)。
  • 使用基于 cgroup 的指标来统计 CPU 使用情况,而不是使用系统范围的指标。#62003 (Nikita Taranov)。
  • 现在对远程 S3 磁盘的 I/O 调度改为在 HTTP 套接字流级别进行(而不是在整个 S3 请求级别),以解决 bandwidth_limit 限速问题。#65182 (Sergei Trifonov)。
  • 函数 upperUTF8lowerUTF8 以前只能对西里尔字母进行大写/小写转换。该限制现已移除,现在可以对任意语言的字符进行大写/小写转换。例如:SELECT upperUTF8('Süden') 现在返回 SÜDEN#65761 (李扬).
  • 当在带有投影的表上执行 lightweight delete 时,此前用户可以选择在将要执行 lightweight delete 时抛出异常(默认行为)或直接删除该投影;现在有了第三种选择:仍然执行 lightweight delete,然后重建投影。 #66169 (jsc0218)。
  • 新增了两个选项(dns_allow_resolve_names_to_ipv4dns_allow_resolve_names_to_ipv6),以便可以按 IP 协议族允许或阻止连接。#66895 (MikhailBurdukov)。
  • 在 clickhouse-client 中使是否忽略 Ctrl-Z(ignore_shell_suspend)可配置。 #67134 (Azat Khuzhin).
  • 改进 JSON 输出格式中的 UTF-8 校验,即便结果数据中包含某些字节序列,也能确保生成的 JSON 仍然有效。 #67938 (mwoenker).
  • 为合并和变更操作新增了 ProfileEvents 事件,以便进行更好的分析。 #68015 (Anton Popov).
  • ODBC:从服务器配置中获取 http_max_tries。#68128 (Rodolphe Dugé de Bernonville)。
  • 在 X.509 SubjectAltName 扩展中为用户身份添加通配符支持。#68236Marco Vilas Boas)。
  • 改进日期时间的 schema 推断。现在只有在日期时间包含小数部分时才使用 DateTime64,否则使用常规的 DateTime。Date/DateTime 的推断现在更加严格,尤其是在 date_time_input_format='best_effort' 时,以避免在某些边缘场景下从字符串中错误推断日期时间。#68382Kruglov Pavel)。
  • 删除了字典中命名集合的旧实现,并将其替换为新的实现,使得可以在字典中使用通过 DDL 创建的命名集合。关闭了 #60936#36890#68412Kseniia Sumarokova)。
  • 对外部 HTTP 认证器使用 HTTP/1.1,而不是默认设置的 HTTP/1.0。#68456Aleksei Filatov)。
  • 新增了一组用于线程池内部观测的指标,以便更深入地了解线程池的性能和行为。 #68674 (filimonov).
  • 使用 Values 格式的异步插入现在支持查询参数。#68741Anton Popov)。
  • dateTrunctoStartOfInterval 中支持 Date32#68874 (LiuNeng).
  • system.processors_profile_log 中新增 plan_step_nameplan_step_description 列。#68954Alexander Gololobov)。
  • 为嵌入式字典增加西班牙语支持。#69035Vasily Okunev)。
  • 在简短的错误信息中添加 CPU 架构。#69037Konstantin Bogdanov)。
  • 如果在重试过程中无法建立新的 Keeper 连接,查询将更快失败。 #69148 (Raúl Marín).
  • 更新 Database Factory,使用户自定义的数据库引擎可以具有参数、设置以及表级覆盖(类似于 StorageFactory)。#69201 (NikBarykin)。
  • 在用于将所有外部表引擎和函数替换为 Null 引擎(restore_replace_external_engines_to_nullrestore_replace_external_table_functions_to_null 设置)的恢复模式下,如果表包含 SETTINGS,则会失败。现在在这种情况下会从表定义中移除相应设置,从而可以恢复此类表。#69253 (Ilya Yatsishin).
  • CLICKHOUSE_PASSWORD 已在 clickhouse 镜像的 entrypoint 脚本中针对 XML 正确转义。#69301 (aohoyd)。
  • 允许 arrayZip/arrayZipUnaligned 接受空参数,就像 concathttps://github.com/ClickHouse/ClickHouse/pull/65887 中所做的那样。这是为了在 Gluten CH Backend 中与 Spark 保持兼容。#69576李扬)。
  • 支持 Keeper 内部通信的更高级 SSL 选项(例如使用密码短语保护的私钥)。#69582 (Antonio Andelic)。
  • 对于包含许多数据片段或分区的大表,索引分析可能会花费相当长的时间。此更改应当使得可以在该阶段终止开销较大的查询。 #69606 (Alexander Gololobov).
  • gcs 表函数中对敏感信息进行脱敏处理。#69611Vitaly Baranov)。
  • 在会减少行数的合并过程中重建投影。 #62364 (cangyin).

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

  • 修复在实验性且不受支持的 MaterializedPostgreSQL 引擎中,当 PostgreSQL 数据库名包含 "-" 时执行 ATTACH TABLE 失败的问题。#62730 (takakawa)。
  • 修复了在实验性且完全不受支持的 MaterializedPostgreSQL 引擎中,当 adnum 排序异常时与生成列相关的错误 #63161。修复了在实验性且完全不受支持的 MaterializedPostgreSQL 引擎中,当表中存在生成列时,id 列以 nextval 表达式作为默认值所导致的错误。修复了在删除名称包含除 [a-z1-9-] 以外其他符号的 publication 时出现的错误。#67664 (Kruglov Kirill)。
  • Storage Join 现在支持左表中的 Nullable 列,关闭 #61247#66926vdimir)。
  • 在使用并行副本(同时分发查询)且 IN 运算符中包含向 Decimal() 的转换时,查询结果可能不正确。该缺陷是在引入新的 analyzer 后出现的。#67234 (Igor Nikonov)。
  • 修复 ALTER MODIFY ORDER BY 导致元数据不一致的问题。 #67436 (iceFireser).
  • 修复函数 fromModifiedJulianDay 的上限。本应为 9999-12-31,却被错误地设置为 9999-01-01#67583PHO)。
  • 修复在执行 IN 查询时索引不在元组起始位置的问题。#67626 (Yarik Briukhovetskyi)。
  • 修复 RoleCache 中的过期处理。 #67748 (Vitaly Baranov).
  • 修复由于向视图刷新延迟而导致窗口视图数据块缺失的问题。 #67983 (Raúl Marín).
  • 修复由于日期格式不正确导致的 MSan 问题。#68105 (JackyWoo).
  • 修复了在 Parquet 过滤时,当文件中的数据类型与查询中请求的数据类型存在较大差异时导致的崩溃问题(例如 ... FROM file('a.parquet', Parquet, 'x String'),但文件中实际为 x Int64)。在没有此修复的情况下,可通过将 input_format_parquet_filter_push_down 设为 0 来规避该问题。 #68131 (Michael Kolupaev)。
  • 修复在 #67091 中引入的 lag/lead 函数崩溃问题。#68262 (lgbo).
  • 尝试修复在查询被取消时 Postgres 崩溃的问题。#68288 (Kseniia Sumarokova)。
  • https://github.com/ClickHouse/ClickHouse/pull/61984 之后,schema_inference_make_columns_nullable=0 在 Parquet/Arrow 格式中仍然可能将列推断为 Nullable。该变更不向后兼容,用户注意到了行为上的变化。此 PR 使 schema_inference_make_columns_nullable=0 恢复为之前的行为(不会推断出任何 Nullable 列),并为该设置引入了新的值 auto,仅当数据中包含可空性信息时才会将列推断为 Nullable#68298Kruglov Pavel)。
  • 修复了 #50868。在分布式查询中,嵌套子查询返回的较小 DateTime64 常量值被错误地转换为 Null,从而导致报错以及可能产生错误的查询结果。#68323Shankar)。
  • 修复查询 SYSTEM SYNC REPLICA 中缺少的同步副本模式。#68326 (Duc Canh Le).
  • 修复键条件中的问题。 #68354 (Han Fei).
  • 修复在删除或重命名被 LDAP 外部用户目录使用的角色时出现的崩溃问题。#68355 (Andrey Zvonov).
  • 修复 system.view_refreshes 中 Progress 列值大于 1 的问题 #68377#68378megao)。
  • 正确处理正则表达式标志位。 #68389 (Han Fei).
  • PostgreSQL 风格的转换运算符(::)即使在 SQL 风格的十六进制和二进制字符串字面量上也能正确工作(例如,SELECT x'414243'::String)。此更改修复了 #68324#68482Alexey Milovidov)。
  • 针对 https://github.com/ClickHouse/ClickHouse/pull/68131 的一个小补丁。#68494Chang chen)。
  • 修复 #68239 中的 SAMPLE n,其中 n 为整数。#68499Denis Hananein)。
  • 修复在两组分布的样本量不相等时 mann-whitney-utest 中的缺陷。 #68556 (Han Fei).
  • 在非预期重启后,由于对被损坏 part 所覆盖的 part 处理异常,导致无法启动 ReplicatedMergeTree 的复制流程。#68584 (baolin)。
  • 修复在将函数 sipHash64KeyedsipHash128KeyedsipHash128ReferenceKeyed 应用于空数组或空元组时会触发 LOGICAL_ERROR 的问题。#68630 (Robert Schulze)。
  • 在为多列建立索引时,由于在不同列之间没有重置 row_id,全文索引可能会错误地过滤掉属于其他列的行。复现步骤见 tests/queries/0_stateless/03228_full_text_with_multi_col.sql。若无此修复,则会出现该问题。#68644 (siyuan).
  • 修复在创建 Replicated 表时,replica_name 中包含无效字符 '\t' 和 '\n' 的问题,该问题会导致在 LogEntry 中对 'source replica' 的解析不正确。参见 issue #68640#68645Zhigao Hong)。
  • 已重新在分布式表中提供虚拟列 _table_database。这些虚拟列在 24.3 版本之前一直可用。#68672Anton Popov)。
  • 修复在 Variant 列重排期间可能出现的 Size of permutation (0) is less than required (...) 错误。#68681 (Kruglov Pavel).
  • 修复因新增 JSON 列导致的潜在错误 DB::Exception: Block structure mismatch in joined block stream: different columns:#68686Kruglov Pavel)。
  • 修复在函数 sipHash(64/128)Keyed 中,对键为数组的 map 进行哈希时,与物化常量键相关的问题。 #68731 (Salvatore Mesoraca).
  • ColumnsDescription::toString 使用同一 IAST::FormatState 对象来格式化每一列,从而使写入磁盘和 ZooKeeper 的列元数据保持统一。#68733Miсhael Stetsyuk)。
  • 修复在使用 grouping sets 时合并聚合数据的方式。 #68744 (Nikolai Kochetov).
  • 修复在创建 replicated merge tree、修改列并执行 modify statistics 时出现的逻辑错误。 #68820 (Han Fei).
  • 修复在分析器中从子查询解析动态子列的问题。 #68824 (Kruglov Pavel).
  • 修复 DeltaLake 中复杂类型元数据的解析。关闭 #68739#68836Kseniia Sumarokova)。
  • 修复了异步插入在以下情况下的问题:在插入之后但在刷新到表之前,通过 ALTER ADD/MODIFY COLUMN 查询更改了表的元数据。 #68837 (Anton Popov).
  • 修复在数组中传递空元组时触发的意外异常。这修复了 #68618#68848Amos Bird)。
  • 修复对纯元数据 MUTATIONS 命令的解析问题。 #68935 (János Benjamin Antal).
  • 修复在合并 anyHeavy 状态时可能产生的错误结果。 #68950 (Raúl Marín).
  • 修复了在启用 optimize_functions_to_subcolumns 设置时向物化视图写入数据的问题。 #68951 (Anton Popov).
  • 不要在 const Dynamic 列方法中使用序列化缓存。这可能会导致使用未初始化的值,甚至在聚合时引发竞态条件。#68953 (Kruglov Pavel).
  • 修复了在解析 JSON 类型时,在某些情况下本应插入默认值 null 却导致的解析错误。 #68955 (Kruglov Pavel)。
  • 修复在某些压缩响应中未发送 Content-Encoding 的问题。 #64802. #68975 (Konstantin Bogdanov).
  • 在某些情况下,路径被错误拼接,导致其中包含 // 片段,现已通过对路径进行规范化来解决该问题。 #69066 (Yarik Briukhovetskyi).
  • 修复当异步插入为空时的逻辑错误。#69080 (Han Fei).
  • 修复了在取消查询期间,clickhouse-client 中进度指示器的数据竞争问题。#69081 (Sergei Trifonov)。
  • 修复了一个 Bug:在使用余弦距离作为距离函数时,未能利用向量相似度索引(目前为实验性功能)。 #69090 (flynn)。
  • 此更新修复了这样一个问题:在初始创建过程中服务器发生故障后,再次尝试创建 Replicated 数据库时可能会报错。#69102Miсhael Stetsyuk)。
  • input_format_csv_try_infer_numbers_from_strings = 1 时,不再在 CSV 中从 String 推断 Bool 类型,因为我们不允许从字符串读取 bool 值。#69109Kruglov Pavel)。
  • 修复在启用 --multiquery 时客户端对 EXPLAIN AST INSERT 查询的解析错误。#69123 (wxybear).
  • 在使用并行副本的查询中,子查询中的 UNION 子句处理不正确,导致出现 LOGICAL_ERROR Duplicate announcement received for replica#69146 (Igor Nikonov)。
  • 修复在 s3Cluster 中传递 structure 参数的问题。此前,在将查询发送到 s3Cluster 中的副本时,列的 DEFAULT 默认表达式可能会被丢弃。#69147 (Kruglov Pavel)。
  • 在将表达式转换为目标类型时,遵循 Values 格式中的格式设置。#69149 (Kruglov Pavel).
  • 修复 clickhouse-client --queries-file 对于只读用户的行为(此前会因 Cannot modify 'log_comment' setting in readonly mode 而失败)。 #69175 (Azat Khuzhin).
  • 修复在通过管道将 clickhouse-client 传递给提前退出的进程时出现的数据竞争问题。 #69186 (vdimir).
  • 修复 JSON/Dynamic 类型中 uniqGROUP BY 结果不正确的问题。#69203 (Kruglov Pavel)。
  • 修复异步插入时的 INFILE 格式检测。如果在 FORMAT 子句中未显式定义格式,则可以根据 INFILE 的文件扩展名自动检测格式。#69237 (Julia Kartseva).
  • 此问题之后,生产环境中出现了相当多的表副本,它们的 metadata_version 节点值为 0,但与对应表的 metadata 节点版本不一致。这会导致在这些副本上执行的 alter 查询失败。#69274Miсhael Stetsyuk)。
  • 将 Dynamic 类型标记为不安全的主键类型,以避免在使用 Fields 时出现问题。 #69311 (Kruglov Pavel).
  • 改进访问实体相关依赖的恢复。 #69346 (Vitaly Baranov).
  • 修复在为插入操作获取连接时,当所有连接尝试都失败时出现的未定义行为。#69390Pablo Marcos)。
  • 关闭 #69135。如果我们尝试在 CROSS JOIN 中复用已 join 的数据,但这种情况目前在 ClickHouse 中不会发生。最好在 reuseJoinedData 中保留 have_compressed#69404lgbo)。
  • 当参数为稀疏列时,使 materialize() 函数返回完整的列。#69429 (Alexander Gololobov).
  • 修复了函数 sqidDecode 中的 LOGICAL_ERROR#69450)。#69451Robert Schulze)。
  • 针对 24.6 中 s3queue 问题的快速修复,或在 Replicated 数据库中创建查询。#69454 (Kseniia Sumarokova).
  • 修复了在 INSERT INTO ... SELECTCREATE TABLE AS SELECT 查询中进行合并操作时,内存占用过高的问题。#69469 (Yarik Briukhovetskyi)。
  • 在表名中包含点号的情况下,SHOW COLUMNSSHOW INDEX 语句现在可以正常工作。#69514 (Salvatore Mesoraca)。
  • 现在不允许对 overflow 模式不等于 'throw' 的查询使用查询缓存。这可以防止可能被截断且不正确的查询结果被存入查询缓存中(问题 #67476)。#69549Robert Schulze)。
  • 在移动到 prewhere 时保持条件的原始顺序。此前顺序可能会被打乱,在顺序很重要的情况下可能导致查询失败。#69560 (Kruglov Pavel).
  • 在出现 ZNOAUTH 错误后,修复 Keeper 中多请求的预处理逻辑。#69627 (Antonio Andelic)。
  • 修复在创建新副本时,DatabaseReplicated 中由于带有 WHERE 子句的 TTL 可能导致的 METADATA_MISMATCH#69736Nikolay Degterinsky)。
  • 修复 StorageS3(Azure)Queue 设置中的 tracked_file_ttl_sec。我们以键 tracked_file_ttl_sec 写入到 Keeper,但读取时却使用了 tracked_files_ttl_sec,这是一个拼写错误。#69742Kseniia Sumarokova)。
  • 在 gethyperrectangleforrowgroup 中使用 tryconvertfieldtotype。#69745Miсhael Stetsyuk)。
  • 回滚 “Fix prewhere without columns and without adaptive index granularity (almost w/o anything)” 更改。由于回滚了这些更改,在读取由旧版本的 ClickHouse(推测为 2021 年或更早的版本)生成的数据部分时,可能会出现一些错误。#68897Alexander Gololobov)。

ClickHouse 24.8 LTS 版本,2024-08-20

向后不兼容的变更

  • clickhouse-clientclickhouse-local 现在默认使用多查询模式(而不是单查询模式)。例如,clickhouse-client -q "SELECT 1; SELECT 2" 现在可以正常工作,而之前用户必须添加 --multiquery(或 -n)。--multiquery/-n 开关已变得多余。多查询语句中的 INSERT 查询会根据其 FORMAT 子句进行特殊处理:如果 FORMAT 为 VALUES(最常见的情况),则 INSERT 语句的结束由查询末尾的分号 ; 表示。对于所有其他 FORMAT(例如 CSVJSONEachRow),INSERT 语句的结束由查询末尾的两个换行符 \n\n 表示。 #63898FFish)。
  • 在先前版本中,可以通过在数据类型名称后附加 WithDictionary 来使用 LowCardinality 数据类型的另一种语法。这是一个最初的工作实现,从未被文档化或公开使用。现在已被弃用。如果你使用了这种语法,必须对表执行 ALTER,并将数据类型重命名为 LowCardinality#66842Alexey Milovidov)。
  • 修复在将存储 Buffer 与分布式目标表一起使用时的逻辑错误。这是一个向后不兼容的变更:如果在查询中同一个表出现多次(例如自连接),使用 Buffer 与分布式目标表的查询可能会停止工作。 #67015vdimir)。
  • 在先前版本中,针对基于 Gamma 函数的随机分布函数(例如卡方分布、Student t 分布、Fisher 分布),当传入接近零的负参数时,会导致长时间计算或无限循环。在新版本中,使用零或负参数调用这些函数将抛出异常。此变更修复了 #67297#67326Alexey Milovidov)。
  • 系统表 text_log 现在默认启用。此变更与先前版本完全兼容,但你可能会注意到本地磁盘的使用量略有增加(该系统表仅占用极少量磁盘空间)。 #67428Alexey Milovidov)。
  • 在先前版本中,当被要求生成非常大的数组时,arrayWithConstant 可能会很慢。在新版本中,它被限制为每个数组最多 1 GB。此变更修复了 #32754#67741Alexey Milovidov)。
  • 修复 REPLACE 修饰符的格式(禁止省略括号)。 #67774Azat Khuzhin)。
  • #68349 中回溯引入:重新实现 Dynamic 类型。现在,当动态数据类型的数量达到上限时,新类型不会再被转换为 String,而是以二进制编码数据类型的形式存储在一个特殊的数据结构中。现在,曾经插入到 Dynamic 列中的任何类型都可以作为子列从中读取。 #68132Kruglov Pavel)。

新功能

  • 新增了一个 MergeTree 设置项 deduplicate_merge_projection_mode,用于在合并期间(针对特定引擎)以及执行 OPTIMIZE DEDUPLICATE 查询时控制 projection 的处理方式。支持的选项包括:throw(当 projection 对 *MergeTree 引擎系列不完全受支持时抛出异常)、drop(如果 projection 本身无法以一致的方式合并,则在合并过程中移除该 projection)以及 rebuild(从头重建 projection,此操作开销较大)。#66672 (jsc0218).
  • 为 S3 表引擎添加 _etag 虚拟列。修复 #65312#65386skyoct)。
  • 为查询缓存添加了标记(命名空间)机制。具有不同标记的相同查询在查询缓存中会被视为不同。例如:SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'abc'SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'def' 现在会在查询缓存中创建不同的查询缓存条目。#68235 (sakulali).
  • 在包含左右两侧表列的不等式条件(例如 t1.y < t2.y)下,支持更多 JOIN 严格性变体(LEFT/RIGHT SEMI/ANTI/ANY JOIN)(参见设置 allow_experimental_join_condition)。 #64281 (lgbo).
  • 为不同引擎(FileURLS3AzureBlobStorageHDFS)解析 Hive 风格分区。Hive 风格分区将数据组织到分区子目录中,从而更高效地查询和管理大规模数据集。目前,它只会创建具有相应名称和数据的虚拟列。后续的 PR 将引入相应的数据过滤(以提升性能)。#65997Yarik Briukhovetskyi)。
  • 新增函数 printf 以兼容 Spark(也可以继续使用现有的 format 函数)。#66257李扬)。
  • 添加选项 restore_replace_external_engines_to_nullrestore_replace_external_table_functions_to_null,用于将 external engines 和 table_engines 替换为 Null 引擎,这在测试中会很有用。该功能应适用于 RESTORE 和显式建表。 #66536 (Ilya Yatsishin).
  • 新增对使用函数 readWKTLineString 读取 WKT 格式 MULTILINESTRING 几何类型的支持。 #67647 (Jacob Reckhard).
  • 新增一个名为 fuzzQuery 的表函数。此函数允许对给定的查询字符串进行随机变换。示例:SELECT query FROM fuzzQuery('SELECT 1') LIMIT 5;#67655pufit)。
  • 新增查询语句 ALTER TABLE ... DROP DETACHED PARTITION ALL,用于删除所有已分离的分区。#67885 (Duc Canh Le)。
  • 在启用新的设置项 rows_before_aggregation 时,将统计信息 rows_before_aggregation_at_least 添加到查询响应中。该统计量表示聚合前读取的行数。在分布式查询场景下,当在没有 limit 的情况下使用 group bymax 聚合函数时,rows_before_aggregation_at_least 可以反映被查询命中的行数。#66084 (morning-color)。
  • 支持对 Join 表执行 OPTIMIZE 查询,以减少其内存占用。#67883 (Duc Canh Le)。
  • 如果在 URL 中添加 &run=1,即可在 Play 中立即执行查询 #66457 (Aleksandr Musorin)。

实验特性

  • 实现新的 JSON 数据类型。#66444 (Kruglov Pavel).
  • 新增 TimeSeries 表引擎。#64183 (Vitaly Baranov).
  • 新增实验性的 Kafka 存储引擎,用于将 offset 存储在 Keeper 中,而不是依赖将其提交到 Kafka。这样可以使从队列消费与向 ClickHouse 表提交数据之间实现原子性。#57625 (János Benjamin Antal).
  • 对并行副本使用自适应读任务大小计算方法(自适应指其取决于读取列的大小)。#60377 (Nikita Taranov).
  • 新增统计类型 count_min(count-min sketches),为诸如 col = 'val' 之类的等值谓词提供选择性估计。支持的数据类型包括字符串、日期、日期时间以及数值类型。#65521 (JackyWoo).

性能改进

  • 将设置 optimize_functions_to_subcolumns 默认启用。#68053 (Anton Popov).
  • plain_rewritable 磁盘目录元数据存储在 __meta 布局中,与对象存储中的 MergeTree 数据分离。将 plain_rewritable 磁盘移至扁平目录结构。#65751 (Julia Kartseva).
  • 通过为所有子列预先保留所需内存,改进对 String/Array/Map/Variant/Dynamic 类型的列合并(发生在 INSERT 查询中的操作)。#67043 (Kruglov Pavel).
  • 加速 SYSTEM FLUSH LOGS,并在关闭时刷新日志。#67472 (Sema Checherinda).
  • 通过减少合并调度阶段的开销,提升合并操作的整体性能。#68016 (Anton Popov).
  • 加快 DROP DATABASE 查询中删除表的速度,将 database_catalog_drop_table_concurrency 的默认值增加到 16。#67228 (Nikita Mikhaylov).
  • 在写入 ORC 时避免为数组列分配过大的容量,使 Array 列的性能提升 15%。#67879 (李扬).
  • 显著加速非复制的 MergeTree 表上的变更操作(mutations)。#66911 #66909 (Alexey Milovidov).

改进

  • 设置项 allow_experimental_analyzer 已重命名为 enable_analyzer。旧名称作为别名保留。这表明 Analyzer 不再处于 beta 阶段,已完全推广到生产环境。#66438 (Nikita Mikhaylov)。
  • 改进了日期时间的模式推断。现在仅在日期时间带有小数部分时才使用 DateTime64,否则使用常规的 DateTime。对 Date/DateTime 的推断现在更加严格,尤其是在 date_time_input_format='best_effort' 时,以避免在某些极端情况下从字符串推断出日期时间。 #68382 (Kruglov Pavel).
  • ClickHouse 服务器现在支持新的设置 max_keep_alive_requests。对于到服务器的 HTTP keep-alive 连接,它与 keep_alive_timeout 配合工作——如果空闲超时时间尚未过期,但通过该连接已处理的请求数已超过 max_keep_alive_requests,则该连接将被服务器关闭。#61793Nikita Taranov)。
  • 高级仪表板中进行了多项改进。从而关闭了 #67697。从而关闭了 #63407。从而关闭了 #51129。从而关闭了 #61204#67701Alexey Milovidov)。
  • 在创建 Distributed 表时,无需为 REMOTE 单独授权:对 Distributed 引擎授予权限即可。 #65419 (jsc0218)。
  • 不要在 Docker 镜像中显式传入 keeper 的日志配置,以便可以在外部覆盖。#65564Azat Khuzhin)。
  • BACKUPRESTORE 查询引入了 use_same_password_for_base_backup 设置,从而可以在受密码保护的归档中创建和从中恢复增量备份。 #66214 (Samuele)。
  • ATTACH 查询忽略 async_load_databases(此前可能会导致 ATTACH 在表真正被附加之前就返回)。#66240 (Azat Khuzhin)。
  • 为因资源不足而被拒绝的连接添加了日志和指标。 #66410 (Alexander Tokmakov).
  • 为 MongoDB 引擎提供对 UUID 类型的正确支持。 #66671 (Azat Khuzhin).
  • 添加复制延迟和恢复时间指标。#66703 (Miсhael Stetsyuk)。
  • 添加 DiskS3NoSuchKeyErrors 指标。#66704 (Miсhael Stetsyuk)。
  • 确保 COMMENT 子句在所有表引擎上正常工作。#66832 (Joe Lynch)。
  • 函数 mapFromArrays 现在可以接受 Map(K, V) 作为第一个参数,例如:SELECT mapFromArrays(map('a', 4, 'b', 4), ['aa', 'bb']) 现在可以正常工作并返回 {('a',4):'aa',('b',4):'bb'}。此外,如果第一个参数是 Array,它现在也可以是 Array(Nullable(T))Array(LowCardinality(Nullable(T))) 类型,只要数组中的实际值不为 NULL 即可。#67103李扬)。
  • ~/.clickhouse-local 读取 clickhouse-local 的配置。 #67135 (Azat Khuzhin).
  • 将配置项 input_format_orc_read_use_writer_time_zone 重命名为 input_format_orc_reader_timezone,并允许用户设置读取端的时区。#67175kevinyhzou)。
  • 当 HTTP 连接在建立后立即被对端重置时,将 Socket is not connected 错误的级别降低,修复 #34218#67177vdimir)。
  • 新增从配置加载 system.dashboards 仪表板的功能(设置后将覆盖默认的仪表板预设)。 #67232 (Azat Khuzhin).
  • SQL 中的窗口函数传统上采用 snake case 命名。ClickHouse 使用 camelCase,因此新增了别名 denseRank()percentRank()。这些新函数的调用方式与原始的 dense_rank()percent_rank() 函数完全相同。snake case 和 camelCase 两种语法都仍然可用。还为每个函数新增了一个测试。本次变更关闭了 #67042#67334 (Peter Nguyen)。
  • 如果配置文件格式不是 .xml.yml.yaml,则自动检测其格式。如果文件以 < 开头,则可能为 XML,否则可能为 YAML。这在通过管道提供配置文件时非常有用:clickhouse-server --config-file <(echo "hello: world")#67391 (sakulali)。
  • 函数 formatDateTimeformatDateTimeInJodaSyntax 现在将其格式参数视为可选参数。若未指定,则分别假定使用格式字符串 %Y-%m-%d %H:%i:%syyyy-MM-dd HH:mm:ss。示例:SELECT parseDateTime('2021-01-04 23:12:34') 现在会返回 DateTime 值 2021-01-04 23:12:34(此前会抛出异常)。#67399Robert Schulze)。
  • 如果 KeeperMap 中的 Keeper 请求因超时或连接丢失而失败,则自动重试这些请求。 #67448 (Antonio Andelic).
  • 在 AArch64 Linux 构建中添加 -no-pie,以便在 ClickHouse 重启后能够正确对堆栈跟踪进行分析和符号解析。#67916 (filimonov)。
  • 为合并和变更添加了 ProfileEvents 事件,以便更好地进行内部分析。 #68015 (Anton Popov).
  • 删除非复制 MergeTree 的不必要日志。#68238 (Daniil Ivanik)。

构建/测试/打包改进

  • 集成测试中的“flaky 检查”现在会对每个测试用例进行多次运行,以在测试中发现更多问题并提升其可靠性。它使用 pytest-repeat 库在同一环境下多次运行测试用例。为了通过测试,务必要在测试用例结束时清理表和其他实体。与多次单独运行 pytest 相比,这种重复运行方式要快得多,因为它只需启动一次所需的容器。#66986 (Ilya Yatsishin).
  • 解除在 ClickHouse 中使用 CLion 的限制,使其可以正常使用。在之前的版本中,CLion 每次按键都会冻结约一分钟。该更改关闭了 #66994#66995 (Alexey Milovidov).
  • getauxval:在使用 sanitizer 重新执行进程时,避免因较新版 Linux 内核中更高的 ASLR 随机性而导致崩溃。#67081 (Raúl Marín).
  • 将部分客户端代码抽取到一个单独文件中,并且即使在调试构建中也对其应用尽可能高的优化级别。此更改关闭了:#65745#67215 (Nikita Mikhaylov).

错误修复

  • 仅与实验性的 Variant 数据类型相关。修复在 Variant + AggregateFunction 类型组合下出现的崩溃问题。#67122Kruglov Pavel)。
  • 修复 DistributedAsyncInsert 在连接为空时发生崩溃的问题。 #67219 (Pablo Marcos).
  • 修复在以 tuple() 作为参数时 uniquniqTheta 崩溃的问题。已关闭 #67303#67306flynn)。
  • 修复 #66026。在 ReplaceTableNodeToDummyVisitor 中避免遍历尚未解析的表函数参数。#67522Dmitry Novik)。
  • 修复了 JSONMergePatch 函数中潜在的栈溢出问题。将该函数从 jsonMergePatch 重命名为 JSONMergePatch,因为之前的命名不正确。之前的名称仍然保留以保持兼容性。改进了该函数的错误诊断。此更改关闭了 #67304#67756Alexey Milovidov)。
  • 修复了由特制查询触发的 NULL 指针解引用错误,该错误会导致服务器在 hopEndhopStarttumbleEndtumbleStart 处崩溃。#68098Salvatore Mesoraca)。
  • 在使用子查询进行过滤时,修复了某些系统表中出现的 Not-ready Set 问题。#66018 (Michael Kolupaev)。
  • 修复了在执行 ALTER ADD COLUMN 查询后读取子列时出现的不正确行为。#66243 (Anton Popov)。
  • 修复发送到外部数据库(如 PostgreSQL 等引擎)时查询中的布尔字面量。#66282 (vdimir)。
  • 修复带别名的 JOIN ON 表达式的查询格式问题,例如 ... JOIN t2 ON (x = y) AS e ORDER BY x 应格式化为 ... JOIN t2 ON ((x = y) AS e) ORDER BY x#66312 (vdimir).
  • 修复 cluster() 在跨服务器密钥场景下的行为(与之前一样保留初始用户)。#66364 (Azat Khuzhin).
  • 修复在将包含 NULL 的 Array 字段转换为 Array(Variant) 时可能出现的运行时错误。#66727 (Kruglov Pavel)。
  • 修复 Context::getDDLWorker 中偶发的死锁。#66843 (Alexander Gololobov)。
  • 修复在未完成的 DROP 操作后创建 KeeperMap 表的问题。 #66865 (Antonio Andelic).
  • 修复在恢复到 s3_plain_rewritable 磁盘时出现的 broken part 错误。 #66881 (Vitaly Baranov).
  • 在极少数情况下,由于磁盘上存在一些异常的投影(projection),ClickHouse 可能会将某些数据分片视为损坏。现在这一问题已修复。#66898 (alesapin)。
  • 修复了模式推断中无效格式检测的问题,该问题可能导致出现逻辑错误:'Format doesn't support schema inference.' #66899 (Kruglov Pavel).
  • 修复在并行副本场景下取消查询时可能出现的死锁问题。 #66905 (Nikita Taranov).
  • 即使设置了 database_replicated_allow_heavy_create,也禁止使用 CREATE AS SELECT。该操作在 23.12 中是无条件禁止的,但在未发布的 24.7 中,在启用该设置时被意外允许。#66980 (vdimir)。
  • 在设置 max_rows_to_read 限制时,从 numbers 表读取数据可能会错误地抛出异常。此更改修复了 #66992#66996Alexey Milovidov)。
  • 为 lagInFrame 和 leadInFrame 窗口函数添加适当的类型转换——修复 msan 测试。#67091 (Yakov Olkhovskiy)。
  • 修复了 TRUNCATE DATABASE 会像 DROP DATABASE 查询那样停止复制的问题。#67129 (Alexander Tokmakov)。
  • clickhouse-local 中使用独立的客户端上下文。#67133Vitaly Baranov)。
  • 修复在通过只有一个分片的 Distriburted 表读取 Merge 表的查询中出现的错误 Cannot convert column because it is non constant in source stream but must be constant in result.#67146 (Nikolai Kochetov)。
  • 修复了在禁用 enable_order_by_all 且使用并行副本(以及分布式查询)时 ORDER BY all 的行为。#67153 (Igor Nikonov)。
  • 修复在 schema 缓存中对 input_format_max_bytes_to_read_for_schema_inference 的错误使用。#67157 (Kruglov Pavel)。
  • 修复在使用单个可空键进行 GROUP BY 时发生异常时,count distinct 导致的内存泄漏问题。#67171 (Jet He).
  • 修复了一个优化错误,该错误会将 OUTER JOIN 转换为 INNER JOIN。此更改关闭了 #67156。此更改关闭了 #66447。该缺陷是在 https://github.com/ClickHouse/ClickHouse/pull/62907 中引入的。#67178Maksim Kita)。
  • 修复了错误 Conversion from AggregateFunction(name, Type) to AggregateFunction(name, Nullable(Type)) is not supported。该缺陷是由 optimize_rewrite_aggregate_function_with_if 优化引起的。修复了 #67112#67229Nikolai Kochetov)。
  • 修复在使用空元组作为函数 IN 的左侧操作数时导致查询挂起的问题。#67295Duc Canh Le)。
  • 在跳过未知字段时,可以构造出嵌套层级非常深的 JSON 数据,导致栈溢出。此更改关闭了 #67292#67324Alexey Milovidov)。
  • 修复在启动期间发生异常后附加 ReplicatedMergeTree 表时的问题。 #67360 (Antonio Andelic).
  • 修复由于在 Aggregator 中错误地从线程组分离而导致的段错误(segfault)。#67385 (Antonio Andelic)。
  • 修复了在主键(PK)中使用非确定性函数的另一个问题。#67395Nikolai Kochetov)。
  • 修复了 bloom_filter 索引在包含稍显古怪条件(例如 (k=2)=(k=2)has([1,2,3], k))的查询中导致查询失败的问题。#67423 (Michael Kolupaev).
  • 如果文件名/URI 含有 :: 但不是归档文件,则能够被正确解析。 #67433 (Antonio Andelic).
  • 修复 ~WriteBufferFromS3 中在 WriteBuffer 被取消时的任务等待逻辑。#67459Kseniia Sumarokova)。
  • 在 RESTORE 过程中,保护临时 part 目录不被删除。#67491 (Vitaly Baranov)。
  • 修复嵌套短路求值函数的执行。#67520 (Kruglov Pavel).
  • 修复 Logical error: Expected the argument №N of type T to have X rows, but it has 0。该错误可能会在使用新分析器、且在 GROUP BY 中包含常量表达式的远程查询中发生。#67536Nikolai Kochetov)。
  • 修复包含 NULL 的元组上的 JOIN:在使用新分析器时,如果 JOIN ON 部分的元组中包含 NULL,一些查询会返回不正确的结果。#67538vdimir)。
  • 在不可驱逐缓存已满时,修复对 FileCache::freeSpaceRatioKeepingThreadFunc() 的冗余重新调度。 #67540 (Kseniia Sumarokova).
  • 修复通过 HTTP 接口向类流式引擎(Kafka、RabbitMQ、NATS)执行 INSERT 时的问题。 #67554 (János Benjamin Antal).
  • 修复了函数 toStartOfWeek 在较小的 DateTime64 值情况下返回错误结果的问题。#67558 (Yarik Briukhovetskyi)。
  • 修复使用递归 CTE 创建视图时的问题。#67587Yakov Olkhovskiy)。
  • 修复文件系统缓存中的 Logical error: 'file_offset_of_buffer_end <= read_until_position' 逻辑错误。关闭 #57508#67623Kseniia Sumarokova)。
  • 修复了 #62282。移除了对 convertFieldToString() 的调用,并添加了针对特定数据类型的序列化代码。当参数值是返回该数据类型实例的函数或表达式时,参数化视图替换在多种数据类型下会失效。 #67654 (Shankar)。
  • 修复了 percent_rank 的崩溃问题。将 percent_rank 的默认 frame 类型修改为 range unbounded preceding and unbounded following。现在会考虑 IWindowFunction 的默认 window frame,SQL 中未定义 window frame 的窗口函数也可以被正确地归入不同的 WindowTransfomer#67661 (lgbo).
  • 修复在使用 UNION 时重新加载 SQL UDF 的问题。之前,重启服务器可能会导致 UDF 失效。#67665Antonio Andelic)。
  • 修复在包含 Tuples 和 Maps 的 if 函数中,使用实验性 Variant 类型并启用设置 use_variant_as_common_type 时可能出现的逻辑错误 "Unexpected return type from if"。#67687 (Kruglov Pavel)。
  • 由于 Linux 内核中的一个 bug,可能会导致查询在 TimerDescriptor::drain 中挂起。此更改关闭了 #37686#67702Alexey Milovidov)。
  • 修复 RESTORE ON CLUSTER 命令的完成逻辑。 #67720 (Vitaly Baranov).
  • 修复在加载过程中遇到 CANNOT_SCHEDULE_TASK 导致字典卡死的问题。 #67751 (Azat Khuzhin).
  • SELECT count() FROM t WHERE cast(c = 1 or c = 9999 AS Bool) SETTINGS use_skip_indexes=1 这样的查询在列 c 上使用 Bloom 过滤器索引时现在可以正常工作。#67781jsc0218)。
  • 修复在某些聚合无键且带有过滤条件的查询中出现的错误聚合结果,关闭 #67419#67804 (vdimir).
  • 在 ALTER ADD/MODIFY COLUMN 中对实验性/可疑数据类型进行校验。 #67911 (Kruglov Pavel).
  • 修复了在分布式查询中常量折叠后 DateTime64 的解析问题,关闭 #66773#67920vdimir)。
  • 当谓词中包含非确定性函数时,修复 count() 结果错误的问题。#67922 (János Benjamin Antal).
  • 修复了在可用 CPU 数量受限的容器化环境中,最大线程软限制的计算。 #67963 (Robert Schulze).
  • 现在,如果磁盘上不存在投影但在 checksums.txt 中存在,ClickHouse 不再将该数据块视为损坏。#68003 (alesapin)。
  • 修复了在使用新 analyzer 执行 mutation 时,未修改 part 未被正确跳过的问题。之前在启用 analyzer 的情况下,即使根据谓词判断某个 part 不会受到 mutation 影响,该 part 中的数据仍可能会被 mutation 重写。 #68052 (Anton Popov).
  • 移除了在使用 OFFSET 的子查询中删除排序的错误优化。修复了 #67906#68099Graham Campbell)。
  • 尝试修复在聚合投影优化中出现的 Block structure mismatch in AggregatingStep stream: different types 问题。#68107Nikolai Kochetov)。
  • 尝试修复在取消查询时发生的 Postgres 崩溃。#68288 (Kseniia Sumarokova)。
  • 修复查询 SYSTEM SYNC REPLICA 中同步副本模式缺失的问题。 #68326 (Duc Canh Le).

ClickHouse 发布 24.7,2024-07-30

向后不兼容的变更

  • 禁止在 Replicated 数据库中使用 CRATE MATERIALIZED VIEW ... ENGINE Replicated*MergeTree POPULATE AS SELECT ...#63963 (vdimir).
  • clickhouse-keeper-client 现在只接受字符串字面量形式的路径,例如 ls '/hello/world',不再接受裸字符串,例如 ls /hello/world#65494 (Alexey Milovidov).
  • 指标 KeeperOutstandingRequets 重命名为 KeeperOutstandingRequests#66206 (Robert Schulze).
  • system.functions 表中移除字段 is_deterministic#66630 (Alexey Milovidov).
  • 函数 tuple 现在会尝试在查询中构造命名元组(由 enable_named_columns_in_function_tuple 控制)。新增函数 tupleNames,用于从元组中提取名称。 #54881 (Amos Bird).
  • 修改物化视图的去重机制。修复了许多类似场景:- 在目标表上:数据被拆分为 2 个或更多块,并且当这些块被并行插入时,这些块会被视为重复。- 在物化视图的目标表上:相同的数据块会被去重,这在物化视图由于执行聚合,对不同输入数据经常生成相同结果数据时会发生。- 在物化视图的目标表上:来自不同物化视图的相同数据块会被去重。 #61601 (Sema Checherinda).
  • 函数 bitShiftLeftbitShitfRight 在移位位置越界时会返回错误。 #65838 (Pablo Marcos).

新功能

  • full_sorting_join 算法添加 ASOF JOIN 支持。#55051 (vdimir).
  • clickhouse-client 中支持 JWT 身份验证(仅在 ClickHouse Cloud 中可用)。#62829 (Konstantin Bogdanov).
  • 新增 SQL 函数 changeYearchangeMonthchangeDaychangeHourchangeMinutechangeSecond。例如,SELECT changeMonth(toDate('2024-06-14'), 7) 返回日期 2024-07-14#63186 (cucumber95).
  • 引入启动脚本,允许在启动阶段执行预配置的查询。#64889 (pufit).
  • 在客户端配置中支持 accept_invalid_certificate,以便客户端可以通过安全 TCP 连接到使用自签名证书运行的服务器——可作为相应 openSSL 客户端设置 verificationMode=noneinvalidCertificateHandler.name=AcceptCertificateHandler 的简写。#65238 (peacewalker122).
  • 新增 system.error_log,其中包含来自 system.errors 表的错误值历史记录,并定期刷新到磁盘。#65381 (Pablo Marcos).
  • 添加聚合函数 groupConcat。其行为大致等同于 arrayStringConcat( groupArray(column), ',')。可以接收 2 个参数:字符串分隔符以及要处理的元素个数。#65451 (Yarik Briukhovetskyi).
  • 添加 AzureQueue 存储引擎。#65458 (Kseniia Sumarokova).
  • 新增设置,用于开启/关闭将页索引写入 Parquet 文件。#65475 (lgbo).
  • 引入 logger.console_log_level 服务器配置,用于控制输出到控制台的日志级别(如果已启用)。#65559 (Azat Khuzhin).
  • 使用表函数 file 时,自动在目录路径末尾追加通配符 *#66019 (Zhidong (David) Guo).
  • 在非交互模式下为客户端添加 --memory-usage 选项。#66393 (vdimir).
  • 为 clickhouse-disks 提供交互式客户端,并支持从本地目录添加本地磁盘。#64446 (Daniil Ivanik).
  • 当在带有投影的表上执行轻量级删除时,用户可以选择抛出异常(默认)或删除该投影。#65594 (jsc0218).
  • 新增 system 表,用于提供所有已分离表的主要信息。#65400 (Konstantin Morozov).

实验特性

  • 更改 Variant 数据类型的二进制序列化:新增 compact 模式,以避免在仅包含单一变体或仅包含 NULL 值的 granule 中多次写入相同的 discriminator。新增 MergeTree 设置 use_compact_variant_discriminators_serialization,默认启用。请注意,Variant 类型仍为实验性特性,因此对序列化进行不向后兼容的变更是可以接受的。 #62774 (Kruglov Pavel).
  • 为 clickhouse-keeper 提供基于磁盘的后端存储支持。 #56626 (Han Fei).
  • 重构 JSONExtract 函数,支持更多类型,包括实验性的 Dynamic 类型。 #66046 (Kruglov Pavel).
  • VariantDynamic 子列增加对 null map 子列的支持。 #66178 (Kruglov Pavel).
  • 修复从执行过 ALTER 操作的 Memory 表中读取 Dynamic 子列的问题。之前如果通过 ALTER 修改了 Memory 表中 Dynamic 类型的 max_types 参数,后续对子列的读取可能会返回错误结果。 #66066 (Kruglov Pavel).
  • 在使用自定义键的并行副本时增加对 cluster_for_parallel_replicas 的支持。这样可以在 MergeTree 表中使用带自定义键的并行副本。 #65453 (Antonio Andelic).

性能改进

  • 将整数转字符串的算法替换为更快的实现(从修改版 amdn/itoa 更换为修改版 jeaiii/itoa)。#61661Raúl Marín)。
  • 现在会收集并缓存由 joinparallel_hash 算法)创建的哈希表大小。此信息将用于在后续查询执行时为哈希表预先分配空间,从而节省哈希表扩容的时间。#64553Nikita Taranov)。
  • 通过使用缓冲机制,优化带有 ORDER BY 主键且 WHERE 条件具有高选择性的查询。此行为由设置 read_in_order_use_buffering 控制(默认启用),并且可能增加查询的内存使用量。#64607Anton Popov)。
  • 提升加载 plain_rewritable 元数据的性能。#65634Alexey Milovidov)。
  • 在只读磁盘上挂载表时,通过不加载过期的数据部分来减少资源占用。#65635Alexey Milovidov)。
  • 为 Set 索引支持 minmax 超矩形(hyperrectangle)。#65676AntiTopQuark)。
  • 卸载过期数据部分的主索引以降低总体内存使用量。#65852Anton Popov)。
  • 当模式较为简单(即不包含元字符、模式类、标志、分组字符等)时,replaceRegexpAllreplaceRegexpOne 函数现在会显著更快。(感谢 Taiyang Li)。#66185Robert Schulze)。
  • S3 请求:减少查询的重试等待时间,增加备份的重试次数。查询总计重试时间为 8.5 分钟、重试 100 次;备份恢复总计重试时间为 1.2 小时、重试 1000 次。#65232Sema Checherinda)。
  • 支持在查询计划中对 LIMIT 进行优化。为 PostgreSQL 存储和表函数添加 LIMIT 下推支持。#65454Maksim Kita)。
  • 改进了 ZooKeeper 的负载均衡。当前会话在可用的最优节点出现之前不会过期,即使设置了 fallback_session_lifetime。添加了对可用区(AZ)感知均衡的支持。#65570Alexander Tokmakov)。
  • DatabaseCatalog 通过使用最多 database_catalog_drop_table_concurrency 个线程来更快地删除表。#66065Sema Checherinda)。

改进

  • 改进了 ZooKeeper 的负载均衡。当前会话在最优节点可用之前不会过期,即使设置了 fallback_session_lifetime。增加了对可用区感知(AZ-aware)负载均衡的支持。#65570 (Alexander Tokmakov)。
  • 设置 optimize_trivial_insert_select 默认是禁用的。在大多数情况下,启用它应当是有益的。不过,如果你发现 INSERT SELECT 变慢或者内存使用增加,可以重新启用该设置,或者执行 SET compatibility = '24.6'#58970Alexey Milovidov)。
  • clickhouse-clientclickhouse-local 崩溃时,打印堆栈跟踪和诊断信息。#61109 (Alexander Tokmakov)。
  • SHOW INDEX | INDEXES | INDICES | KEYS 的结果此前是按主键列名排序的。由于这种行为不够直观,现在结果改为按这些主键列在主键中的位置进行排序。#61131 (Robert Schulze)。
  • 更改物化视图的去重机制。修复了许多情况,例如: 对于目标表:数据被拆分为 2 个或更多块,在这些块被并行插入时,它们会被错误地视为重复。 对于物化视图(MV)的目标表:相同的数据块会被去重,这发生在 MV 由于执行聚合操作,对不同的输入数据经常产生相同的结果数据时。 对于物化视图的目标表:来自不同 MV 的相同数据块会被去重。
  • 支持读取分区的 DeltaLake 数据。通过读取元数据而非实际数据来推断 DeltaLake 模式。 #63201 (Kseniia Sumarokova).
  • 在可组合协议中,TLS 层仅支持 certificateFileprivateKeyFile 参数。https://clickhouse.com/docs/operations/settings/composable-protocols#63985Anton Ivashkin)。
  • 新增 profile event SelectQueriesWithPrimaryKeyUsage,用于表示有多少 SELECT 查询使用主键来评估 WHERE 子句。#64492 (0x01f)。
  • StorageS3Queue 相关的修复和改进。根据服务器上物理 CPU 核心数推导出 s3queue_processing_threads_num 的默认值(而不是之前固定为 1)。将 s3queue_loading_retries 的默认值设置为 10。修复 system.s3queue 的异常列中可能出现的含糊错误信息 "Uncaught exception"。在出现 MEMORY_LIMIT_EXCEEDED 异常时不再增加重试计数。将文件提交操作移动到表数据完全插入完成之后的阶段,以避免在数据尚未插入时文件已经被提交。新增设置 s3queue_max_processed_files_before_commits3queue_max_processed_rows_before_commits3queue_max_processed_bytes_before_commits3queue_max_processing_time_sec_before_commit,以便更好地控制提交和刷新时间。#65046 (Kseniia Sumarokova)。
  • 在参数化视图函数中支持别名(仅适用于新分析器)。#65190Kseniia Sumarokova)。
  • 已更新,在 azureBlobStorage 的日志中隐藏账户密钥。#65273 (SmitaRKulkarni).
  • 当过滤表达式是 PARTITION BY 表达式的一部分时,对 IN 谓词执行分区剪枝。#65335 (Eduard Karacharov)。
  • arrayMin/arrayMax 可适用于所有可比较的数据类型。#65455pn)。
  • 改进了针对 cgroups v2 的内存核算,不再将页缓存占用的内存量计入其中。#65470 (Nikita Taranov)。
  • 在将数据块序列化以插入 EmbeddedRocksDB 表时,避免为每一行创建格式设置。#65474 (Duc Canh Le)。
  • clickhouse-local 提示符简化为 :)getFQDNOrHostName() 在 macOS 上耗时过长,而且我们本来也不希望在 clickhouse-local 的提示符中显示主机名。#65510Konstantin Bogdanov)。
  • 避免在低端虚拟机上打印 jemalloc 关于每 CPU arena 的消息。#65532Alexey Milovidov)。
  • 默认禁用文件系统缓存的后台下载功能。等我们修复在使用后台下载线程时,由于内存释放在查询上下文之外进行(而缓冲区在查询上下文之内分配),可能导致的 “Memory limit exceeded” 问题后,再重新启用该功能。此外,我们需要新增一个单独的设置,用于设置后台 worker 的单次最大下载大小(目前受限于 max_file_segment_size,这可能过大)。 #65534 (Kseniia Sumarokova).
  • 在配置中新增选项 <config_reload_interval_ms>,用于指定 ClickHouse 重新加载配置文件的时间间隔。#65545 (alesapin).
  • 为 ClickHouse 数据类型实现二进制编码,并在文档中补充其规范说明。在 Dynamic 二进制序列化中使用该编码,并通过 settings 配置项允许在 RowBinaryWithNamesAndTypes 和 Native 格式中使用它。 #65546 (Kruglov Pavel).
  • 服务器设置 compiled_expression_cache_sizecompiled_expression_cache_elements_size 现在可以在 system.server_settings 中查看。#65584Robert Schulze)。
  • 添加基于 x509 SubjectAltName 扩展的用户身份识别支持。#65626Anton Kozlov)。
  • clickhouse-local 会遵从配置文件中的 max_server_memory_usagemax_server_memory_usage_to_ram_ratio 设置。它也会像 clickhouse-server 一样,默认将最大内存使用量设置为系统内存的 90%。#65697Alexey Milovidov)。
  • 添加脚本,用于将文件备份到 ClickHouse。#65699Alexey Milovidov)。
  • 为 PostgreSQL 源添加了查询取消支持。#65722Maksim Kita)。
  • 使 allow_experimental_analyzer 在分布式查询中由发起端控制。这可确保在混合版本集群中执行操作时的兼容性和正确性。#65777 (Nikita Mikhaylov).
  • 在 Keeper 中遵守 cgroup CPU 限制。 #65819 (Antonio Andelic).
  • 允许在无参数时使用 concat 函数 :) select concat();#65887 (李扬).
  • 允许在 clickhouse-local 中管理命名集合。#65973 (Alexey Milovidov).
  • 改进与 Azure 相关的 Profile 事件。#65999 (alesapin).
  • 支持按写入端时区读取 ORC 文件。 #66025 (kevinyhzou).
  • 添加用于控制 PostgreSQL 连接的配置项。配置项 postgresql_connection_attempt_timeout 指定传递给连接 URL 中的 connect_timeout 参数的值。配置项 postgresql_connection_pool_retries 指定为建立与 PostgreSQL 端点连接而进行重试的次数。#66232Dmitry Novik)。
  • 降低 system.processors_profile_loginput_wait_elapsed_us/elapsed_us 的误差。#66239 (Azat Khuzhin)。
  • 改进与文件系统缓存相关的 ProfileEvents。 #66249 (zhukai).
  • 添加配置项,使在使用复制存储进行命名集合管理时忽略查询中的 ON CLUSTER 子句。#66288 (MikhailBurdukov)。
  • 函数 generateSnowflakeID 现在允许将机器 ID 作为参数指定,以防止在大型集群中出现冲突。#66374 (ZAWA_ll)。
  • 在交互模式下禁用通过 Ctrl+Z 将进程挂起。这是一个常见陷阱,对几乎所有用户来说都不是预期行为。我想只有极少数追求极致的高级用户才会欣赏把终端应用挂起到后台这种做法,但我并不认识任何这样的人。#66511Alexey Milovidov)。
  • 在 Dictionaries 中新增用于验证主键类型的选项。对于简单布局,如果没有该选项,任何列类型都会被隐式转换为 UInt64。#66595 (MikhailBurdukov)。

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

  • 在执行 CREATE/REPLACE/RENAME/EXCHANGE 查询时检查是否存在循环依赖,如果存在则抛出异常。此前,此类循环依赖可能会在服务器启动期间导致死锁。同时修复了在创建依赖关系时的一些缺陷。#65405 (Kruglov Pavel)。
  • 修复在函数调用中 LowCardinality 列意外的大小问题。#65298 (Raúl Marín)。
  • 修复 maxIntersections 中的崩溃。#65689 (Raúl Marín).
  • 修复用户定义中 VALID UNTIL 子句在重启后会被重置的问题。#66409 (Nikolay Degterinsky)。
  • 修复 SHOW MERGES 中的剩余时间列。#66735 (Alexey Milovidov)。
  • Query was cancelled 可能会在 clickhouse-client 中打印两次。该问题已修复。#66005 (Nikita Mikhaylov)。
  • 修复了在使用 MaterializedMySQL(一个不受支持的实验性功能)并配合 TABLE OVERRIDE 时出现的崩溃问题,该问题发生在将 MySQL 的 NULL 字段映射到 ClickHouse 中非 NULL 的字段的场景中。#54649 (Filipp Ozinov).
  • 修复了当 PREWHERE 表达式不读取任何列且表没有自适应索引粒度(非常老的表)时出现的逻辑错误。#59173 (Alexander Gololobov)。
  • 修复在取消查询时的取消缓冲区 Bug。 #64478 (Sema Checherinda).
  • 修复在 columns.txt 不存在时从元数据填充 part 列的逻辑。 #64757 (Azat Khuzhin).
  • 修复执行 ALTER TABLE ... ON CLUSTER ... MODIFY SQL SECURITY 时导致的崩溃。 #64957 (pufit).
  • 修复在销毁 AccessControl 时发生的崩溃:添加显式关闭。#64993Vitaly Baranov)。
  • 递归地在函数 uniq* 的参数中去除单射函数。此前工作正常,但在新的分析器中出现了问题。#65140Duc Canh Le)。
  • 修复在使用 CTE 查询时出现的意外投影名称问题。#65267 (wudidapaopao).
  • 在通过直接查询或 Dictionary 表引擎访问字典时,需要具备 dictGet 权限。#65359 (Joe Lynch)。
  • 修复了增量备份中基于用户的 S3 身份验证问题。 #65481 (Antonio Andelic).
  • 在启用了 read-in-order 优化的情况下,对包含 FINAL 的查询禁用 non-intersecting-parts 优化。否则可能会导致查询结果不正确。作为临时规避方案,在此修复合并之前,请禁用 do_not_merge_across_partitions_select_finalsplit_parts_ranges_into_intersecting_and_non_intersecting_final#65505 (Nikolai Kochetov)。
  • 修复当列表批中的所有文件都被过滤掉时抛出 Index out of bound for blob metadata 异常的问题。#65523Kseniia Sumarokova)。
  • 修复在投影去重合并过程中出现的 NOT_FOUND_COLUMN_IN_BLOCK 问题。#65573 (Yakov Olkhovskiy).
  • 修复了 MergeJoin 中的一个缺陷:稀疏序列化中的列在未执行所需转换的情况下,可能会被当作其嵌套类型的列进行处理。#65632 (Nikita Taranov)。
  • 修复了兼容性级别 '23.4' 未正确生效的问题。#65737 (cw5121)。
  • 修复包含可为 NULL 字段的 ODBC 表。#65738 (Rodolphe Dugé de Bernonville).
  • 修复在发生致命错误时可能出现的 TCPHandler 数据竞争问题。#65744 (Kseniia Sumarokova).
  • 修复函数 parseDateTime 在处理占位符 %F%D 时抛出的错误异常。#65768 (Antonio Andelic)。
  • 对于从 PostgreSQL 读取数据的查询,如果 ClickHouse 查询已完成,则会取消内部的 PostgreSQL 查询。否则,在内部的 PostgreSQL 查询完成前,ClickHouse 查询无法被取消。 #65771 (Maksim Kita)。
  • 修复在同时使用旧版分析器和 dictGetOrDefault 时短路逻辑中的一个 Bug。#65802jsc0218)。
  • 修复导致 EmbeddedRocksDB 在启用 TTL 写入时生成损坏 SST 文件的问题。#65816 (Duc Canh Le).
  • 函数 bitTestbitTestAllbitTestAny 现在在指定的位索引超出范围时会返回错误 #65818 (Pablo Marcos)。
  • 在任何使用哈希 JOIN 的查询中都支持设置 join_any_take_last_row#65820 (vdimir)。
  • 更好地处理包含 IS NULL 检查的 JOIN 条件(例如 ON (a = b AND (a IS NOT NULL) AND (b IS NOT NULL) ) OR ( (a IS NULL) AND (b IS NULL) ) 会被重写为 ON a <=> b),并修复在同时存在除 IS NULL 之外的其他条件时出现的不正确优化。#65835 (vdimir)。
  • 修复 S3Queue 中内存占用持续增长的问题。#65839 (Kseniia Sumarokova).
  • 修复 arrayAUC 中对相同值(tie)的处理,使其与 sklearn 一致。#65840 (gabrielmcg44)。
  • 修复 MySQL 服务器协议 TLS 连接的潜在问题。#65917Azat Khuzhin)。
  • 修复 MySQL 客户端协议 TLS 连接可能存在的问题。#65938Azat Khuzhin)。
  • 修复在超时时间为 0 时处理 SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE 的方式。#65941 (Azat Khuzhin).
  • 在模式推断缓存中添加缺失的设置 input_format_csv_skip_first_lines/input_format_tsv_skip_first_lines/input_format_csv_try_infer_numbers_from_strings/input_format_csv_try_infer_strings_from_quoted_tuples,因为它们会改变最终推断出的模式。这样可以避免在这些设置被修改时产生错误的模式推断结果。 #65980 (Kruglov Pavel).
  • 在 S3 引擎和 S3 表函数中,Column _size 表示归档文件中单个文件的大小,而不是整个归档文件的大小。#65993 (Daniil Ivanik)。
  • 修复在分析器中解析动态子列的问题,避免在读取动态子列时对整列进行扫描读取。#66004Kruglov Pavel)。
  • 修复 from_env 在使用 replace 覆盖时的配置合并问题。#66034 (Azat Khuzhin)。
  • 修复在关闭过程中 GRPCServer 可能出现的挂起问题。#66061 (Vitaly Baranov)。
  • 修复了函数 has 在使用非常量 LowCardinality 参数时的多个问题。#66088 (Anton Popov).
  • 修复了 groupArrayIntersectmerge() 函数中的不正确行为。同时修正了 deserialise() 对数值和通用数据的处理行为。#66103 (Yarik Briukhovetskyi)。
  • 修复了 unbin/unhex 实现中的缓冲区溢出漏洞。#66106 (Nikita Taranov).
  • 禁用在 #64760 中引入的 merge-filters 优化。如果该优化在合并两个过滤表达式时未执行短路求值,可能会导致异常。#66126Nikolai Kochetov)。
  • 修复了服务器在解析包含使用负块大小数组编码的数据的 Avro 文件时失败的问题,此类编码现在已被 Avro 规范允许。#66130 (Serge Klochkov)。
  • 修复了 ZooKeeper 客户端中的一个缺陷:在从 ZooKeeper 收到硬件错误后,会话可能会陷入不可用状态。例如,这可能是由于 ClickHouse Keeper 中的“软内存限制”导致的。#66140Alexander Tokmakov)。
  • 修复 SumIfToCountIfVisitor 与有符号整数相关的问题。#66146Raúl Marín)。
  • 修复极少数情况下分布式查询结果中数据缺失的问题。 #66174 (vdimir)。
  • 修复 StorageDeltaLake 中解析元数据字段的顺序。 #66211 (Kseniia Sumarokova).
  • distributed_ddl_output_mode 处于 none_only_active 模式时,不要抛出 TIMEOUT_EXCEEDED#66218 (Alexander Tokmakov).
  • 修复在无法使用索引时对 system.numbers_mt 的 LIMIT 子句处理。#66231János Benjamin Antal)。
  • 修复了当 ClickHouse 服务器在 Docker 等容器中运行时,根据 cgroups v2 指定的最大可用 CPU 核心数进行检测的方式。更具体地说,容器通常在名称为空的根 cgroup 中运行其进程。在这种情况下,ClickHouse 会忽略 cgroups v2 设置的 CPU 限制。#66237 (filimonov)。
  • 修复在约束条件中使用带有 IN 的子查询时出现的 Not-ready set 错误。#66261 (Nikolai Kochetov)。
  • 修复在复制到 S3 或 Azure Blob Storage 时的错误报告问题。#66295 (Vitaly Baranov)。
  • 防止 watchdog 保留已解除链接(已轮转)日志文件的文件描述符。#66334 (Aleksei Filatov).
  • 修复 logicalexpressionoptimizerpass 导致常量逻辑类型丢失的错误。 #66344 (pn).
  • 修复在使用 group_by_use_nulls=true 和新的 analyzer 时出现的 Column identifier is already registered 错误。#66400 (Nikolai Kochetov).
  • 修复在查询带有 PostgreSQL 等外部引擎的表并进行联接和过滤时,因过于激进的过滤下推而可能产生错误结果的问题。现在,在与外部表进行外连接的情况下,WHERE 子句中的条件将不会再被下推到外部数据库。#66402 (vdimir).
  • 为 cross join 补上了缺失的列物化。#66413 (lgbo).
  • 修复在启用新 analyzer 时,在 GROUP BY 键中包含常量表达式的查询出现的 Cannot find column 错误。#66433 (Nikolai Kochetov)。
  • 在从 Npy 格式导入时,避免在数组嵌套层级不正确的情况下产生潜在的逻辑错误,并修复对其他类型错误的测试。#66461 (Yarik Briukhovetskyi)。
  • 修复在谓词中存在非确定性函数时导致 count() 结果错误的问题。#66510 (Duc Canh Le).
  • 正确跟踪 Allocator::realloc 的内存使用。 #66548 (Antonio Andelic)。
  • 修复在对空元组进行哈希时读取未初始化的内存的问题。 #66562 (Alexey Milovidov).
  • 修复在使用 WINDOW 的查询中返回无效结果的问题。当 PARTITION 列使用稀疏序列化方式且窗口函数并行执行时,可能会出现此问题。#66579 (Nikolai Kochetov)。
  • 修复删除本地存储中的命名集合时的问题。#66599 (János Benjamin Antal).
  • 修复在 ColumnTuple::insertManyFrom 中未更新 column_length 的问题。#66626 (lgbo)。
  • 修复在包含表达式 (column IS NULL) 的查询中出现的 Unknown identifierColumn is not under aggregate function 错误。该错误仅在禁用 analyzer 的情况下才会被 #65088 触发。#66654Nikolai Kochetov)。
  • 修复在使用新分析器时,如果将标量子查询用作 IN 的第一个参数,会触发 Method getResultType is not supported for QUERY query node 错误的问题。 #66655 (Nikolai Kochetov).
  • 修复在读取 variant 子列时可能触发的 PARAMETER_OUT_OF_BOUND 错误。#66659 (Kruglov Pavel).
  • 修复删除列后合并卡住的罕见问题。#66707 (Raúl Marín).
  • 修复在从远程源执行 INSERT SELECT 时的断言 isUniqTypes#66722Sema Checherinda)。
  • 修复 PrometheusRequestHandler 中的逻辑错误。#66621 (Vitaly Baranov).
  • 修复由模糊测试工具发现的 indexHint 函数问题。#66286 (Anton Popov)。
  • 修复 create table b empty as a 的 AST 格式化问题。#64951Michael Kolupaev)。

ClickHouse release 24.6, 2024-07-01

向后不兼容的变更

  • 默认启用异步加载数据库和表。参见 config.xml 中的 async_load_databases。尽管此变更整体上完全兼容,但可能会带来行为差异。当 async_load_databases 为 false(与之前版本相同)时,服务器在所有表加载完成之前不会接受连接。当 async_load_databases 为 true(即新版本的行为)时,服务器可以在所有表尚未完全加载之前就接受连接。如果对尚未加载完成的表发起查询,该查询会等待表完成加载,这可能会花费相当长的时间。如果服务器是大型分布式系统的一部分并位于负载均衡器之后,这将改变服务器的行为。在第一种情况下,负载均衡器会收到连接被拒绝,并快速切换到其他服务器。在第二种情况下,负载均衡器可能连接到仍在加载表的服务器,此时查询的延迟会更高。此外,如果有大量查询积压在等待状态,当它们开始同时处理时,可能会导致“惊群问题(thundering herd)”。这一差异仅会影响高负载的分布式后端。你可以将 async_load_databases 设置为 false 以避免该问题。#57695Alexey Milovidov)。
  • 默认对 MergeTree 表启用 replace_long_file_name_to_hash 设置。#64457Anton Popov)。该设置完全兼容,升级时无需额外操作。新的数据格式从 23.9 起的所有版本均已支持。启用此设置后,你将无法再降级到 23.8 或更早的版本。
  • 一些无效查询会在解析阶段更早失败。注意:当 kql 表函数中未使用字符串字面量时,已禁用对内联 KQL 表达式(实验性的 Kusto 语言)的支持,例如 kql(garbage | trash) 不再被支持,必须使用 kql('garbage | trash')kql($$garbage | trash$$)。此特性是无意间引入的,本不应该存在。#61500Alexey Milovidov)。
  • 重构存储引擎 S3QueueOrdered 模式下的并行处理逻辑。如果你在 Ordered 模式中使用了 s3queue_processing_threads_nums3queue_total_shards_num 设置,此 PR 将不向后兼容。设置 s3queue_total_shards_num 已被删除,此前它只允许在 s3queue_allow_experimental_sharded_mode 下使用,而该设置现在已废弃。新增了一个设置 —— s3queue_buckets#64349Kseniia Sumarokova)。
  • 新增函数 snowflakeIDToDateTimesnowflakeIDToDateTime64dateTimeToSnowflakeIDdateTime64ToSnowflakeID。与现有的 snowflakeToDateTimesnowflakeToDateTime64dateTimeToSnowflakedateTime64ToSnowflake 函数不同,新函数与 generateSnowflakeID 函数兼容,即它们接受由 generateSnowflakeID 生成的 snowflake ID,并生成与 generateSnowflakeID 相同类型(即 UInt64)的 snowflake ID。此外,新函数默认使用 UNIX 纪元(即 1970-01-01),与 generateSnowflakeID 相同。如有需要,可以传入不同的纪元,例如 Twitter/X 的纪元 2010-11-04(即自 UNIX 纪元以来的 1288834974657 毫秒)。旧的转换函数已被弃用,并将在过渡期后移除:如果仍需继续使用它们,请启用设置 allow_deprecated_snowflake_conversion_functions#64948Robert Schulze)。

新功能

  • 支持在 ClickHouse Keeper 中存储具名集合。 #64574 (Kseniia Sumarokova).
  • 支持空元组。 #55061 (Amos Bird).
  • 新增 Hilbert 曲线编码和解码函数。#60156Artem Mustafin)。
  • hilbertEncode 添加索引分析支持。#64662Artem Mustafin)。
  • 新增对通过函数 readWKTLineString 读取 WKT 格式 LINESTRING 几何对象的支持。#62519 (Nikita Mikhaylov)。
  • 允许从其他磁盘附加数据分片。 #63087 (Unalian).
  • 新增 SQL 函数 generateSnowflakeID,用于生成 Twitter 风格的 Snowflake ID。#63577 (Danila Puzov)。
  • 新增了 merge_workloadmutation_workload 设置,用于调节资源在合并、变更及其他工作负载之间的使用和共享方式。 #64061 (Sergei Trifonov).
  • 新增对使用 = 运算符比较 IPv4IPv6 类型的支持。#64292Francisco J. Jurado Moreno)。
  • 在二元数学函数(pow、atan2、max2、min2、hypot)中支持 Decimal 参数。#64582Mikhail Gorshkov)。
  • 新增 SQL 函数 parseReadableSize(及其 OrNullOrZero 变体)。#64742 (Francisco J. Jurado Moreno)。
  • 添加了服务器设置 max_table_num_to_throwmax_database_num_to_throw,用于限制在执行 CREATE 查询时可创建的数据库或表数量上限。#64781 (Xu Jia)。
  • 为类文件存储(S3/file/hdfs/url/azureBlobStorage)添加 _time 虚拟列。 #64947 (Ilya Golshtein)。
  • 新增了新函数 base64URLEncodebase64URLDecodetryBase64URLDecode#64991 (Mikhail Gorshkov).
  • 新增函数 editDistanceUTF8,用于计算两个 UTF-8 字符串的编辑距离#65269LiuNeng)。
  • 添加 http_response_headers 配置,以支持在自定义 HTTP 处理程序中设置自定义响应头。 #63562 (Grigorii)。
  • 新增了一个名为 loop 的表函数,用于以无限循环的方式返回查询结果。#63452 (Sariel)。这对测试很有帮助。
  • system.query_log 中新增了两个列:used_privilegesmissing_privilegesused_privileges 记录在查询执行期间被检查的权限,missing_privileges 则包含缺失的必需权限。 #64597 (Alexey Katsman)。
  • 新增了一个设置项 output_format_pretty_display_footer_column_names,启用后会在较长的表(默认 50 行及以上)末尾显示列名,最小行数阈值由 output_format_pretty_display_footer_column_names_min_rows 控制。#65144 (Shaun Struwig)。

实验特性

  • 引入“不同值个数”类型的统计信息。#59357 (Han Fei).
  • 支持在 ReplicatedMergeTree 中使用统计信息。#64934 (Han Fei).
  • 如果为 Replicated 数据库配置了“副本组(replica group)”,则会自动创建一个包含所有组中副本的集群。#64312 (Alexander Tokmakov).
  • 新增设置 parallel_replicas_custom_key_range_lowerparallel_replicas_custom_key_range_upper,用于在使用范围过滤条件时控制动态分片的并行副本如何并行执行查询。#64604 (josh-hildred).

性能优化

  • 在插入时添加对行重新排序的能力,以在不违反由 PRIMARY KEY 设定的顺序的前提下优化数据大小。该行为由设置项 optimize_row_order 控制(默认关闭)。#63578Igor Markelov)。
  • 新增原生 Parquet 读取器,可直接将 Parquet 二进制数据读入 ClickHouse 列。该功能由设置项 input_format_parquet_use_native_reader 控制(默认禁用)。#60361 (ZhiHong Zhang)。
  • 当查询过滤条件能够从 MergeTree 表中精确选定范围时,支持部分 trivial count 优化。 #60463 (Amos Bird).
  • 通过在单个 transform 中汇集多个线程的数据块,降低多线程 INSERT 的最大内存占用。#61047 (Yarik Briukhovetskyi).
  • 在使用 Azure 对象存储时,通过采用固定内存分配来减少内存使用量,避免分配额外的缓冲区。#63160 (SmitaRKulkarni)。
  • 减少 ColumnNullable::size 中的虚函数调用次数。 #60556 (HappenLee).
  • 当正则表达式参数为单字符时,优化 splitByRegexp 的性能。#62696 (Robert Schulze).
  • 通过跟踪已使用键的最小值和最大值,加速对 8 位和 16 位键的聚合。这可以减少需要验证的单元数量。#62746Jiebin Sun)。
  • 当左侧为 LowCardinality 类型且右侧为常量集合时,对 IN 运算符进行优化。 #64060 (Zhiguo Zhou).
  • ConcurrentHashJoin 中使用线程池来初始化和销毁哈希表。#64241 (Nikita Taranov)。
  • 优化了包含稀疏列的表的纵向合并。 #64311 (Anton Popov)。
  • 在垂直合并期间启用了从远程文件系统进行数据预取的功能,从而降低了数据存储在远程文件系统上的表执行垂直合并时的延迟。 #64314 (Anton Popov).
  • 减少对 ColumnSparse::filterisDefault 的冗余调用,以提升性能。#64426 (Jiebin Sun)。
  • 通过对 getChildren 发起多个异步请求,加速 find_super_nodesfind_big_family Keeper 客户端命令。 #64628 (Alexander Gololobov).
  • 改进函数 least/greatest 对可为空的数值类型参数的支持。#64668 (KevinyhZou).
  • 允许合并查询计划中相邻的两个过滤步骤。如果可以将过滤条件从父步骤下推,则可以提升过滤下推(filter push-down)优化效果。#64760Nikolai Kochetov)。
  • 移除 vertical final 实现中的不良优化,并默认重新启用 vertical final 算法。 #64783 (Duc Canh Le).
  • 从过滤表达式中移除 ALIAS 节点。对于带有 PREWHERE(使用新分析器)的查询,这可以略微提升性能。#64793Nikolai Kochetov)。
  • 重新启用 OpenSSL 会话缓存。#65111 (Robert Schulze)。
  • 添加了用于在插入时禁用跳过索引和统计信息物化的设置(materialize_skip_indexes_on_insertmaterialize_statistics_on_insert)。#64391 (Anton Popov)。
  • 使用已分配的内存大小来计算行组大小,并在单线程模式下降低 Parquet 写入器的峰值内存占用。#64424 (LiuNeng)。
  • 改进稀疏列的迭代器,以减少对 size 的调用次数。#64497 (Jiebin Sun).
  • 更新条件,以在备份到 Azure Blob Storage 时使用服务器端复制。#64518SmitaRKulkarni)。
  • 优化了针对包含大量 skip 索引的表进行纵向合并时的内存使用。#64580 (Anton Popov).

改进

  • 现在对系统表执行 SHOW CREATE TABLE 时,会显示每个表特有的、非常实用的注释,用于说明该表的用途和存在的原因。#63788Nikita Mikhaylov)。
  • 函数 round(), roundBankers(), floor(), ceil()trunc() 的第二个参数(scale)现在可以是非常量了。#64798Mikhail Gorshkov)。
  • Distributed 表在添加新磁盘时支持存储策略热重载。#58285Duc Canh Le)。
  • 在服务饱和时进行线程调度的场景下,避免在 MergeTree 索引分析过程中可能发生的死锁。#59427Sean Haynes)。
  • 修复了若干与 S3 代理支持和隧道相关的次要边界情况。#63427Arthur Passos)。
  • 改进 io_uring 重新提交(resubmit)的可见性。将性能分析事件从 IOUringSQEsResubmits 重命名为 IOUringSQEsResubmitsAsync,并新增一个事件 IOUringSQEsResubmitsSync#63699 (Tomer Shafir).
  • 添加了一个新的设置项 metadata_keep_free_space_bytes,用于在元数据存储磁盘上保留空闲空间。#64128MikhailBurdukov)。
  • plain_rewritable 元数据存储新增指标,用于跟踪创建和删除的目录数量,以及本地到远程内存映射表中的条目数量。#64175 (Julia Kartseva)。
  • 查询缓存现在会将设置不同但语句相同的查询视为不同的查询。这样在不同设置(例如 limitadditional_table_filters)会影响查询结果的情况下,提高了系统的健壮性。 #64205 (Robert Schulze).
  • 在对象存储中支持将非标准错误码 QpsLimitExceeded 作为可重试错误处理。 #64225 (Sema Checherinda).
  • 如果该表对应的 ZooKeeper 路径已存在,则禁止将 MergeTree 表转换为复制表(ReplicatedMergeTree)。 #64244 (Kirill).
  • 添加了一个新的设置项 input_format_parquet_prefer_block_bytes 用于控制平均输出数据块的字节数,并将 input_format_parquet_max_block_size 的默认值修改为 65409。#64427 (LiuNeng)。
  • 允许对在 no_proxy 环境变量和 ClickHouse 代理配置中指定的主机跳过代理。#63314Arthur Passos)。
  • 启动 Keeper 时,始终为全局线程池配置足够数量的线程。#64444 (Duc Canh Le)。
  • 用户配置文件中的设置不会影响使用对象存储的 MergeTree 的合并(merge)和变更(mutation)。 #64456 (alesapin).
  • 将对象存储中的非标准错误码 TotalQpsLimitExceeded 视为可重试错误并予以支持。 #64520 (Sema Checherinda).
  • 为开源版和 ClickHouse Cloud 版本更新了高级仪表板,新增“最大并发网络连接数”图表。#64610 (Thom O'Connor)。
  • 改进 zeros_mtgenerateRandom 的进度报告功能。 #64804 (Raúl Marín).
  • 新增一个异步指标 jemalloc.profile.active,用于指示当前采样是否处于激活状态。它是对 prof.active 的补充激活机制;只有两者都为激活状态时,调用线程才会进行采样。#64842 (Unalian)。
  • 移除了对 allow_experimental_join_condition 的重要性标记。该标记可能导致在混合版本集群中,分布式查询无法成功执行。#65008Nikita Mikhaylov)。
  • 新增了服务器异步指标 DiskGetObjectThrottler*DiskGetObjectThrottler*,用于反映通过磁盘设置 s3_max_get_rpss3_max_put_rps 定义的每秒请求速率上限,以及当前在不触发该磁盘限流上限的情况下仍可发送的请求数量。对于每个配置了速率限制的磁盘,都会定义这些指标。#65050Sergei Trifonov)。
  • Poco::ThreadPool 初始化全局 trace 采集器(Keeper 等组件需要)。#65239 (Kseniia Sumarokova)。
  • 在使用 bcrypt_hash 创建用户时添加验证。#65242Raúl Marín)。
  • 为在 PREWHERE 阶段/之后读取的行数添加 ProfileEvents 统计。#64198 (Nikita Taranov).
  • 在使用并行副本时,在 EXPLAIN PLAN 中输出查询。#64298 (vdimir).
  • 将配置项 allow_deprecated_functions 重命名为 allow_deprecated_error_prone_window_functions#64358 (Raúl Marín).
  • file 表函数中,max_read_buffer_size 设置同样适用于文件描述符。 #64532 (Azat Khuzhin).
  • 即使在物化视图中,对于不支持的存储也禁用事务。#64918 (alesapin).
  • 在旧版分析器中禁止使用 QUALIFY 子句。旧版分析器会忽略 QUALIFY,因此在执行变更操作(mutation)时可能会导致意外的数据删除。#65356Dmitry Novik)。

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

  • 修复了 Apache ORC 库中的一个缺陷:修正了在所有平台上写入无符号类型,以及在 ARM 上写入 Int8 时的 ORC 统计信息计算错误。#64563 (Michael Kolupaev)。
  • 恢复了 ClickHouse 在 CSV 格式中处理和解释 Tuple 的原有行为。此更改实际上回滚了 https://github.com/ClickHouse/ClickHouse/pull/60994,并使该行为仅在以下几个设置下可用:output_format_csv_serialize_tuple_into_separate_columnsinput_format_csv_deserialize_separate_columns_into_tupleinput_format_csv_try_infer_strings_from_quoted_tuples#65170Nikita Mikhaylov)。
  • 修复一个权限错误,该错误会导致在特定情况下,用户无需获得必要授权即可在默认数据库上提升其权限。#64769 (pufit).
  • 修复在使用 UniqInjectiveFunctionsEliminationPass 和 uniqCombined 时出现的崩溃问题。#65188 (Raúl Marín).
  • 修复 ClickHouse Keeper 中在关闭会话时导致摘要不一致的错误。 #65198 (Aleksei Filatov).
  • 为 Distinct 组合器使用正确的内存对齐方式。此前在使用该组合器时,可能由于无效的内存分配而导致崩溃。#65379Antonio Andelic)。
  • 修复 DISTINCT 与窗口函数一起使用时的崩溃问题。#64767 (Igor Nikonov)。
  • 修复了与 IN 和 indexHint() 搭配使用时 'set' 跳过索引不起作用的问题。#62083 (Michael Kolupaev).
  • 在为参数化视图设置值时支持执行函数。#63502 (SmitaRKulkarni)。
  • 修复了 Parquet 内存跟踪。 #63584 (Michael Kolupaev).
  • 修复了对类型为 Tuple(Map(LowCardinality(String), String), ...) 的列的读取。#63956 (Anton Popov).
  • 修复在不同类型(表达式和函数)的循环别名时出现的 Cyclic aliases 错误。 #63993 (Nikolai Kochetov).
  • 此修复将在查询管道中,为每个独立视图使用重新定义后的正确上下文,并为其设置正确的定义者。 #64079 (pufit).
  • 修复 analyzer:修正了在使用 INTERPOLATE 时出现的 “Not found column” 错误。#64096 (Yakov Olkhovskiy)。
  • 修复了在将文件备份到使用与包含该文件的磁盘不同凭证的 S3 存储桶时的问题。 #64153 (Antonio Andelic).
  • 查询缓存现在会将针对不同数据库的两个相同查询视为不同的查询。先前的行为可能被利用来绕过对表的读取权限限制。#64199Robert Schulze)。
  • 修复在 StatusFile 中,因 ~WriteBufferFromFileDescriptor 未捕获异常导致可能中止的问题。#64206 (Kruglov Pavel)。
  • 修复在使用 ARRAY JOIN 的分布式查询中出现的 duplicate alias 错误。#64226Nikolai Kochetov)。
  • 修复从字符串到整数的意外 accurateCast。 #64255 (wudidapaopao).
  • 修复了在任意 OR 组包含互斥原子时的 CNF 简化问题。 #64256 (Eduard Karacharov).
  • 修复 Query Tree 的大小校验。#64377Dmitry Novik)。
  • 修复在 Buffer 表上使用 PREWHERE 时出现的 Logical error: Bad cast 问题。#64388Nikolai Kochetov)。
  • blob_storage_log 存储在对象存储上时,防止发生递归日志记录。 #64393 (vdimir)。
  • 修复了在具有默认表达式的表上执行的 CREATE TABLE AS 查询。#64455 (Anton Popov)。
  • 修复了在具有可为 NULL 键的表上,optimize_read_in_order 在 ORDER BY ... NULLS FIRST / LAST 情况下的行为。#64483Eduard Karacharov)。
  • 修复在包含 GLOBAL IN 别名的查询中出现的 Expression nodes list expected 1 projection namesUnknown expression or identifier 错误。#64517Nikolai Kochetov)。
  • 修复在分布式查询中,当常量 CTE 用作 GROUP BY 键时出现的 Cannot find column 错误。#64519 (Nikolai Kochetov)。
  • 修复从备份恢复时,如果创建了其定义者尚未恢复的 MV,会导致恢复被阻塞并陷入崩溃循环的问题。#64595 (pufit)。
  • 修复了函数 formatDateTimeInJodaSyntax 的输出问题:当格式化器生成的字符数为奇数且最后一个字符为 0 时会出错。例如,SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D') 现在会正确返回 150,而不是之前的 15#64614LiuNeng)。
  • 如果已经使用了 -If 组合器,则不要重写聚合操作。 #64638 (Dmitry Novik).
  • 修复在缓冲区较小时(例如 --max_read_buffer_size 1)对 float 类型的推断问题。#64641 (Azat Khuzhin).
  • 修复了一个可能导致基于表达式的 TTL 无法正常工作的错误。#64694 (alesapin).
  • 修复新分析器中对始终为真的 WHEREPREWHERE 表达式的删除行为。 #64695 (Nikolai Kochetov).
  • 修复了在按 startsWithendsWithmatchmultiSearchAny 结果进行过滤时,基于 token 的文本索引(ngrambffull_text)出现过度部分消除的问题。#64720 (Eduard Karacharov)。
  • 修复了 UTF8::computeWidth 函数中对 ANSI CSI 转义序列处理不正确的问题。#64756Shaun Struwig)。
  • 修复了在子查询之间错误移除 ORDER BY / LIMIT BY 的情况。#64766 (Raúl Marín)。
  • 修复(实验性)在混合 join 条件中使用用于构建集合的子查询进行非等值 join 时的问题。 #64775 (lgbo).
  • 修复在 plain_rewritable 磁盘上使用本地缓存时可能发生的崩溃。#64778 (Julia Kartseva).
  • Keeper 修复:在 mntr 命令中为 zk_latest_snapshot_size 返回正确的值。#64784 (Antonio Andelic).
  • 修复在对 Nested 列执行 ARRAY JOIN 的分布式查询中出现的 Cannot find column 错误。修复了 #64755#64801Nikolai Kochetov)。
  • 修复 SLRU 缓存策略中的内存泄漏。#64803 (Kseniia Sumarokova)。
  • 修复了多种查询中可能存在的不正确内存跟踪问题:从 S3 读取任意数据的查询、通过 HTTP 协议的查询,以及异步插入操作。 #64844 (Anton Popov).
  • 修复在使用 PREWHERE 从物化视图读取时,当物化视图中的列类型与源表不同时出现的 Block structure mismatch 错误。修复了 #64611#64855Nikolai Kochetov)。
  • 修复在表定义了带子查询的 TTL、数据库为 replicated、启用 parallel replicas 且使用 analyzer 时可能出现的罕见崩溃。这种情况虽然非常罕见,但请不要在 TTL 中使用子查询。#64858 (alesapin)。
  • 在删除大批量数据时,修复 blob_storage_log 中重复记录的 Delete 事件。#64924 (vdimir)。
  • 修复了在服务器启动后,当配置中包含从 [Zoo]Keeper 获取的 include 片段时,可能由 [Zoo]Keeper 报出的 Session moved to another server 错误。#64986 (Alexander Tokmakov)。
  • 修复在参数化 VIEW 上失效的 ALTER MODIFY COMMENT 查询,该问题出现在 https://github.com/ClickHouse/ClickHouse/pull/54211 中。#65031Nikolay Degterinsky)。
  • 修复在启用 cluster_secure_connection 参数时 DatabaseReplicated 中的 host_id。此前,即使启用了该参数,DatabaseReplicated 在集群内创建的所有连接仍然是非加密的。 #65054 (Nikolay Degterinsky)。
  • 修复在对 StorageMerge 进行 PREWHERE 优化后出现的 Not-ready Set 错误。#65057Nikolai Kochetov)。
  • 避免向类文件存储中的已完成缓冲区进行写入。 #65063 (Kruglov Pavel).
  • 修复在存在循环别名时可能导致查询无限执行的问题。修复了 #64849#65081Nikolai Kochetov)。
  • 修复在使用 INTERPOLATE (alias)(新分析器)执行远程查询时出现的 Unknown expression identifier 错误,解决了 #64636#65090Nikolai Kochetov)。
  • 修复将算术运算下推到聚合运算外部的问题。在新的 analyzer 中,该优化此前仅会被应用一次。#65104 (Dmitry Novik)。
  • 修复在新分析器中对聚合函数名称的重写问题。 #65110 (Dmitry Novik).
  • 如果在从客户端套接字读取(部分)请求体时发生接收超时,则返回 5xx,而不是 200 OK。#65118 (Julian Maicher)。
  • 修复对冲请求可能导致的崩溃。#65206 (Azat Khuzhin).
  • 修复 Hashed 和 Hashed_Array 字典在短路求值中的一个缺陷,该问题可能导致读取未初始化的数值,从而引发各种错误。#65256 (jsc0218)。
  • 此 PR 确保在 IN 运算符的类型转换过程中,常量(IN 运算符的第二个参数)的类型始终是可见的。否则,类型信息的丢失可能会导致某些转换失败,例如从 DateTime 到 Date 的转换。此更改修复了 #64487#65315pn)。

构建/测试/打包改进

ClickHouse 24.5 版本发布,2024-05-30

不向后兼容的更改

  • 将 “inverted indexes”(倒排索引)重命名为 “full-text indexes”(全文索引),这是一个技术性较弱、更易于用户理解的名称。这也会更改内部表元数据,并导致包含现有(实验性)倒排索引的表无法正常工作。请务必在升级前删除此类索引,并在升级后重新创建。#62884 (Robert Schulze).
  • 函数 neighborrunningAccumulaterunningDifferenceStartingWithFirstValuerunningDifference 的使用已被弃用(因为容易出错)。应改用合适的窗口函数。若要重新启用这些函数,请设置 allow_deprecated_error_prone_window_functions = 1 或将 compatibility 设置为 24.4 或更低版本。#63132 (Nikita Taranov).
  • 当列数量很多,但许多数据库或表没有被授予 SHOW TABLES 权限时,对 system.columns 的查询现在会执行得更快。请注意,在之前的版本中,如果仅对单独的列授予 SHOW COLUMNS 权限,而未对相应的表授予 SHOW TABLES 权限,则 system.columns 表仍会显示这些列,但在新版本中,将会完全跳过该表。移除了减慢查询的 “Access granted” 和 “Access denied” 跟踪日志消息。#63439 (Alexey Milovidov).

新功能

  • 新增 Form 格式,用于以 application/x-www-form-urlencoded 格式读写单条记录。#60199 (Shaun Struwig)。
  • 新增了在 CROSS JOIN 中进行压缩的能力。 #60459 (p1rattttt).
  • 当大小超过限制时,新增支持在临时文件中执行 CROSS JOIN#63432 (p1rattttt)。
  • 支持在 JOIN 中使用涉及左右表列的不等条件,例如 t1.y < t2.y。要启用该功能,执行 SET allow_experimental_join_condition = 1#60920 (lgbo)。
  • 现在 Map 类型可以使用 Float32Float64Array(T)Map(K, V)Tuple(T1, T2, ...) 作为键。解决了 #54537#59318 (李扬).
  • 通过创建并摄取 SST 文件,而不是依赖 RocksDB 内置的 memtable,为 EmbeddedRocksDB 引入批量加载功能。这有助于提高导入速度,尤其是针对 StorageEmbeddedRocksDB 表的长时间运行插入查询。同时引入了 EmbeddedRocksDB 表设置。#59163 #63324 (Duc Canh Le)。
  • 用户现在可以通过设置 input_format_tsv_crlf_end_of_line 在解析 TSV 格式时支持 CRLF 行结束符。修复了 #56257#59747Shaun Struwig)。
  • 新增了设置 input_format_force_null_for_omitted_fields,用于将被省略的字段强制设为 NULL。 #60887 (Constantine Peresypkin).
  • 此前我们的 S3 存储和 s3 表函数不支持从归档文件(例如 tar 包、zip、7z 压缩包)中进行查询。现在它们已经支持在 S3 中遍历归档内的文件。#62259Daniil Ivanik)。
  • 添加对条件函数 clamp 的支持。#62377 (skyoct)。
  • 添加 NPy 输出格式。#62430豪肥肥)。
  • Raw 格式作为 TSVRaw 的别名。#63394 (Unalian)。
  • 新增了 SQL 函数 generateUUIDv7,用于生成第 7 版 UUID,即带有随机部分的基于时间戳的 UUID。同时新增函数 UUIDToNum 用于从 UUID 中提取字节数据,以及函数 UUIDv7ToDateTime 用于从第 7 版 UUID 中提取时间戳部分。#62852 (Alexey Petrunyaka)。
  • 在 Linux 和 macOS 上,如果程序的 stdout 被重定向到带有压缩扩展名的文件,则自动使用对应的压缩方式,而不是不进行压缩(从而使其行为类似于 INTO OUTFILE)。#63662 (v01dXYZ)。
  • 更改在附加表数量较多时显示的警告信息,以便区分表、视图和字典。#64180Francisco J. Jurado Moreno)。
  • 在 ClickHouse 服务器中为 azureBlobStorage 函数增加对 Azure Workload Identity 的支持,从而可以使用 Azure Workload Identity 对 Azure Blob Storage 进行身份验证。如果在配置中设置了 use_workload_identity 参数,则会使用 workload identity 进行身份验证。#57881Vinay Suryadevara)。
  • system.parts_columns 表中添加 TTL 信息。 #63200 (litlig).

实验性特性

  • 实现了 Dynamic 数据类型,它允许在事先不知道所有可能类型的情况下,在其中存储任意类型的值。Dynamic 类型可通过设置 allow_experimental_dynamic_type 启用。参考:#54864#63058Kruglov Pavel)。
  • 允许在未连接 MySQL 的情况下创建 MaterializedMySQL 数据库。#63397Kirill)。
  • 当某个 DDL 任务以相同错误连续失败次数超过 max_retries_before_automatic_recovery(默认 100)时,会自动将某个 Replicated 数据库的副本标记为丢失并启动恢复。同时,修复了一个 bug:在执行某个条目的早期阶段抛出异常时,可能会导致 DDL 条目被跳过。#63549Alexander Tokmakov)。
  • StorageS3Queue 中,失败的文件也会计入 s3queue_tracked_file_ttl_secs3queue_traked_files_limit 的统计。#63638Kseniia Sumarokova)。

性能改进

  • 减少对文件系统缓存(第 4 部分)的争用。通过在后台执行额外的淘汰(由 keep_free_space_size(elements)_ratio 控制),避免将文件系统缓存填满至上限。这样可以减轻查询空间预留(在 tryReserve 方法中)的压力。同时尽可能以无锁方式完成,即不应阻塞正常的缓存使用。#61250Kseniia Sumarokova)。
  • 在执行 INSERT 时,跳过对新创建的 projection 块的合并。#59405Nikita Taranov)。
  • 当输入字符串全部为 ASCII 字符时,将字符串函数 ...UTF8 按 ASCII 方式处理。灵感来自 https://github.com/apache/doris/pull/29799。整体提速约为 1.07x~1.62x。注意某些情况下峰值内存使用有所降低。#61632李扬)。
  • 提升 StorageS3 中选择 ({}) 通配模式的性能。#62120Andrey Zvonov)。
  • HostResolver 中每个 IP 地址可能会出现多次。如果远程主机有多个 IP,并且由于某些原因(例如防火墙规则)其中部分 IP 允许访问而其他 IP 被禁止,那么只有第一个被禁止的 IP 记录会被标记为失败,在每次尝试中这些 IP 都有机会被再次选择(并再次失败)。即使修复这一点,每 120 秒 DNS 缓存也会被清空,IP 仍可能再次被选中。#62652Anton Ivashkin)。
  • 新增配置项 prefer_merge_sort_block_bytes,用于控制内存使用,并在列很多时将合并阶段的排序加速至 2 倍左右。#62904LiuNeng)。
  • clickhouse-local 启动速度将更快。在之前版本中,它不会按预期删除临时目录,现在会删除。此更改关闭了 #62941#63074Alexey Milovidov)。
  • 针对新分析器的一些微优化。#63429Raúl Marín)。
  • DateTimeDateTime64 比较时,索引分析现在可以正常工作。此更改关闭了 #63441#63443 #63532Alexey Milovidov)。
  • 通过去除冗余数据,略微加速 set 类型索引(约 1.5 倍)。#64098Alexey Milovidov)。
  • 写入文件系统缓存时取消数据拷贝操作。#63401Kseniia Sumarokova)。
  • 使用 Azure Blob Storage 的备份现在将使用多副本拷贝(multicopy)。#64116alesapin)。
  • 即使在不同的容器之间,也允许对 Azure 使用原生拷贝(native copy)。#64154alesapin)。
  • 最终为 Azure 启用了原生拷贝(native copy)。#64182alesapin)。

改进

  • 允许使用 clickhouse-local 及其快捷方式 clickhousech,并将查询语句或查询文件作为位置参数传入。示例:ch "SELECT 1"ch --param_test Hello "SELECT {test:String}"ch query.sql。此更改解决了 #62361#63081Alexey Milovidov)。
  • 为本地和 Azure(azure_blob_storage)对象存储启用 plain_rewritable 元数据。#63365 (Julia Kartseva)。
  • 支持英文风格的 Unicode 引号,例如 “Hello”、'world'。一般来说这并不算理想,但当你在诸如 Google Docs 之类的文字处理器中编写查询时会很有帮助。本次更改修复了 #58634#63381Alexey Milovidov)。
  • INSERT 查询的列列表中允许使用末尾逗号。例如:INSERT INTO test (a, b, c, ) VALUES ...#63803Alexey Milovidov)。
  • 改进 Regexp 格式的异常信息。#63804 (Alexey Milovidov).
  • 允许在 Values 格式中使用尾随逗号。例如,可以执行如下查询:INSERT INTO test (a, b, c) VALUES (4, 5, 6,);#63810 (Alexey Milovidov).
  • 使 RabbitMQ 对损坏消息返回 nack。关闭 #45350#60312Kseniia Sumarokova)。
  • 修复在解析调试信息时发生的异步栈展开崩溃(例如使用采样查询分析器时)。此修复关闭了 #60460#60468Alexey Milovidov)。
  • 为 S3 错误 'no key' 在磁盘和存储场景中提供不同的错误消息。 #61108 (Sema Checherinda).
  • 进度条现在也适用于对 system.zerossystem.zeros_mt(此前已支持 system.numberssystem.numbers_mt)以及 generateRandom 表函数执行带 LIMIT 的简单查询。另外,如果记录总数大于 max_rows_to_read 限制,它会更早抛出异常。此更改关闭了 #58183#61823Alexey Milovidov)。
  • 在 YAML 配置中添加对 "Merge Key" 的支持(这是 YAML 的一个奇怪特性,请不用在意)。#62685 (Azat Khuzhin).
  • 当在 Replicated 源中使用非确定性函数时,改进错误信息。 #62896 (Grégoire Pineau).
  • 修复通过 remote 使用 Distributed over Distributed 时的 interserver secret 问题。 #63013 (Azat Khuzhin).
  • 为 YAML 文件新增对 include_from 的支持,但更推荐使用 config.d #63106 (Eduard Karacharov)。
  • 从 skim 建议中选择后,保留终端中先前的数据。 #63261 (FlameFactory).
  • 在 Pretty 系列格式或 visibleWidth 函数中,字段宽度现在会正确忽略 ANSI 转义序列。#63270 (Shaun Struwig)。
  • 在合适的情况下,将错误代码 NUMBER_OF_ARGUMENTS_DOESNT_MATCH 替换为更精确的错误代码。#63406Yohann Jardin)。
  • 现在在 clickhouse-client 中,用于命令行提示的查询会正确设置 os_userclient_hostname。从而关闭了 #63430#63433Alexey Milovidov)。
  • 如果 max_block_size 为零,则自动将其恢复为默认值。#63587Antonio Andelic)。
  • 向 trace_log 添加一个 build_id 的 ALIAS 列,以便在检测到二进制文件变更时自动重命名。此更改用于解决 #52086#63656Zimu Li)。
  • 为对象存储磁盘启用 truncate 操作。#63693MikhailBurdukov)。
  • 关键字列表的加载现在取决于服务器修订版本,并将在旧版 ClickHouse 服务器中被禁用。CC @azat。 #63786 (Nikita Mikhaylov)。
  • ClickHouse 磁盘必须读取服务器配置才能获取实际的元数据格式版本。#63831 (Sema Checherinda)。
  • 当 stdout 不是 TTY 时,取消美观输出格式的限制(output_format_pretty_max_rows/output_format_pretty_max_value_width)。#63942 (Azat Khuzhin)。
  • 现在在 AWS Lambda 中使用 ClickHouse 时,异常处理已能正常工作。作者:Alexey Coolnev#64014Alexey Milovidov)。
  • 当通过 HTTP 传入的压缩数据无效时,抛出 CANNOT_DECOMPRESS 而不是 CORRUPTED_DATA#64036 (vdimir)。
  • 在 Pretty 格式中针对单个大数值的提示现在也适用于 NullableLowCardinality。由此关闭了 #61993#64084Alexey Milovidov)。
  • 在基于索引的数据分片过滤相关位置添加指标、日志和线程名称。 #64130 (Alexey Milovidov).
  • ATTACH 时忽略 allow_suspicious_primary_key,并在 ALTER 时进行验证。#64202Azat Khuzhin)。

构建 / 测试 / 打包改进

错误修复

ClickHouse 版本 24.4,2024-04-30

升级说明

  • clickhouse-odbc-bridgeclickhouse-library-bridge 现在拆分为单独的包。已关闭 #61677#62114Alexey Milovidov)。
  • 不再允许将 max_parallel_replicas(用于实验性的副本并行读取)设置为 0,因为这没有意义。已关闭 #60140#61201Kruglov Pavel)。
  • 移除了对 INSERT WATCH 查询的支持(属于已弃用的 LIVE VIEW 功能的一部分)。#62382Alexey Milovidov)。
  • 移除了 optimize_monotonous_functions_in_order_by 设置。#63004Raúl Marín)。
  • Replicated 数据库引擎中移除了 experimental 标记。现在它处于 Beta 阶段。#62937Justin de Guzman)。

新功能

  • 支持递归 CTE。 #62074 (Maksim Kita).
  • 支持 QUALIFY 子句。修复 #47819#62619 (Maksim Kita).
  • 现在表引擎可以被授予权限,并且这不会影响现有用户的行为。#60117 (jsc0218).
  • 新增支持重写的 S3 磁盘,它支持 INSERT 操作且不需要在本地存储元数据。 #61116 (Julia Kartseva). 其主要用例是系统表。
  • 客户端在输入时的语法高亮现在在语法级别生效(之前在词法分析级别生效)。 #62123 (Alexey Milovidov).
  • 支持同时删除多个表,例如 DROP TABLE a, b, c#58705 (zhongyuankai).
  • 现在支持通过 ALTER MODIFY SETTING 修改 memory 表的设置。例如:ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;#62039 (zhongyuankai).
  • 在 HTTP 接口中新增 role 查询参数。其工作方式类似于 SET ROLE x,会在语句执行前应用角色。这样可以克服 HTTP 接口的限制,因为其不允许多个语句,无法同时发送 SET ROLE x 和语句本身。可以通过这种方式设置多个角色,例如 ?role=x&role=y,等价于 SET ROLE x, y#62669 (Serge Klochkov).
  • 新增 SYSTEM UNLOAD PRIMARY KEY,用于释放表主键的内存占用。 #62738 (Pablo Marcos).
  • system.text_log 添加了 value1value2、...、value10 列。这些列包含用于格式化消息的值。 #59619 (Alexey Katsman).
  • 新增持久化虚拟列 _block_offset,用于存储在插入时分配的块中原始行号。可以通过 MergeTree 设置 enable_block_offset_column 启用 _block_offset 列的持久化。新增虚拟列 _part_data_version,其中包含 part 的最小块号或 mutation 版本。持久化虚拟列 _block_number 不再被视为实验特性。 #60676 (Anton Popov).
  • 新增设置 input_format_json_throw_on_bad_escape_sequence,禁用该设置可以在 JSON 输入格式中保留错误的转义序列。 #61889 (Kruglov Pavel).

性能优化

  • 基于等价集改进 JOIN 过滤下推。 #61216 (Maksim Kita).
  • 如果在 JOIN 之后的过滤条件总是过滤掉默认值,则会将 OUTER JOIN 优化为 INNER JOIN。该优化可通过设置 query_plan_convert_outer_join_to_inner_join 来控制,默认启用。#62907Maksim Kita)。
  • 对 AWS S3 的改进。客户端必须向服务器发送 Keep-Alive: timeout=X 头部。如果客户端从服务器接收到带有该头部的响应,则必须使用服务器返回的值。另外,为了避免因连接关闭竞态条件导致的问题,客户端最好不要使用即将过期的连接。 #62249 (Sema Checherinda).
  • 降低变更操作对 SELECT 的开销(v2)。 #60856 (Azat Khuzhin).
  • PODArray 中更频繁调用的函数现在被强制内联。#61144李扬)。
  • 在读取完所有所需列后跳过对象的剩余部分,从而加速 JSON 解析。#62210 (lgbo).
  • 改进使用 file/s3/hdfs/url/... 表函数从文件执行的简单 INSERT SELECT 操作。新增独立的 max_parsing_threads 设置项,用于控制并行解析时使用的线程数量。#62404 (Kruglov Pavel).
  • 函数 to_utc_timestampfrom_utc_timestamp 的执行速度现在提升了约 2 倍。#62583KevinyhZou)。
  • 当输入值大多无法解析时,函数 parseDateTimeOrNullparseDateTimeOrZeroparseDateTimeInJodaSyntaxOrNullparseDateTimeInJodaSyntaxOrZero 的运行速度现在显著提升(提高 10 到 1000 倍)。#62634LiuNeng)。
  • system.query_cache 中包含大量条目(例如超过 100,000 条)时,对其执行的 SELECT 查询现在会明显更快。#62671Robert Schulze)。
  • 减少文件系统缓存争用(第 3 部分):在尝试预留空间时,无锁执行文件系统删除操作。 #61163 (Kseniia Sumarokova).
  • 加速文件系统缓存大小的动态调整。 #61723 (Kseniia Sumarokova).
  • 带有 INVALIDATE_QUERY 的字典源在启动时不再被重新加载两次。#62050 (vdimir)。
  • 修复了一个问题:当在涉及主键的布尔表达式后添加多余的 = 1= 0 时,主键索引不会被使用。例如,SELECT * FROM <table> WHERE <primary-key> IN (<value>) = 1SELECT * FROM <table> WHERE <primary-key> NOT IN (<value>) = 0 都会进行全表扫描,而本可以使用主键索引。#62142 (josh-hildred)。
  • system.remote_data_paths 返回数据块流,而不是将整个结果累积为一个大块。这样可以减少内存使用、显示中间进度并允许取消查询。#62613 (Alexander Gololobov)。

实验特性

  • 通过设置 azure_allow_parallel_part_upload,支持 Azure Blob Storage 的并行写入缓冲。#62534 (SmitaRKulkarni).
  • 用户态页缓存现在可以与静态 Web 存储(disk(type = web))一起使用。通过将客户端设置 use_page_cache_for_disks_without_file_cache 设为 1 来启用。#61911 (Michael Kolupaev).
  • Variant 类型中,不再将 Bool 和数值分支视为可疑。#61999 (Kruglov Pavel).
  • 通过解析实现从 String 到 Variant 的更优转换。#62005 (Kruglov Pavel).
  • 在 JSONExtract 函数中支持 Variant#62014 (Kruglov Pavel).
  • 将类型 Variant 标记为可比较类型,以便可以在主键中使用。#62693 (Kruglov Pavel).

改进

  • 为方便起见,SELECT * FROM numbers() 将与 SELECT * FROM system.numbers 以相同方式工作——不会有任何限制。#61969YenchangChan)。
  • 为 Kafka 配置引入独立的 consumer/producer 标签。这样可以避免来自 librdkafka(一个有很多 bug 的质量较差的 C 库)的警告,即为 producer 实例指定了 consumer 属性,反之亦然(例如 Configuration property session.timeout.ms is a consumer property and will be ignored by this producer instance)。关闭问题:#58983#58956Aleksandr Musorin)。
  • 函数 date_diffage 现在以纳秒级而非微秒级精度计算结果。它们现在还为参数 unit 提供 nanosecond(或 nanosecondsns)作为可选值。#61409 (Austin Kothig)。
  • date_trunc 新增了纳秒、微秒和毫秒单位。 #62335 (Misz606).
  • 在重新加载证书时同时重新加载证书链。 #61671 (Pervakov Grigorii).
  • 通过在该副本路径存在活动副本时禁止附加表,来尝试防止错误 #60432#61876Arthur Passos)。
  • clickhouse-local 添加对 input 的支持。 #61923 (Azat Khuzhin).
  • 严格性为 ANYJoin 表引擎在重新加载后保持一致性。当插入多行具有相同键的记录时,第一行将具有更高优先级(之前是在表加载时随机选择其中一行)。修复 #51027#61972vdimir)。
  • 根据 Apache Arrow 模式自动推断 Nullable 列类型。#61984 (Maksim Kita)。
  • 支持在聚合过程中取消聚合状态的并行合并。例如:uniqExact#61992 (Maksim Kita)。
  • 使用 system.keywords 来填充这些建议,并在所有内部位置统一使用它们。#62000Nikita Mikhaylov)。
  • ReplicatedMergeTreeOPTIMIZE FINAL 现在会等待当前正在进行的合并完成,然后重试调度最终合并。这样会使其行为与普通的 MergeTree 更加一致。#62067 (Nikita Taranov)。
  • 在从 Hive 文本文件读取数据时,会使用该 Hive 文本文件的第一行来确定输入字段的数量。有时第一行的字段数量与 Hive 表的定义不匹配,例如 Hive 表被定义为有 3 列,如 test_tbl(a Int32, b Int32, c Int32),但文本文件的第一行只有 2 个字段。在这种情况下,输入字段的数量会被确定为 2,如果文本文件的下一行有 3 个字段,那么第三个字段将不会被读取,而是被设置为默认值 0,这并不正确。#62086KevinyhZou)。
  • CREATE AS 语句会复制表的注释。 #62117 (Pablo Marcos)。
  • 为 zookeeper 表添加查询进度信息。 #62152 (JackyWoo).
  • 新增在服务器范围内启用 trace collector(Real 和 CPU)的功能。 #62189 (alesapin).
  • 新增设置项 lightweight_deletes_sync(默认值:2 —— 同步等待所有副本)。它类似于设置项 mutations_sync,但只影响轻量级删除的行为。#62195 (Anton Popov).
  • 在为自定义设置解析值时,区分布尔值和整数:SET custom_a = true; SET custom_b = 1;#62206Vitaly Baranov)。
  • 通过 AWS PrivateLink 接口端点支持访问 S3。解决了 #60021#31074#53761#62208Arthur Passos)。
  • 不要在 clickhouse-client 中为 UDF 创建不存在的目录。此更改修复了 #59597#62366Alexey Milovidov)。
  • 查询缓存现在不再缓存对系统表(system.*information_schema.*INFORMATION_SCHEMA.*)的查询结果。#62376Robert Schulze)。
  • MOVE PARTITION TO TABLE 查询可以被延迟执行,或者抛出 TOO_MANY_PARTS 异常,以避免超出数据片段数量限制。与 INSERT 查询使用相同的设置和限制(参见 max_parts_in_totalparts_to_delay_insertparts_to_throw_insertinactive_parts_to_throw_insertinactive_parts_to_delay_insertmax_avg_part_size_for_too_many_partsmin_delay_to_insert_msmax_delay_to_insert 设置)。 #62420 (Sergei Trifonov).
  • 在 macOS 上将默认安装目录从 /usr/bin 更改为 /usr/local/bin。这是必要的,因为自 macOS El Capitan(2015)起引入的 Apple 系统完整性保护功能(System Integrity Protection)会阻止向 /usr/bin 写入内容,即使使用 sudo 也不行。#62489 (haohang)。
  • 让 transform 始终返回第一个匹配结果。#62518 (Raúl Marín)。
  • 为系统表 blob_storage_log 添加了缺失的 hostname 列。#62456 (Jayme Bird)。
  • 为了与其他系统表保持一致,system.backup_log 现在包含一列 event_time#62541 (Jayme Bird).
  • system.backup_log 现在具有默认排序键 event_date, event_time,与其他 _log 表引擎相同。#62667Nikita Mikhaylov)。
  • 避免在执行 RESTORE 时对表的 DEFAULT 表达式进行求值。 #62601 (Vitaly Baranov).
  • S3 存储和备份也需要与 S3 磁盘相同的默认 keep-alive 设置。#62648 (Sema Checherinda)。
  • 将以 Bug 众多而臭名昭著的 C 库 librdkafka 的客户端标识符添加到日志消息中,以便区分同一张表中来自不同消费者的日志消息。#62813 (János Benjamin Antal)。
  • 在 Replicated 数据库的 ZooKeeper 路径中允许使用特殊宏 {uuid}{database}#62818 (Vitaly Baranov).
  • 允许在 HTTP 请求中为不同的身份验证方案使用配额键。#62842Kseniia Sumarokova)。
  • 降低 clickhouse clientclickhouse local 中命令行参数 --help 的输出详细程度。此前的输出现在可通过 --help --verbose 生成。#62973 (Yarik Briukhovetskyi).
  • log_bin_use_v1_row_events 在 MySQL 8.3 中被移除,我们针对此对实验性的 MaterializedMySQL 引擎进行了调整 #60479#63101Eugene Klimov)。作者:Nikolay Yankin。

构建/测试/打包改进

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

ClickHouse 24.3 LTS 版本,2024-03-27

升级注意事项

  • allow_experimental_analyzer 设置默认启用,它会将查询分析切换为新的实现方式,该实现具有更好的兼容性和更完备的功能。功能 “analyzer” 现被视为 beta,而非 experimental。你可以通过将 compatibility 设置为 24.2,或禁用 allow_experimental_analyzer 设置来恢复旧行为。在 YouTube 上观看视频
  • ClickHouse 的 String 数据类型通常用于存储 UTF-8 编码的数据,但也允许任意二进制数据。Parquet/ORC/Arrow 中的 String 类型仅支持 UTF-8。这就是为何在为 ClickHouse 的 String 数据类型选择 Arrow 数据类型时,可以在 StringBinary 之间进行选择。这由设置 output_format_parquet_string_as_stringoutput_format_orc_string_as_stringoutput_format_arrow_string_as_string 控制。尽管从语义和兼容性上看,使用 Binary 更为严谨,但在大多数情况下,默认使用 String 更符合用户预期。
  • 在新版本的 ClickHouse 中,当所有参数都是 Float64 时,函数 geoDistancegreatCircleDistancegreatCircleAngle 在内部计算以及返回类型上都将使用 64 位双精度浮点数据类型。这解决了 #58476。在之前的版本中,这些函数始终使用 Float32。可以通过将 geo_distance_returns_float64_on_float64_arguments 设为 false,或将 compatibility 设为 24.2 或更早版本,来切换回旧的行为方式。#61848Alexey Milovidov)。与 Geet Patel 共同完成。
  • 自 23.5 版本起,已废弃的内存数据分片(in-memory data parts)被标记为弃用,并且自 23.10 版本起不再受支持。现在,剩余的相关代码已被移除。这是对 #55186#45409 的后续工作。你很可能并未使用过内存数据分片,因为它们仅在 23.5 版本之前可用,并且只有在你为某个 MergeTree 表手动指定相应 SETTINGS 时才会启用。要检查是否存在内存数据分片,请运行以下查询:SELECT part_type, count() FROM system.parts GROUP BY part_type ORDER BY part_type。要禁用内存数据分片的使用,请执行:ALTER TABLE ... MODIFY SETTING min_bytes_for_compact_part = DEFAULT, min_rows_for_compact_part = DEFAULT。在从旧版 ClickHouse 升级之前,请先检查是否仍存在内存数据分片。如果存在内存数据分片,先禁用其使用,然后等待直到不再有内存数据分片,再继续升级。#61127Alexey Milovidov)。
  • system.zookeeper 表中将列名从 duration_ms 更改为 duration_microseconds,以反映该持续时间实际上是微秒级分辨率。#60774Duc Canh Le)。
  • 当查询级别设置 async_insertdeduplicate_blocks_in_dependent_materialized_views 同时启用时,拒绝接收传入的 INSERT 查询。此行为由设置 throw_if_deduplication_in_dependent_materialized_views_enabled_with_async_insert 控制,且默认开启。这是对 https://github.com/ClickHouse/ClickHouse/pull/59699 的延续,用于解除对 https://github.com/ClickHouse/ClickHouse/pull/59915 的阻塞。#60888Nikita Mikhaylov)。
  • 实用工具 clickhouse-copier 已移至 GitHub 上的独立仓库:https://github.com/ClickHouse/copier。它不再包含在发行版中,但仍可单独下载。据此关闭:#60734 据此关闭:#60540 据此关闭:#60250 据此关闭:#52917 据此关闭:#51140 据此关闭:#47517 据此关闭:#47189 据此关闭:#46598 据此关闭:#40257 据此关闭:#36504 据此关闭:#35485 据此关闭:#33702 据此关闭:#26702
  • 为了提高与 MySQL 的兼容性,兼容性别名 locate 现在默认接受参数 (needle, haystack[, start_pos])。可以通过将 function_locate_has_mysql_compatible_argument_order 设置为 0 来恢复之前的行为 (haystack, needle[, start_pos])#61092Robert Schulze)。
  • 默认禁止在 MergeTree 表的 ORDER BY 中使用 SimpleAggregateFunction(与禁止 AggregateFunction 的情况类似,它们之所以被禁止,是因为不可比较),可通过 allow_suspicious_primary_key 选项放宽限制以允许使用。 #61399 (Azat Khuzhin).
  • Ordinary 数据库引擎已弃用。如果服务器正在使用该引擎,clickhouse-client 中会显示警告。这一变更关闭了 #52229#56942shabroo)。

新功能

  • 支持以 tar 格式读写备份(除了现有的 zip 之外)。#59535 (josh-hildred).
  • 实现对 S3 Express 存储桶的支持。#59965 (Nikita Taranov).
  • 允许从不同的磁盘附加数据分片(使用复制而不是硬链接)。#60112 (Unalian).
  • 具有大小上限的 Memory 表:通过其设置 min_bytes_to_keep, max_bytes_to_keep, min_rows_to_keepmax_rows_to_keep 来控制。#60612 (Jake Bamrah).
  • 将等待中的查询和执行中的查询的限制分开。新增服务器设置 max_waiting_queries,用于限制由于 async_load_databases 而处于等待状态的查询数量。现有的执行中查询数量限制不再统计等待中的查询。#61053 (Sergei Trifonov).
  • 新增表 system.keywords,其中包含解析器中的所有关键字,主要用于更好的模糊测试(fuzzing)和语法高亮。#51808 (Nikita Mikhaylov).
  • 增加对 ATTACH PARTITION ALL 的支持。#61107 (Kirill Nikiforov).
  • 新增函数 getClientHTTPHeader。修复了 #54665,与 @lingtaolf 共同完成。#61820 (Alexey Milovidov).
  • generate_series 作为一个表函数添加(对 PostgreSQL 的兼容别名,对应已有的 numbers 函数)。该函数生成一个包含自然数等差数列的表。#59390 (divanik).
  • topK/topkWeighed 增加一种模式,该模式返回各值的计数及其误差。#54508 (UnamedRus).
  • 新增函数 toMillisecond,用于返回 DateTimeDateTime64 类型值的毫秒部分。#60281 (Shaun Struwig).
  • 允许为 clickhouse-server 配置 HTTP 重定向处理器。例如,可以将 / 重定向到 Play UI。#60390 (Alexey Milovidov).

性能优化

  • 优化了函数 dotProduct,以避免不必要且代价高昂的内存拷贝。 #60928 (Robert Schulze)。
  • 256 位整数的输出速度提升了 30 倍。#61100Raúl Marín)。
  • 如果表的主键包含大量无用的列,就不要把这些列保留在内存中。这个行为由一个新的设置 primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns 控制,默认值为 0.9,这意味着:对于复合主键,如果某一列在至少 90% 的情况下其取值都会发生变化,则其后的列将不会被加载到内存中。#60255Alexey Milovidov)。
  • 在涉及多个 Nullable 列的场景下,提升序列化的聚合方法的性能。#55809 (Amos Bird).
  • 延迟生成 JSON 输出,以提升 ALL JOIN 的性能。 #58278 (LiuNeng).
  • 使与外部服务(例如 AWS S3)的 HTTP/HTTPS 连接在所有场景中都可复用,即使响应为 3xx 或 4xx 时仍然如此。#58845Sema Checherinda)。
  • 对聚合函数 argMin / argMax / any / anyLast / anyHeavy 以及 ORDER BY {u8/u16/u32/u64/i8/i16/u32/i64) LIMIT 1 查询进行了优化。#58640Raúl Marín)。
  • 对列过滤器进行简单优化,在部分情况下可将峰值内存降低至原来的 44%。 #59698 (李扬).
  • 当结果类型的基础类型为数值类型时,以列式方式执行 multiIf 函数。#60384 (李扬).
  • 更快的互斥锁(几乎快 2 倍)。 #60823 (Azat Khuzhin).
  • 在分布式查询结束时并行清理多个连接。#60845 (lizhuoyu5).
  • 优化 Nullable 数值列或 Nullable 字符串列之间的数据移动,从而提升了一些微基准测试的性能。#60846 (李扬)。
  • 对文件系统缓存的操作受到锁竞争影响会更小。#61066 (Alexey Milovidov).
  • 通过阻止编译器产生错误优化来改进 array join 和其他 JOIN 的性能。关闭 #61074#61075李扬)。
  • 如果一个带有语法错误的查询中包含使用正则表达式的 COLUMNS 匹配器,那么在解析器回溯时每次都会重新编译该正则表达式,而不是只编译一次。这是一个根本性错误。编译后的正则表达式被放入 AST 中。但 AST 中的字母 A 表示 “abstract”(抽象),这意味着它不应包含重量级对象。AST 的部分节点在解析过程中会被不断创建和丢弃,包括在大量回溯的情况下。这样会导致解析端变慢,从而使只读用户也可以发起 DoS 攻击。但主要问题在于,它会阻碍模糊测试工具(fuzzer)的进展。#61543Alexey Milovidov)。
  • 添加一个新的 analyzer pass,在单值场景下优化 IN 运算符。#61564LiuNeng)。
  • DNSResolver 会对解析得到的 IP 集合进行乱序,以便更均匀地利用 AWS S3 的多个端点。 #60965 (Sema Checherinda).

实验性特性

  • 支持对 Azure Blob Storage 进行并行读取。这提升了实验性 Azure 对象存储的性能。#61503 (SmitaRKulkarni)。
  • 为 Azure Blob Storage 添加类似于 S3 的异步 WriteBuffer。这提升了实验性 Azure 对象存储的性能。#59929 (SmitaRKulkarni)。
  • 在使用 Azure Blob Storage 时,对备份 I/O 使用托管身份。新增一个设置,用于阻止 ClickHouse 尝试创建不存在的容器,因为这需要存储账户级别的权限。#61785 (Daniel Pozo Escalona)。
  • 新增设置 parallel_replicas_allow_in_with_subquery = 1,允许在使用并行副本时,IN 子句中使用子查询。#60950 (Nikolai Kochetov)。
  • 针对“zero-copy”复制的变更:当表被删除时,与该表相关的所有 zero-copy 锁都必须被释放,包含这些锁的目录也必须被删除。#57575 (Sema Checherinda)。

改进

  • MergeTree 用作默认的表引擎。#60524 (Alexey Milovidov)
  • 默认启用 output_format_pretty_row_numbers。这有助于提升可用性。 #61791 (Alexey Milovidov).
  • 在之前的版本中,某些 Pretty 格式中的数字还不够“美观”。#61794Alexey Milovidov)。
  • 在 Pretty 格式中,如果结果集中只有一个值,那么这个较长的值将不会被截断,例如 SHOW CREATE TABLE 查询的结果。#61795 (Alexey Milovidov)。
  • clickhouse-local 类似,clickhouse-client 也会接受 --output-format 选项,将其视为 --format 选项的同义形式。此更改关闭了 #59848#61797Alexey Milovidov)。
  • 如果 stdout 指向终端且未指定输出格式,clickhouse-client 和类似工具将默认使用 PrettyCompact,与交互模式相同。clickhouse-clientclickhouse-local 将以统一方式处理用于输入和输出格式的命令行参数。此更改解决了 #61272#61800Alexey Milovidov)。
  • 在 Pretty 格式中使用下划线分隔数字分组,以提高可读性。该行为由一个新的设置项 output_format_pretty_highlight_digit_groups 控制。#61802Alexey Milovidov)。
  • 支持通过 SYSTEM FLUSH DISTRIBUTED 覆盖初始 INSERT 设置。#61832 (Azat Khuzhin).
  • 默认启用处理器性能分析(针对排序、聚合等操作记录耗时以及输入/输出字节数)。 #61096 (Azat Khuzhin).
  • Filesystem 数据库现已支持不带格式扩展名的文件。 #60795 (Kruglov Pavel).
  • 将所有格式名称改为大小写不敏感,例如 Tsv、TSV、tsv,甚至 rowbinary。 #60420 (豪肥肥)。如果你能继续使用规范写法,我会非常感激,例如写成 JSON 😇,而不是 Json 🤮,不过如果你按自己喜欢的方式拼写,我们也不介意。
  • distributed_ddl_output_mode 设置中新增 none_only_active 模式。#60340 (Alexander Tokmakov)。
  • 高级仪表板略微改进了多线图的配色效果。#60391Alexey Milovidov)。
  • 现在,高级仪表盘在滚动时控件始终可见。这样你就可以在不向上滚动的情况下添加新图表。#60692 (Alexey Milovidov).
  • 在对物化视图运行 MODIFY COLUMN 查询时,检查内部表的结构,确保所有列都存在。#47427 (sunny)。
  • String 类型和 Enum 可以在同一上下文中使用,例如数组、UNION 查询和条件表达式。此变更关闭了 #60726#60727Alexey Milovidov)。
  • 允许在用于查询处理的外部数据结构中声明 Enum 枚举类型(这是一个可供查询使用的即时临时表)。#57857 (Duc Canh Le)。
  • 在选择要合并的部分时,将轻量级删除的行纳入考虑,从而更准确地估算合并后部分的磁盘大小。#58223 (Zhuo Qiu).
  • 为更多系统表的列添加了注释,是对 https://github.com/ClickHouse/ClickHouse/pull/58356 的后续。#59016Nikita Mikhaylov)。
  • 现在我们可以在 PREWHERE 中使用虚拟列了,这对于 _part_offset 这类非常量虚拟列尤其有意义。#59033 (Amos Bird)。改进了虚拟列的整体易用性。现在允许在 PREWHERE 中使用虚拟列(对于 _part_offset 这类非常量虚拟列来说尤其有用)。同时还为虚拟列提供了内置文档:在启用 describe_include_virtual_columns 设置时,可以在 DESCRIBE 查询中以列注释的形式查看。#60205 (Anton Popov)。
  • 对象存储不再使用固定密钥,而是改为生成密钥,用于判断是否具备删除对象的能力。#59495 (Sema Checherinda).
  • 允许使用 "local" 作为对象存储类型,而不是 "local_blob_storage"。#60165 (Kseniia Sumarokova).
  • 在执行 DETACH / 服务器关闭以及执行 SYSTEM FLUSH DISTRIBUTED 时,对 Distributed 引擎中挂起的 INSERT 数据块进行并行刷新(只有当表配置了多磁盘策略时,并行才会生效,这与当前 Distributed 引擎中的所有内容类似)。 #60225 (Azat Khuzhin).
  • 添加一个设置,用于在合并时强制使用读通缓存(read-through cache)。 #60308 (Kseniia Sumarokova).
  • 对 MySQL 兼容协议的改进。Issue #57598 提到了在事务处理方面存在的行为差异:当没有活动事务时执行的 COMMIT/ROLLBACK 会被报错,这与 MySQL 的行为不同。#60338PapaToemmsn)。
  • 函数 substring 新增了别名 byteSlice#60494 (Robert Schulze)。
  • 将服务器设置项 dns_cache_max_size 重命名为 dns_cache_max_entries 以减少歧义。#60500 (Kirill Nikiforov)。
  • SHOW INDEX | INDEXES | INDICES | KEYS 不再按主键列排序(因为这在直觉上不太合理)。#60514 (Robert Schulze)。
  • Keeper 改进:在启动过程中如果检测到无效快照则中止启动,以避免数据丢失。#60537 (Antonio Andelic)。
  • 将 tzdata 更新至 2024a 版本。 #60768 (Raúl Marín).
  • Keeper 改进:在 Keeper 的配置中支持 leadership_expiry_ms#60806 (Brokenice0415).
  • 无论 input_format_try_infer_exponent_floats 设置为何值,在 JSON 格式中始终推断指数形式的数字。新增设置 input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects,用于在根据 JSON 对象推断命名 Tuple 时,对存在歧义的路径使用 String 类型,而不是抛出异常。 #60808 (Kruglov Pavel).
  • 新增对 MySQL 中常用的 START TRANSACTION 语法的支持,解决 https://github.com/ClickHouse/ClickHouse/discussions/60865#60886Zach Naimon)。
  • 为全排序 merge join 算法添加一个开关,用于将 null 视为最大或最小值,从而使其行为可以与其他 SQL 系统(例如 Apache Spark)兼容。#60896 (loudongfeng)。
  • 支持在 clickhouse-clientclickhouse-local 中根据文件扩展名自动检测输出格式。#61036 (豪肥肥)。
  • 当 Linux 的 cgroups 值发生变化时,运行时更新内存限制。#61049 (Han Fei).
  • 添加之前因疏忽遗漏的函数 toUInt128OrZero(该错误与 https://github.com/ClickHouse/ClickHouse/pull/945 相关)。兼容性别名 FROM_UNIXTIMEDATE_FORMAT(它们不是 ClickHouse 原生函数,仅用于 MySQL 兼容性)已改为大小写不敏感,以符合 SQL 兼容性别名的预期行为。#61114Alexey Milovidov)。
  • 改进了访问检查逻辑,现在即使目标用户既不实际持有某些权限,也没有相应的授予权限,也允许撤销这些权限。例如:GRANT SELECT ON *.* TO user1; REVOKE SELECT ON system.* FROM user1;#61115pufit)。
  • 修复 has() 函数在处理 Nullable 列时的问题(修复 #60214)。#61249Mikhail Koviazin)。
  • 现在,在针对子树 <include from_zk="/path" merge="true"> 的配置替换中,可以指定属性 merge="true"。如果指定了该属性,ClickHouse 将把该子树与现有配置进行合并;否则,默认行为是将新内容追加到配置中。#61299 (alesapin)。
  • 为虚拟内存映射添加了异步指标:VMMaxMapCountVMNumMaps。解决了 #60662 中的问题。 #61354Tuan Pham Anh)。
  • 在所有需要创建临时数据的场景中使用 temporary_files_codec 配置项,例如外部内存排序和外部内存 GROUP BY。此前它仅在 partial_merge JOIN 算法中生效。#61456 (Maksim Kita)。
  • 新增配置项 max_parser_backtracks,用于限制查询解析的复杂度。 #61502 (Alexey Milovidov).
  • 在动态调整文件系统缓存大小期间的争用更少。#61524 (Kseniia Sumarokova).
  • 不再允许使用 StorageS3 queue 的分片模式,该部分即将被重写。 #61537 (Kseniia Sumarokova).
  • 修复拼写错误:将 use_leagcy_max_level 更正为 use_legacy_max_level#61545 (William Schoeffel)。
  • 删除 system.blob_storage_log 中的一些重复条目。 #61622 (YenchangChan).
  • 添加了 current_user 函数,作为与 MySQL 兼容的别名。#61770Yarik Briukhovetskyi)。
  • 修复在混合 x86-64 / ARM 集群中浮点数聚合函数状态不一致的问题 #60610 (Harry Lee)。

构建 / 测试 / 打包改进

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

ClickHouse 发布 24.2,2024-02-29

不向后兼容的变更

  • 在嵌套类型中校验可疑/实验性类型。此前我们不会在 Array/Tuple/Map 等嵌套类型中校验这类类型(JSON 除外)。#59385 (Kruglov Pavel).
  • 为线程数和数据块大小添加合理性检查(sanity check)。#60138 (Raúl Marín).
  • 默认情况下不再推断指数表示法中的浮点数。新增设置 input_format_try_infer_exponent_floats,启用后将恢复之前的行为(默认禁用)。修复 #59476#59500 (Kruglov Pavel).
  • 允许在 ALTER 操作周围添加括号。是否输出括号可以通过 format_alter_operations_with_parentheses 配置进行控制。默认情况下,在格式化查询中会输出括号,因为我们在某些地方将格式化后的 ALTER 操作作为元数据存储(例如:mutations)。新的语法能澄清某些以 ALTER 操作列表结尾的查询。例如:ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c 在旧语法下无法被正确解析。在新语法中,查询 ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c) 更为清晰。旧版本无法读取这种新语法,因此在同一集群中混用新旧版本 ClickHouse 时,使用新语法可能会导致问题。#59532 (János Benjamin Antal).
  • 修复了物化视图的安全问题,该问题允许用户在没有所需授权的情况下向表中插入数据。修复现在会验证用户不仅有向物化视图插入的权限,还必须对所有底层表拥有插入权限。这意味着,一些之前可以运行的查询现在可能会因 Not enough privileges 而失败。为了解决这一问题,本次发布为视图引入了 SQL 安全性的新特性:https://clickhouse.com/docs/sql-reference/statements/create/view#sql_security。[#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) #60439 (pufit).

新功能

  • 新增语法,可在视图/物化视图中指定 DEFINER 用户。这样就可以在未对底层表进行显式授权的情况下,通过视图执行 SELECT/INSERT 操作,从而由视图来承载这些权限。#54901 #60439 (pufit)。
  • file/s3/hdfs/url/azureBlobStorage 引擎中,如果文件格式未知,则尝试在 schema 推断阶段自动检测文件格式。关闭 #50576#59092Kruglov Pavel)。
  • 实现异步插入超时时间的自动调整。引入了以下设置:async_insert_poll_timeout_ms、async_insert_use_adaptive_busy_timeout、async_insert_busy_timeout_min_ms、async_insert_busy_timeout_max_ms、async_insert_busy_timeout_increase_rate、async_insert_busy_timeout_decrease_rate。 #58486 (Julia Kartseva)。
  • 支持为最大连续登录失败次数设置配额。#54737 (Alexey Gerasimchuck)。
  • 新增聚合函数 groupArrayIntersect。为 #49862 的后续工作。#59598Yarik Briukhovetskyi)。
  • 新增对 AzureBlobStorage 的备份与恢复支持。解决了 #50747#56988SmitaRKulkarni)。
  • 现在,用户可以在查询中直接使用 format_schema_rows_template 指定模板字符串,作为 format_template_row 的替代。修复了 #31363#59088Shaun Struwig)。
  • 实现了将不同类型的 MergeTree 表自动转换为 Replicated 表引擎。只需在表的数据目录(/clickhouse/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/)中创建一个空的 convert_to_replicated 文件,该表将在下次服务器启动时自动转换。#57798 (Kirill)。
  • 新增了查询语句 ALTER TABLE table FORGET PARTITION partition,用于删除空分区对应的 ZooKeeper 节点。#59507Sergei Trifonov)。这是一个专家级功能。
  • 在 NATS 表引擎中支持使用 JWT 凭证文件。#59543 (Nickolaj Jepsen).
  • 实现了 system.dns_cache 表,可用于排查 DNS 问题。#59856 (Kirill Nikiforov)。
  • 编解码器 LZ4HC 将支持新的压缩级别 2,它比此前的最小压缩级别 3 更快,但压缩率会有所降低。在之前的版本中,LZ4HC(2) 及更低级别都等同于 LZ4HC(3)。作者:Cyan4973#60090Alexey Milovidov)。
  • 实现了 system.dns_cache 表,可用于调试 DNS 问题。新增服务器设置项 dns_cache_max_size。#60257Kirill Nikiforov)。
  • merge 表函数增加对单参数版本的支持,形式为 merge(['db_name', ] 'tables_regexp')#60372豪肥肥)。
  • 支持负位置参数。关闭 #57736#58292flynn)。
  • 在配置中针对特定的 S3 设置,支持通过 user 键指定允许的用户集合。#60144 (Antonio Andelic).
  • 新增了表函数 mergeTreeIndex。它用于表示 MergeTree 表的索引文件和 marks 文件的内容,可用于自省。语法:mergeTreeIndex(database, table, [with_marks = true]),其中 database.table 是使用 MergeTree 引擎的现有表。#58140Anton Popov)。

实验特性

  • 添加了函数 seriesOutliersDetectTukey,用于使用 Tukey's fences 算法检测序列数据中的异常值。 #58632 (Bhavna Jindal)。请注意,该行为将在下一个补丁版本中发生变化。
  • 添加函数 variantType,为每一行返回带有变体类型名称的 Enum。 #59398 (Kruglov Pavel)。
  • 为并行副本(仅在使用 analyzer 时)支持 LEFT JOINALL INNER JOIN 和简单子查询。新增设置项 parallel_replicas_prefer_local_join,用于在本地 JOIN 执行(默认)与 GLOBAL JOIN 之间进行选择。cluster_for_parallel_replicas 中的每个副本上都必须存在所有表。新增设置项 min_external_table_block_size_rowsmin_external_table_block_size_bytes,用于合并发送到临时表的小数据块(仅在使用 analyzer 时)。 #58916 (Nikolai Kochetov)。
  • 允许在向 Replicated 数据库添加或恢复新副本期间并发创建表。 #59277 (Konstantin Bogdanov)。
  • Variant 值实现比较运算符,并实现将字段正确插入到 Variant 列中。默认情况下,不允许创建包含相似变体类型的 Variant 类型(可通过设置 allow_suspicious_variant_types 允许)。修复 #59996。修复 #59850#60198 (Kruglov Pavel)。
  • 禁用在未使用 analyzer 时并行副本与 CTE 的 JOIN。 #59239 (Raúl Marín)。

性能优化

  • 主键将占用更少内存。#60049 (Alexey Milovidov).
  • 优化主键及部分其他操作的内存使用。 #60050 (Alexey Milovidov)。
  • 表的主键会在首次访问时按需(惰性)加载到内存中。这由新的 MergeTree 设置 primary_key_lazy_load 控制,默认启用。这样带来了一些优势:- 不会为未使用的表加载主键;- 如果内存不足,会在首次使用时抛出异常,而不是在服务器启动时抛出。但这也有一些劣势:- 加载主键的延迟会在第一条查询时才发生,而不是在接受连接之前;从理论上讲,这可能会引入“羊群效应”(thundering-herd)问题。此更改关闭了 #11188#60093Alexey Milovidov)。
  • 用于向量搜索的向量化距离函数。#58866 (Robert Schulze)。
  • 适用于向量搜索的向量化函数 dotProduct#60202 (Robert Schulze).
  • dictGetOrDefault 函数添加短路特性。关闭 #52098#57767jsc0218)。
  • Keeper 改进:在内存中仅缓存由 latest_logs_cache_size_thresholdcommit_logs_cache_size_threshold 控制的一定数量的日志。#59460 (Antonio Andelic).
  • Keeper 改进:进一步减小数据节点的大小。 #59592 (Antonio Andelic).
  • 继续优化在结果类型为 Float*/Decimal*/*Int*if 函数的分支未命中,承接 https://github.com/ClickHouse/ClickHouse/pull/57885#59148李扬)。
  • 当输入类型为 Map 时,对 if 函数进行了优化,性能提升最高可达约 10 倍。#59413 (李扬)。
  • 通过实现严格别名规则来提升 Int8 类型的性能(我们已经在 UInt8 和所有其他整数类型上实现了该规则)。#59485Raúl Marín)。
  • 通过减少分支预测失败,有条件地优化 bigint 和大十进制类型上的 sum/avg 性能。 #59504 (李扬).
  • 在存在正在执行的 mutation 时提升 SELECT 的性能。#59531Azat Khuzhin)。
  • 使用 AVX2 优化了函数 isNotNull#59621 (李扬)。
  • 改进针对已排序或近乎有序数据的 ASOF JOIN 性能。#59731Maksim Kita)。
  • 之前 async_insert_max_data_size 的默认值为 1 MB,事实证明该值过小。新的默认值将为 10 MiB。#59536 (Nikita Mikhaylov)。
  • 在执行 RESTORE 命令时,从备份中读取表元数据的过程支持使用多个线程。 #60040 (Vitaly Baranov)。
  • 现在如果 StorageBuffer 有多个分片(num_layers > 1),则会在多个线程中并行对所有分片执行后台刷新。#60111 (alesapin)。

改进

  • 当输出格式为 Pretty 且某个数据块只包含一个数值并且该数值超过一百万时,将在表格右侧显示一个更易读的数字。#60379 (rogeryk)。
  • 新增设置 split_parts_ranges_into_intersecting_and_non_intersecting_finalsplit_intersecting_parts_ranges_into_layers_final。这些设置可用于在带有 FINAL 的查询中禁用优化,主要用于调试。#59705 (Maksim Kita)。但实际上用途不止于此——在牺牲一定性能的前提下,它们还可以降低内存占用。
  • 将设置 extract_kvp_max_pairs_per_row 重命名为 extract_key_value_pairs_max_pairs_per_row。该问题(设置名称中的不必要缩写)是在 https://github.com/ClickHouse/ClickHouse/pull/43606 中引入的。修复此设置的文档。#59683Alexey Milovidov)。#59960jsc0218)。
  • 现在,在具有 DEFAULTMATERIALIZED 表达式的列上运行 ALTER COLUMN MATERIALIZE 时,将精确符合其语义。#58023Duc Canh Le)。
  • 为 mutation 过程中出现的错误启用了指数退避策略。这将降低 CPU 使用率、内存使用率以及日志文件大小。#58036 (MikhailBurdukov)。
  • 改进了对 InitialQuery Profile Event 的计数。#58195 (Unalian)。
  • 支持在 storage_configuration 中定义 volume_priority#58533 (Andrey Zvonov).
  • T64 编解码器添加对 Date32 类型的支持。#58738 (Hongbin Ma)。
  • 允许在包含多个元素的类型中使用尾随逗号。#59119 (Aleksandr Musorin)。
  • 现在可以在服务器配置文件中指定 Distributed 表引擎的设置(类似于 MergeTree 设置),例如 <distributed> <flush_on_detach>false</flush_on_detach> </distributed>#59291 (Azat Khuzhin).
  • 在读取 system.zookeeper 时对断开连接和会话过期进行重试处理。这在从 system.zookeeper 表中读取大量行时尤其有用,特别是在存在故障注入导致的断连情况下。#59388 (Alexander Gololobov)。
  • input_format_values_interpret_expressions=0 时,不再将带前导零的数字解析为八进制数。#59403 (Joanna Hulboj)。
  • 在启动时以及每当配置文件发生更更改时,ClickHouse 都会更新其总内存跟踪器的硬性内存上限。这些上限是基于各种服务器设置以及(在 Linux 上)cgroup 限制计算得出的。此前,对 /sys/fs/cgroup/memory.max(用于 cgroups v2)的设置是写死的。因此,为嵌套组(层级结构)配置的 cgroup v2 内存限制(例如 /sys/fs/cgroup/my/nested/group/memory.max)会被忽略。现在这一问题已经修复。v1 内存限制的行为保持不变。#59435Robert Schulze)。
  • 新增 profile events,用于观测在执行 INSERT 操作时计算 PK/投影/二级索引所耗费的时间。#59436 (Nikita Taranov)。
  • 允许在创建 Ordered 模式的 S3Queue 时,通过设置 s3queue_last_processed_path 来定义起始位置。 #59446 (Kseniia Sumarokova).
  • clickhouse-local 中,系统表的注释现在也可以在 system.tables 中获取。#59493 (Nikita Mikhaylov)。
  • system.zookeeper 表:之前会先将整个结果累积在内存中,然后一次性作为一个大块返回。此次更改有助于在从 system.zookeeper 读取大量行时降低内存消耗,支持展示中间进度(当前已读取的行数),并在结果集很大时避免触发连接超时。 #59545 (Alexander Gololobov).
  • 现在 dashboard 能够同时识别压缩和未压缩状态的 URL #hash(保持向后兼容)。延续自 #59124#59548Amos Bird)。
  • 将 Intel QPL(供编解码器 DEFLATE_QPL 使用)从 v1.3.1 升级到 v1.4.0。同时修复了轮询超时机制中的一个 bug,我们观察到在某些情况下超时不会按预期生效,如果发生超时,IAA 和 CPU 可能会并发处理缓冲区。目前的做法是先确保 IAA codec 状态不是 QPL_STS_BEING_PROCESSED,然后再回退到 SW codec。 #59551 (jasperzhu)。
  • 不要在 ClickHouse Cloud 中显示有关服务器版本的警告,因为 ClickHouse Cloud 会自动执行无缝升级。 #59657 (Alexey Milovidov)。
  • 自解压完成后,临时二进制文件由复制改为移动。 #59661 (Yakov Olkhovskiy)。
  • 修复在 Apple macOS 上的栈展开问题。解决了 #53653#59690Nikita Mikhaylov)。
  • 即使用户将 max_parser_depth 错误配置为一个非常大的值,也要检查解析器中的栈溢出。从而关闭了 #59622#59697Alexey Milovidov)。#60434
  • 统一在 Kafka 存储中通过 XML 和 SQL 创建的命名集合的行为。#59710 (Pervakov Grigorii).
  • merge_max_block_size_bytes 足够小且表中包含宽行(如字符串或元组)时,后台合并可能会陷入无限循环。此问题已修复。是 https://github.com/ClickHouse/ClickHouse/pull/59340 的后续更新。#59812Nikita Mikhaylov)。
  • 如果在 CREATE TABLE 语句中显式指定了 uuid,则允许在 replica_path 中使用 uuid。 #59908 (Azat Khuzhin).
  • system.tables 系统表中为 ReplicatedMergeTree 表新增 metadata_version 列。 #59942 (Maksim Kita).
  • Keeper 优化:向 Prometheus 仅发送与 Keeper 相关的指标/事件。 #59945 (Antonio Andelic).
  • 即使在升级后 system 表的结构发生变化,仪表板仍然可以显示不同 ClickHouse 版本的指标。#59967Alexey Milovidov)。
  • 允许从文件中加载 AZ 信息。 #59976 (Konstantin Bogdanov).
  • Keeper 改进:为磁盘相关操作失败时添加重试机制。 #59980 (Antonio Andelic).
  • 添加新的配置项 backups.remove_backup_files_after_failure<clickhouse> <backups> <remove_backup_files_after_failure>true</remove_backup_files_after_failure> </backups> </clickhouse>#60002Vitaly Baranov)。
  • 在通过 GCP 复制 S3 文件时,如果 GCP 返回带有 GATEWAY_TIMEOUT HTTP 状态码的 Internal Error,则回退为缓冲区复制。 #60164 (Maksim Kita).
  • ULIDStringToDateTime 实现短路求值。#60211Juan Madurga)。
  • 为表 system.backupssystem.backup_log 添加了 query_id 列。为 error 列添加了错误堆栈跟踪信息。 #60220 (Maksim Kita).
  • 现在,通过 MySQL 端口的连接会自动在设置 prefer_column_name_to_alias = 1 下运行,从而开箱即用地支持 QuickSight。此外,设置 mysql_map_string_to_text_in_show_columnsmysql_map_fixed_string_to_text_in_show_columns 现在默认启用,同样只影响 MySQL 连接。这提升了与更多 BI 工具的兼容性。#60365Robert Schulze)。
  • 修复 JavaScript 代码中的竞态条件,该问题会导致生成的图表重复并相互叠加。#60392 (Alexey Milovidov).

构建 / 测试 / 打包改进

  • 添加了带覆盖率收集和自省功能的构建与测试。这是对 #56102 的延续。#58792Alexey Milovidov)。
  • 当设置了 CMake 交叉编译工具链变量时,在 corrosion-cmake 中更新 Rust 工具链。#59309Aris Tritas)。
  • 为 ASTLiterals 增加了一些模糊测试(fuzzing)。#59383Raúl Marín)。
  • 如果希望在每次 ClickHouse 容器启动时都运行 initdb 脚本,则需要设置环境变量 CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS。#59808Alexander Nikolaev)。
  • 移除了禁用通用 ClickHouse 组件(如 server/client/...)的选项,但保留了一些需要额外库(如 ODBC 或 keeper)的组件。#59857Azat Khuzhin)。
  • 查询模糊测试器(query fuzzer)现在会对查询中的 SETTINGS 进行模糊测试。#60087Alexey Milovidov)。
  • 新增对使用 clang-19(master)构建 ClickHouse 的支持。#60448Alexey Milovidov)。

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

  • 修复 TTL WHERE 中出现的 “Non-ready set” 错误。#57430 (Nikolai Kochetov)。
  • 修复 quantilesGK 函数中的一个错误 #58216李扬)。
  • 修复 intDiv 在 Decimal 类型参数上的错误行为 #59243Yarik Briukhovetskyi)。
  • 修复 translate 对 FixedString 输入的处理 #59356 (Raúl Marín)。
  • 修正 Keeper 中的摘要计算 #59439 (Antonio Andelic)。
  • 为不包含调试符号的二进制文件修复堆栈跟踪 #59444 (Azat Khuzhin).
  • 在列级设置场景下修复 ASTAlterCommand::formatImpl... #59445 (János Benjamin Antal).
  • 使用 Analyzer 修复 SELECT * FROM [...] ORDER BY ALL 查询 #59462 (zhongyuankai).
  • 修复在分布式查询取消期间可能出现的未捕获异常 #59487 (Azat Khuzhin)。
  • 使 MAX 在处理复杂类型时使用与 permutation 相同的规则 #59498 (Raúl Marín)。
  • 修复在传递 update_insert_deduplication_token_in_dependent_materialized_views 时的边缘情况 #59544 (Jordi Villar)。
  • 修复在空值上调用 arrayElement / map 时返回的不正确结果 #59594 (Raúl Marín)。
  • 修复在合并空状态时导致 topK 崩溃的问题 #59603Raúl Marín)。
  • 修复具有常量分片键的分布式表 #59606 (Vitaly Baranov)。
  • 修复由 WingFuzz 发现的 KQL 问题 #59626 (Yong Wang)。
  • 修复 AsynchronousBoundedReadBuffer 出现的 “Read beyond last offset” 错误 #59630 (Vitaly Baranov)。
  • 在 RewriteSumFunctionWithSumAndCountVisitor 中保留函数别名 #59658 (Raúl Marín)。
  • 修正非初始查询的开始时间 #59662 (Raúl Marín).
  • minmax 跳过索引的参数类型进行校验 #59733 (Anton Popov).
  • 修复在 FixedString 输入时的 leftPad / rightPad 函数 #59739Raúl Marín)。
  • 修复 AST fuzzer 在函数 countMatches 中的问题 #59752 (Robert Schulze).
  • RabbitMQ:修复既未被 ack 也未被 nack 的消息 #59775 (Kseniia Sumarokova)。
  • 修复 StorageURL 将部分查询执行为单线程的问题 #59833 (Michael Kolupaev).
  • S3Queue:修复未初始化的值 #59897 (Kseniia Sumarokova)。
  • 修复对用括号括起的分区表达式的解析 #59901 (János Benjamin Antal)。
  • 修复在通过 HTTP 使用 JSONColumnsWithMetadata 格式时发生的崩溃 #59925 (Kruglov Pavel)。
  • 如果在 Analyzer 中重写后返回值会发生变化,则不要将 sum 重写为 count #59926Azat Khuzhin)。
  • 修复 UniqExactSet 读取时的崩溃 #59928 (Maksim Kita).
  • 修复 ReplicatedMergeTree 无效的 metadata_version 问题 #59946 (Maksim Kita)。
  • 修复 StorageDistributed 中的数据竞争 #59987 (Nikita Taranov)。
  • Docker:在启用该选项时运行初始化脚本,而不是在禁用时运行 #59991 (jktng)。
  • 修复向 SQLite 执行 INSERT 时处理单引号的问题(通过使用引号而不是反斜杠来转义单引号)#60015Azat Khuzhin)。
  • 修复 arrayFold 中的多处逻辑错误 #60022Raúl Marín)。
  • 修复 optimize_uniq_to_count 会移除列别名的行为 #60026 (Raúl Marín).
  • 修复在删除 S3Queue 表时可能抛出的异常 #60036 (Kseniia Sumarokova).
  • 修复 NOT 与单个字面量一起使用时的格式化问题 #60042 (Raúl Marín)。
  • 在 DDLLogEntry 中使用从上下文中获取的 max_query_size,而不是硬编码的 4096 #60083 (Kruglov Pavel)。
  • 修复包含名为 table 的表的查询的格式不一致问题。修复在结构不是线性时包含 UNION ALLINTERSECTEXCEPT 的查询的错误格式化问题。关闭 issue #52349。修复 SYSTEM 查询的错误格式化,包括 SYSTEM ... DROP FILESYSTEM CACHESYSTEM ... REFRESH/START/STOP/CANCEL/TEST VIEWSYSTEM ENABLE/DISABLE FAILPOINT。修复参数化 DDL 查询的格式化。修复 DESCRIBE FILESYSTEM CACHE 查询的格式化。修复 SET param_...(设置参数的查询)的错误格式化。修复 CREATE INDEX 查询的错误格式化。修复 CREATE USER 及类似查询的格式不一致问题。修复 CREATE SETTINGS PROFILE 的格式不一致问题。修复 ALTER ... MODIFY REFRESH 的错误格式化。修复在窗口偏移量为表达式时窗口函数格式不一致的问题。修复在用于实现运算符(例如 plus)的函数之后使用 RESPECT NULLSIGNORE NULLS 时格式不一致的问题。修复 SYSTEM SYNC REPLICA ... LIGHTWEIGHT FROM ... 的极其糟糕的格式化。修复包含 GROUP BY GROUPING SETS ... WITH ROLLUP/CUBE/TOTALS 的无效查询的格式不一致问题。修复 GRANT CURRENT GRANTS 的格式不一致问题。修复 CREATE TABLE (... COLLATE) 的格式不一致问题。此外,还修复了子查询中 EXPLAIN 的错误格式化(#60102)。修复了 lambda 函数的错误格式化(#60012)。新增检查,以避免今后再遗漏这种糟糕的格式。#60095Alexey Milovidov)。
  • 修复子查询中 EXPLAIN 输出格式不一致的问题 #60102Alexey Milovidov)。
  • 修复在使用 Nullable 时出现的 cosineDistance 崩溃问题 #60150 (Raúl Marín).
  • 允许将以字符串表示的 bool 转换为真正的布尔值 #60160 (Robert Schulze)。
  • 修复 system.s3queue_log #60166 (Kseniia Sumarokova)。
  • 修复带可为 NULL 的聚合函数名称的 arrayReduce #60188 (Raúl Marín)。
  • 隐藏 S3Queue 的敏感信息 #60233 (Kseniia Sumarokova).
  • 修复 HTTP 异常状态码。 #60252 (Austin Kothig)。
  • S3Queue:修复一个 bug(同时修复不稳定的测试用例 test_storage_s3_queue/test.py::test_shards_distributed) #60282 (Kseniia Sumarokova).
  • 修复 IPv6 哈希函数中使用未初始化的值以及生成无效结果的问题 #60359 (Kruglov Pavel)。
  • 修复 OptimizeDateOrDateTimeConverterWithPreimageVisitornull 参数情况下的行为 #60453 (Raúl Marín).
  • 修复了一个小问题,该问题导致来自 KQL 或 PRQL 方言客户端的分布式表查询无法在副本上执行。 #59674#60470 (Alexey Milovidov) #59674 (Austin Kothig)。

ClickHouse 发行版 24.1,2024-01-30

向后不兼容的更改

  • 设置 print_pretty_type_names 现在默认开启。你可以将其关闭以保持旧行为,或者执行 SET compatibility = '23.12'#57726Alexey Milovidov)。
  • MergeTree 设置 clean_deleted_rows 已被弃用,不再产生任何效果。默认情况下不允许在 OPTIMIZE 中使用 CLEANUP 关键字(除非启用了 allow_experimental_replacing_merge_with_cleanup)。#58316Alexander Tokmakov)。
  • 函数 reverseDNSQuery 不再可用。这解决了 #58368#58369Alexey Milovidov)。
  • 启用多项更改,以改进配置文件中的访问控制。这些更改会影响系统行为,请在 access_control_improvements 部分检查 config.xml。如果你不确定,请保持配置文件中的值与上一版本一致。#58584Alexey Milovidov)。
  • 改进 sumMapFiltered 在处理 NaN 值时的行为。NaN 值现在会被放在末尾(而不是随机位置),并且被视为与任意值都不同。-0 现在也被视为等同于 0;由于 0 值会被丢弃,-0 值也同样会被丢弃。#58959Raúl Marín)。
  • 函数 visibleWidth 将按照文档中的说明工作。在之前的版本中,它在字符串序列化后仅简单统计码点数量,与 lengthUTF8 函数类似,但不会考虑零宽和组合字符、全宽字符、制表符和删除字符。现在行为已做相应更改。如果你希望保持旧行为,请将 function_visible_width_behavior 设置为 0,或者将 compatibility 设置为 23.12 或更低。#59022Alexey Milovidov)。
  • 在以下两个缺陷修复之前,Kusto 方言被禁用:#59037#59036#59305Alexey Milovidov)。任何尝试使用 Kusto 的操作都会抛出异常。
  • FINAL 修饰符的更高效实现不再保证即使在 max_threads = 1 时也能保留顺序。如果你依赖之前的行为,请将 enable_vertical_final 设置为 0,或将 compatibility 设置为 23.12

新功能

  • 实现 Variant 数据类型,用于表示其他数据类型的并集。类型 Variant(T1, T2, ..., TN) 表示该类型的每一行都具有类型 T1T2、...、TN 之一的值,或者为空(NULL 值)。Variant 类型可通过设置 allow_experimental_variant_type 启用。参考:#54864#58047Kruglov Pavel)。
  • 某些设置(目前为 min_compress_block_sizemax_compress_block_size)现在可以在列级别指定,此时会优先于相应的表级别设置。示例:CREATE TABLE tab (col String SETTINGS (min_compress_block_size = 81920, max_compress_block_size = 163840)) ENGINE = MergeTree ORDER BY tuple();#55201Duc Canh Le)。
  • 添加 quantileDD 聚合函数以及相应的 quantilesDDmedianDD。它基于 DDSketch https://www.vldb.org/pvldb/vol12/p2195-masson.pdf。### 面向用户的变更文档条目。#56342 (Srikanth Chekuri)。
  • 支持配置任意类型的对象存储以及任意类型的元数据类型。 #58357 (Kseniia Sumarokova).
  • distributed_ddl_output_mode 新增了 null_status_on_timeout_only_activethrow_only_active 模式,从而避免等待不活跃副本。#58350 (Alexander Tokmakov)。
  • 添加函数 arrayShingles 用于计算子数组,例如 arrayShingles([1, 2, 3, 4, 5], 3) 返回 [[1,2,3],[2,3,4],[3,4,5]]#58396Zheng Miao)。
  • 新增了函数 punycodeEncodepunycodeDecodeidnaEncodeidnaDecode,用于根据 IDNA 标准将国际化域名转换为 ASCII 表示形式。#58454 (Robert Schulze)。
  • 新增字符串相似度函数 dramerauLevenshteinDistancejaroSimilarityjaroWinklerSimilarity#58531 (Robert Schulze)。
  • 添加两个设置:output_format_compression_level 用于更改输出压缩级别,以及 output_format_compression_zstd_window_log 用于显式设置压缩窗口大小,并在输出压缩方法为 zstd 时启用 zstd 压缩的长距离(long-range)模式。适用于使用 INTO OUTFILE 以及写入表函数 fileurlhdfss3azureBlobStorage 时。#58539Duc Canh Le)。
  • 当输出目标不是终端时,在 Pretty 格式中自动禁用 ANSI 转义序列。为设置 output_format_pretty_color 新增 auto 模式。 #58614 (Shaun Struwig)。
  • 新增函数 sqidDecode,用于解码 Sqids#58544 (Robert Schulze)。
  • 允许在 JSON 输入格式中将 Bool 值读取为 String 类型。通过设置 input_format_json_read_bools_as_strings 来实现,该设置默认启用。#58561 (Kruglov Pavel)。
  • 添加了函数 seriesDecomposeSTL,用于将时间序列分解为季节成分、趋势成分和残差成分。 #57078 (Bhavna Jindal).
  • 为 MaterializedMySQL 引入 MySQL Binlog Client:一个 binlog 连接可服务多个数据库。#57323Val Doroshchuk)。
  • Intel QuickAssist Technology (QAT) 提供基于硬件加速的压缩和加密运算。ClickHouse 新增了压缩编解码器 ZSTD_QAT,它利用 QAT 来执行 zstd 压缩。该编解码器使用了 Intel 的 QATlibIntel 的 QAT ZSTD Plugin。目前仅支持通过硬件加速压缩(如果无法初始化 QAT,则会回退到软件实现),解压缩始终由软件执行。#57509jasperzhu)。
  • 为 S3 磁盘实现了一种新的对象存储键生成方式。现在可以在磁盘描述中通过 key_template 选项,使用 re2 正则表达式语法来定义键的格式。#57663 (Sema Checherinda)。
  • 表 system.dropped_tables_parts 包含 system.dropped_tables 中各表的数据片段(这些表已被删除但尚未物理移除)。 #58038 (Yakov Olkhovskiy).
  • 添加了 max_materialized_views_size_for_table 设置,用于限制附加到某个表的物化视图数量。#58068zhongyuankai)。
  • clickhouse-format 改进:支持带有 VALUES 的 INSERT 语句;支持注释(使用 --comments 来输出);支持 --max_line_length 选项,仅将较长的查询格式化为多行。#58246 (vdimir)。
  • clickhouse-local 中附加所有系统表,包括 system.parts。此更改修复了 #58312#58359Alexey Milovidov)。
  • 在函数 transform 中添加对 Enum 数据类型的支持。关闭了 #58241#58360Alexey Milovidov)。
  • 添加表 system.database_engines#58390 (Bharat Nallan)。允许在代码中独立注册数据库引擎。 #58365 (Bharat Nallan)。允许独立注册解释器。 #58443 (Bharat Nallan)。
  • SYSTEM SYNC REPLICA LIGHTWEIGHT 查询新增了 FROM &lt;Replicas&gt; 修饰符。使用 FROM 修饰符可以确保我们只针对指定的源副本等待 fetch 和 drop-range 操作,同时也包括任何不在 ZooKeeper 中或 source_replica 为空的副本。#58393 (Jayme Bird)。
  • 新增设置 update_insert_deduplication_token_in_dependent_materialized_views。该设置允许在向依赖物化视图插入数据时,使用表标识符更新插入去重 token。修复 #59165#59238Maksim Kita)。
  • 新增语句 SYSTEM RELOAD ASYNCHRONOUS METRICS,用于刷新异步指标。主要用于测试和开发。#53710 (Robert Schulze)。

性能优化

  • 用于并行副本的协调机制已重写,以提升并行性和缓存局部性。它已在数百个副本规模下通过线性扩展性测试。同时还增加了对有序读取的支持。#57968 (Nikita Taranov)。
  • 将基于 HTTP 的出站缓冲替换为 ClickHouse 原生缓冲机制。为接口添加字节计数指标。#56064 (Yakov Olkhovskiy).
  • 在分布式查询中,将对 uniqExact 的大规模聚合状态进行并行合并。#59009Nikita Taranov)。
  • MergeTree 表读取数据后的内存占用更低。 #59290 (Anton Popov).
  • 在垂直合并过程中降低内存占用。#59340 (Anton Popov).
  • 在更多场景中避免 Keeper 启动时的过高内存消耗。#58455Antonio Andelic)。
  • Keeper 改进:降低 Keeper 存储节点的内存占用。#59002 (Antonio Andelic).
  • 更具缓存友好性的最终实现。关于行为变更的说明:之前带有 FINAL 修饰符且仅使用单个流读取(例如 max_threads = 1)的查询,即使未显式提供 ORDER BY 子句,也会生成有序输出。当 enable_vertical_final = true 时(默认即为启用),不再保证这一点。#54366Duc Canh Le)。
  • 避免在 ReadBufferFromIStream 中进行额外拷贝,该组件例如用于从 S3 读取数据。 #56961 (Nikita Taranov).
  • 当输入类型为 Array(Map)/Array(Array(Num))/Array(Array(String))/Array(BigInt)/Array(Decimal) 时,对 arrayElement 函数进行了优化。此前的实现进行了超出实际需要的内存分配。此次优化的性能提升最高可达约 6 倍,尤其是在输入类型为 Array(Map) 时。#56403李扬)。
  • 在紧凑部分中从同一列读取多个子列时,现在仅对该列执行一次读取。 #57631 (Kruglov Pavel).
  • 重写 sum(column + constant) 函数的 AST。此功能作为 Analyzer 的一个优化 pass 提供 #57853Jiebin Sun)。
  • 对函数 match 的求值现在会利用跳过索引 ngrambf_v1tokenbf_v1#57882凌涛)。
  • 函数 match 的计算现在会使用倒排索引。#58284凌涛)。
  • MergeTree FINAL 不会比较来自同一个非 L0 数据片段的行。 #58142 (Duc Canh Le).
  • 加速 iota 调用(将数组填充为连续数字)。#58271 (Raúl Marín).
  • 加速非数值类型的 MIN/MAX 运算。 #58334 (Raúl Marín).
  • 使用 BMI2/SSE 内建指令优化过滤器组合(例如在多阶段 PREWHERE 中) #58800 (Zhiguo Zhou).
  • clickhouse-local 使用的线程数减少 1 个。#58968Alexey Milovidov)。
  • 当类型为 Nullable 时,优化 multiIf 函数的性能。#57745 (KevinyhZou).
  • 添加 SYSTEM JEMALLOC PURGE 用于清理未使用的 jemalloc 页面,如果已启用分析器,可使用 SYSTEM JEMALLOC [ ENABLE | DISABLE | FLUSH ] PROFILE 控制 jemalloc 分析配置。在 Keeper 中添加与 jemalloc 相关的 4LW 命令:jmst 用于转储 jemalloc 统计信息,jmfpjmepjmdp 在分析器启用时用于控制 jemalloc 分析配置。#58665 (Antonio Andelic)。
  • 降低将数据备份到 S3 时的内存占用。#58962Vitaly Baranov)。

改进

  • 为所有 system 表的列添加了注释(简要说明)。这样做有几个原因: - 我们大量使用 system 表,有时开发者很难理解某个特定列的用途和含义。 - 我们经常对 system 表进行变更(新增或修改现有列),而相应文档总是滞后、处于过时状态。例如,请查看 system.parts 的文档页面,其中缺少了很多列 - 我们希望最终能够直接从 ClickHouse 自动生成文档。 #58356Nikita Mikhaylov)。
  • 允许 PASTE JOIN 的子查询不指定别名。#58654 (Yarik Briukhovetskyi).
  • 在 macOS 上启用 MySQL/MariaDB 集成。这一改动关闭了 #21191#46316Alexey Milovidov)(Robert Schulze)。
  • 默认禁用 max_rows_in_set_to_optimize_join#56396 (vdimir).
  • 添加 <host_name> 配置参数,用于在 ON CLUSTER DDL 查询和 Replicated 数据库引擎中避免解析主机名。这样可以降低在集群定义发生变化时队列阻塞的风险。修复 #57573#57603Nikolay Degterinsky)。
  • 将文件系统缓存的 load_metadata_threads 提高到 16。这样可以让服务器启动得更快。#57732Alexey Milovidov)。
  • 新增对合并/变更进行限速的能力(max_mutations_bandwidth_for_server/max_merges_bandwidth_for_server)。 #57877 (Azat Khuzhin).
  • 在系统表 system.server_settings 中,将未在文档中记录的布尔类型列 is_hot_reloadable 替换为 Enum8 类型列 changeable_without_restart,其可能取值为 NoYesIncreaseOnlyDecreaseOnly。同时为该列补充了文档说明。#58029 (skyoct)。
  • 集群发现支持设置用户名和密码,修复了 #58063#58123vdimir)。
  • 支持在 ALTER TABLE ... PART 中使用查询参数。#58297 (Azat Khuzhin).
  • 为 Kafka 表按需动态创建消费者(但会在上次使用后保留一段时间——kafka_consumers_pool_ttl_ms),这应当修复 system.kafka_consumers 统计信息的问题(当没有人从 Kafka 表读取时不会进行消费,从而导致持续的内存泄漏以及表分离速度变慢),并且此 PR 还再次默认启用了 system.kafka_consumers 的统计信息。#58310Azat Khuzhin)。
  • sparkBar 作为 sparkbar 的别名。 #58335 (凌涛)。
  • 避免在上传到 GCS 后发送 ComposeObject 请求。 #58343 (Azat Khuzhin).
  • 在配置 XML 中正确处理键名中包含点的键。#58354 (Azat Khuzhin).
  • 使函数 format 在传入常量参数时返回常量。此更改关闭了 #58355#58358Alexey Milovidov)。
  • 新增设置 max_estimated_execution_time,以区分 max_execution_timemax_estimated_execution_time#58402Zhang Yifan)。
  • 当使用无效的数据库引擎名称时给出提示。 #58444 (Bharat Nallan).
  • 新增设置,以便更好地控制 Arrow 字典中的索引类型。按照 Arrow 的建议,默认对索引使用有符号整数类型。关闭 #57401#58519Kruglov Pavel)。
  • 实现 #58575,在运行 Docker 镜像时支持 CLICKHOUSE_PASSWORD_FILE 环境变量。#58583Eyal Halpern Shalev)。
  • 在执行某些需要大量读取流来读取数据的查询时,此前会抛出错误 "Paste JOIN requires sorted tables only"。现在在这种情况下,会将流的数量调整为 1。#58608Yarik Briukhovetskyi)。
  • 改进了 INVALID_IDENTIFIER 错误的提示信息。#58703Yakov Olkhovskiy)。
  • 改进了 normalizeQuery 中对带符号数字字面量的处理。 #58710 (Salvatore Mesoraca).
  • 为 MySQL 的 Point 数据类型提供支持。 #58721 (Kseniia Sumarokova).
  • 在比较 Float32 列与常量字符串时,将字符串按 Float32(而不是 Float64)读取。 #58724 (Raúl Marín)。
  • 提升 S3 兼容性,并新增对 ECloud EOS 存储的支持。 #58786 (xleoken).
  • 允许使用 KILL QUERY 来取消备份和恢复操作。此 PR 还让正在运行的备份和恢复操作在 system.processes 中可见。此外,服务器配置中现在新增了一个设置项 shutdown_wait_backups_and_restores(默认=true),该设置会控制服务器在关闭时是等待所有正在运行的备份和恢复完成,还是直接取消它们。#58804Vitaly Baranov)。
  • 为 Avro 格式增加对 ZSTD 编解码器的支持。关闭 #58735#58805flynn)。
  • MySQL 接口现已支持 net_write_timeoutnet_read_timeout 设置。其中,net_write_timeout 会映射到 ClickHouse 原生的 send_timeout 设置,类似地,net_read_timeout 会映射到 receive_timeout。修复了一个问题:此前只有在整个语句全部为大写时,才能设置 MySQL 的 sql_select_limit 设置。#58835 (Serge Klochkov)。
  • 在创建同名的字典和表发生冲突时,提供了更清晰的异常消息。#58841Yarik Briukhovetskyi)。
  • 对于自定义(通过 SQL 创建的)磁盘,确保在服务器配置中指定了 filesystem_caches_path(所有文件系统缓存的通用目录前缀)或 custom_cached_disks_base_directory(仅针对由自定义磁盘创建的文件系统缓存的通用目录前缀)之一。对于自定义磁盘,custom_cached_disks_base_directory 相对于 filesystem_caches_path 具有更高优先级;如果前者未配置,则使用后者。文件系统缓存设置中的 path 必须位于该目录之内,否则将抛出异常,阻止创建该磁盘。如果磁盘是在旧版本上创建的,且之后对服务器进行了升级,则不会抛出该异常,以便服务器能够成功启动。custom_cached_disks_base_directory 已作为 /var/lib/clickhouse/caches/ 添加到默认服务器配置中。修复 #57825#58869Kseniia Sumarokova)。
  • MySQL 接口现在兼容 SHOW WARNINGS/SHOW COUNT(*) WARNINGS 查询,但其返回结果始终为空集。#58929 (Serge Klochkov)。
  • 在执行并行分布式 INSERT SELECT 时跳过不可用的副本。#58931 (Alexander Tokmakov)。
  • 在启用 JSON 格式的结构化日志输出时,显示文字形式的日志级别。 #58936 (Tim Liou)。
  • MySQL 接口通过数据类型别名新增了对 CAST(x AS SIGNED)CAST(x AS UNSIGNED) 语句的支持:SIGNED 作为 Int64 的别名,UNSIGNED 作为 UInt64 的别名。这提升了与 Looker Studio 等 BI 工具的兼容性。#58954Serge Klochkov)。
  • 将工作目录切换到 Docker 容器中的数据路径。#58975 (cangyin).
  • 为 Azure Blob Storage 新增配置项 azure_max_unexpected_write_error_retries,也可以在配置文件的 azure 部分进行配置。#59001 (SmitaRKulkarni)。
  • 允许服务器在数据湖表损坏的情况下启动。关闭 #58625#59080Kseniia Sumarokova)。
  • 允许在 Iceberg 表引擎中忽略 schema 演进,并使用用户在建表时指定的 schema,或者在建表时从元数据解析出的最新 schema 来读取所有数据。通过 iceberg_engine_ignore_schema_evolution 设置实现,该设置默认关闭。请注意,启用此设置可能会导致结果不正确,因为在 schema 发生演进的情况下,所有数据文件都将使用同一个 schema 进行读取。 #59133 (Kruglov Pavel).
  • 禁止在只读/只写一次存储上执行可变操作(INSERT/ALTER/OPTIMIZE/...),并返回适当的 TABLE_IS_READ_ONLY 错误(以避免残留数据)。在执行 CREATE/ATTACH 时避免在只写一次磁盘上留下残留文件(format_version.txt)。忽略对 ReplicatedMergeTree 执行的 DROP 操作(与 MergeTree 一样)。修复对 s3_plain 的迭代(MetadataStorageFromPlainObjectStorage::iterateDirectory)。注意:只读磁盘为 web,只写一次磁盘为 s3_plain#59170Azat Khuzhin)。
  • 修复实验性 _block_number 列中的一个缺陷,该缺陷在复杂组合使用 ALTERmerge 操作时可能导致逻辑错误。修复了 #56202,取代了 #58601#59295alesapin)。
  • Play UI 能够识别包含在 JSON 返回值中的异常。针对 #52853 的调整。#59303Alexey Milovidov)。
  • /binary HTTP 处理程序允许在查询字符串中指定用户、主机,以及可选的密码。#59311 (Alexey Milovidov)。
  • 支持对压缩的内存表进行备份。已解决 #57893#59315Alexey Milovidov)。
  • BACKUPRESTORE 查询中支持 FORMAT 子句。#59338 (Vitaly Baranov)。
  • 函数 concatWithSeparator 现在支持任意类型的参数(而不再仅限于 StringFixedString 参数)。例如,SELECT concatWithSeparator('.', 'number', 1) 现在会返回 number.1#59341Robert Schulze)。

构建/测试/打包改进

  • 改进 clickhouse 可执行文件的别名(现在 ch/clickhouse 会根据参数被解析为 clickhouse-localclickhouse),并为这些新别名添加 bash 补全。 #58344 (Azat Khuzhin).
  • 在 CI 中添加设置变更检查,用于验证所有设置变更都记录在设置变更历史中。 #58555 (Kruglov Pavel).
  • 在有状态测试中直接使用从 S3 挂载的表。 #58791 (Alexey Milovidov).
  • 将完整的 fuzzer.log 保存为归档文件,而不是只保留最后 100k 行。tail -n 100000 经常会删掉包含表定义的行。示例:#58821 (Dmitry Novik).
  • 在 Aarch64 架构的 macOS 上启用 Rust(这将在客户端中通过 skim 添加模糊搜索和 PRQL 语言,尽管我认为几乎没有人在 darwin 上部署 ClickHouse,所以主要还是为了在客户端中使用模糊搜索)。#59272 (Azat Khuzhin).
  • 修复在混合 x86_64 与 ARM 集群中的聚合问题。 #59132 (Harry Lee).

Bug 修复(在官方稳定版本中用户可见的错误行为)

2023 年变更日志

  • 目录
  • ClickHouse 版本 24.12,2024-12-19
  • ClickHouse 版本 24.11,2024-11-26
  • ClickHouse 发布 24.10,2024-10-31
  • ClickHouse 发布 24.9,2024-09-26
  • ClickHouse 24.8 LTS 版本,2024-08-20
  • ClickHouse 发布 24.7,2024-07-30
  • ClickHouse release 24.6, 2024-07-01
  • ClickHouse 24.5 版本发布,2024-05-30
  • ClickHouse 版本 24.4,2024-04-30
  • ClickHouse 24.3 LTS 版本,2024-03-27
  • ClickHouse 发布 24.2,2024-02-29
  • ClickHouse 发行版 24.1,2024-01-30
  • 2023 年变更日志