> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-vortex-format.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Cloud v26.8 更新日志

> v26.8 更新日志

<h2 id="backward-incompatible-changes">
  向后不兼容的变更
</h2>

<h3 id="query-function-and-syntax-changes">
  查询、函数和语法变更
</h3>

* 对于定义体为针对单个 `Distributed` 表的简单 `SELECT` 的视图，现在会将整个外层查询下推到各分片执行 (新增设置 `optimize_trivial_view_pushdown_to_distributed`，默认启用) 。这会改变此类视图的可观察行为：在视图引用上指定的 `FINAL` 和 `SAMPLE` 现在会传递给分片本地表，而不再被忽略；此外，在单分片集群上不再报告 `extremes`。如需恢复之前的行为，请设置 `optimize_trivial_view_pushdown_to_distributed = 0`。[#101791](https://github.com/ClickHouse/ClickHouse/pull/101791) ([simonmichal](https://github.com/simonmichal))。
* 轻量级 `UPDATE` 的补丁分区片段现在采用新的 v2 磁盘格式，按 (`sorting_key..., _block_number, _block_offset`) 排序，并通过新的合并算法应用。峰值内存取决于排序键相同的最大连续段，而不再取决于整个补丁；跨越合并边界的更新也不再回退为在内存中通过 Join 应用。旧格式的补丁分区片段仍可读取。从 26.8 之前的版本滚动升级时，请保持 `patch_parts_version = 'v1'` 或使用 `compatibility` 设置，直到所有副本均完成升级。[#103182](https://github.com/ClickHouse/ClickHouse/pull/103182) ([CurtizJ](https://github.com/CurtizJ))。
* `AggregatingMergeTree` 现在会在建表时拒绝以下 schema：其中存在既不属于排序键、也不是聚合状态度量列 (`AggregateFunction`/`SimpleAggregateFunction`) 的列。此类列在后台合并时会被静默折叠为任意值，导致基于这些列进行 `GROUP BY` 或过滤的查询返回错误结果。如需恢复之前的行为，请设置 `allow_dimensions_outside_sorting_key = 1`。[#108087](https://github.com/ClickHouse/ClickHouse/pull/108087) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* ClickHouse 现在对同步和异步插入一律使用统一的插入去重哈希，旧版的逐次插入去重行为已移除。服务器设置 `insert_deduplication_version` 作为迁移保护予以保留：若将其设为旧版值 (`old_separate_hashes` 或 `compatible_double_hashes`) ，服务器将拒绝启动。如需从使用旧版值的版本升级，请先运行支持 `compatible_double_hashes` 的版本 (该模式会同时写入旧版哈希和统一哈希) 。对于复制表，运行时长至少应为 `replicated_deduplication_window_seconds` (默认为一小时；默认窗口会保留该时间段内所有插入的统一哈希，通常足以覆盖插入重试循环) 。对于 `non_replicated_deduplication_window` > 0 的非复制表，该窗口基于插入次数而非时间，因此 `compatible_double_hashes` 模式下至少需要完成相应次数的插入。之后，在升级到此版本之前，请移除该设置 (或将其设为 `new_unified_hash`) 。[#108361](https://github.com/ClickHouse/ClickHouse/pull/108361) ([CheSema](https://github.com/CheSema))。
* 设置 `use_legacy_to_time` 现在默认为 `0`，因此 `toTime` 会将值转换为 `Time` 数据类型，而不再将日期时间转换为固定日期。如需沿用旧版行为，可使用 `toTimeWithFixedDate` 函数，或设置 `use_legacy_to_time = 1`。[#108729](https://github.com/ClickHouse/ClickHouse/pull/108729) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 朴素贝叶斯模型 (供 `naiveBayesClassifier` 使用) 现在配置为采用 `NAIVE_BAYES` 布局的字典，在加载时基于一张按类别预聚合的 n-gram 计数表构建，取代此前的服务器端配置方式 (即引用序列化 `.bin` 模型文件的 XML config 文件) 。旧方式已不再受支持——现有模型必须重新创建为字典。同时新增三个与 `naiveBayesClassifier` 配套的函数：`naiveBayesClassifierWithProb` 返回预测类别及其概率，`naiveBayesClassifierWithAllProbs` 返回所有类别及各自的概率，`naiveBayesNgrams` 则以与字典相同的方式将文本切分为 n-gram，用于从原始带标签文本构建训练数据。此外还进行了多项性能优化：在一个 9.7 MiB 的码点三元组语言模型上，内存占用降低约 49 倍 (从 1.84 GiB 降至 38 MiB) ，加载速度和分类速度均提升约 11 倍。[#108773](https://github.com/ClickHouse/ClickHouse/pull/108773) ([nihalzp](https://github.com/nihalzp))。
* `max_insert_threads` 设置的默认值已从 `1` (不并行) 改为 `auto`，即取服务器可用的 CPU 核心数 (内存紧张时会依据 `max_insert_threads_min_free_memory_per_thread` 相应减少) 。这样一来，`INSERT SELECT` 默认即并行执行；对于符合条件的普通 `INSERT`，只要目标写入路径能够安全地扇出，其写入端同样可以并行化。此变更可能会影响所创建的数据分区片段数量以及插入行的顺序。如需恢复先前的行为，请将 `max_insert_threads` 设为 `1`，或将 `compatibility` 设为低于 `26.8` 的版本。[#109000](https://github.com/ClickHouse/ClickHouse/pull/109000) ([alexey-milovidov](https://github.com/alexey-milovidov))。[#109006](https://github.com/ClickHouse/ClickHouse/pull/109006) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 读取 CSV 中的 bare `Tuple` 时，现在无论处于哪个位置，每个元素都对应一个字段，因此顶层元素字段中的 `\N` 仅表示该元素本身，并会对其应用 `input_format_null_as_default`。此前，开头的 `\N` 会被视为整列为 null，导致该行被替换为列默认值，随后其余元素单元格解析失败。对于为整个 bare `Tuple` 只提供单个字段的行，这是一项向后不兼容的变更：此类行现在会因缺少其余元素而被拒绝；而对于单元素 `Tuple`，由于两种方式下字段数相同，会静默返回元素默认值，而非列的 `DEFAULT`。设置 `input_format_csv_deserialize_separate_columns_into_tuple = 0` 即可恢复将此类字段作为整列读取。[#109744](https://github.com/ClickHouse/ClickHouse/pull/109744) ([groeneai](https://github.com/groeneai))。
* 为 `CREATE USER` 和 `ALTER USER` 新增 `VALID FOR <interval>` 子句，作为 `VALID UNTIL` 的简写形式。过期时间在查询执行时按当前时间加上指定时间间隔计算，并以 `VALID UNTIL` 形式存储。`system.users` 表的 `valid_until` 列类型由 `Array(DateTime)` 改为 `Array(DateTime64(0))`，以便精确表示 2106 年之后的过期时间；读取该列的工具需适配新类型。[#110171](https://github.com/ClickHouse/ClickHouse/pull/110171) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `EXPLAIN SYNTAX` 现在将格式化后的查询作为单条 `String` 记录 (内含换行符) 返回，而不再每行一条记录，因此其输出为可直接使用的单行结果 (例如，`SELECT count() FROM (EXPLAIN SYNTAX ...)` 返回 `1`) 。该行为由新增的 `single_record` 选项控制，默认值为 `1`；设置 `single_record = 0` 可恢复以往每行一条记录的输出。其他 `EXPLAIN` 类型 (`PLAN`/`PIPELINE`/`AST`) 仍保持逐行的树形输出。[#110479](https://github.com/ClickHouse/ClickHouse/pull/110479) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `hasColumnInTable` 函数不再接受用于在任意远程服务器上检查列的可选参数 `hostname`、`username` 和 `password`；仅保留 `hasColumnInTable(database, table, column)` 形式。被移除的远程模式存在安全隐患：它允许任何用户向任意主机发起出站连接，会将凭证泄露到查询日志中，而且不受任何特权约束。[#110881](https://github.com/ClickHouse/ClickHouse/pull/110881) ([alexey-milovidov](https://github.com/alexey-milovidov)).
* `PostgreSQL` 和 `MaterializedPostgreSQL` 数据库引擎现在会遵循服务器的 `remote_url_allow_hosts` 配置，与 `PostgreSQL` 表引擎、`postgresql` 表函数以及通过 DDL 创建的字典的现有行为保持一致。该策略在执行 `CREATE DATABASE` 以及用户发起的 `ATTACH DATABASE` 时生效：如果服务器上配置了 `remote_url_allow_hosts`，那么创建或附加指向白名单以外主机的 `PostgreSQL` 或 `MaterializedPostgreSQL` 数据库时，将被拒绝并返回 `UNACCEPTABLE_URL` 错误。已有的数据库在服务器启动时仍会正常加载，因此升级不会导致服务器无法启动。[#111135](https://github.com/ClickHouse/ClickHouse/pull/111135) ([alexey-milovidov](https://github.com/alexey-milovidov)).
* 移除了 `Arrow` 和 `ArrowStream` 格式中基于 Apache Arrow 库的读取器和写入器。ClickHouse 原生实现自 26.7 起即为默认实现，现已成为唯一实现。设置 `input_format_arrow_use_native_reader` 和 `output_format_arrow_use_native_writer` 已废弃：它们仍可被接受，但不再起作用，因此原先将其设为 `0` 以强制使用 Apache Arrow 实现的查询，现在将改用原生实现。[#111996](https://github.com/ClickHouse/ClickHouse/pull/111996) ([alexey-milovidov](https://github.com/alexey-milovidov)).
* MySQL 数据源的 TLS 凭证 (`ssl_ca`、`ssl_cert`、`ssl_key`) 不能再通过 SQL 以文件路径形式指定——无论是在通过 `CREATE NAMED COLLECTION` 创建的命名集合中、作为查询参数，还是在 `CREATE DICTIONARY` 查询中——因为服务器会以自身权限打开这些文件。服务器配置文件中仍支持使用路径。在其他场景中，请通过新增的 `ssl_ca_pem`、`ssl_cert_pem` 和 `ssl_key_pem` 参数传入证书或密钥的内容，这些参数会像密码一样在日志和 `SHOW` 查询中被脱敏处理。[#112070](https://github.com/ClickHouse/ClickHouse/pull/112070) ([alexey-milovidov](https://github.com/alexey-milovidov)).
* `disable_insertion_and_mutation` 现在会阻止 `Kafka`、`RabbitMQ` 和 `NATS` 表的后台消费，但仍允许直接写入外部存储。受此限制的 `Kafka2`、`NATS` 和 `RabbitMQ` 表在直接执行 `SELECT` 时不会初始化消费者。新近引入的 `message_queue_disable_insertion` 设置现在需要重启服务器才能生效。[#113660](https://github.com/ClickHouse/ClickHouse/pull/113660) ([cwurm](https://github.com/cwurm)).
* 对 `AggregateFunction` 列执行窗口 `PARTITION BY` 或 `ORDER BY` 现在会被拒绝并返回 `ILLEGAL_COLUMN` 错误，与对此类列执行顶层 `ORDER BY` 的现有行为一致。此前，此类查询至少会被一种分析器接受，且窗口 `PARTITION BY` 的分区结果会随 `max_threads` 的取值而变化。该限制同样适用于嵌套在 `Array`、`Tuple`、`Map`、`Variant` 或 `SimpleAggregateFunction` 中的状态。基于普通类型的 `SimpleAggregateFunction`、`QBit`，以及对状态执行的 `GROUP BY` 和 `DISTINCT` 均不受影响。[#113878](https://github.com/ClickHouse/ClickHouse/pull/113878) ([groeneai](https://github.com/groeneai)).
* 修复了 `SYSTEM ... CACHE ON CLUSTER` 命令的访问检查。此前这些命令要求的是 `SYSTEM DROP CACHE` 特权组，而非各命令对应的单项特权：一方面，仅持有某项细粒度缓存特权的用户会被拒绝；另一方面，持有该特权组的用户即使不具备 `SYSTEM SYNC FILESYSTEM CACHE` 特权，也能执行 `SYSTEM SYNC FILESYSTEM CACHE ON CLUSTER`。[#114042](https://github.com/ClickHouse/ClickHouse/pull/114042) ([groeneai](https://github.com/groeneai)).
* `NATS` 表引擎现可通过新增的 `nats_credentials` 设置以内联方式传入凭证 (载荷内容与 `.creds` 文件相同) ，并且不再允许在 SQL 中指定 `nats_credential_file`：该路径指向服务器文件系统上的文件，而服务器会以自身的特权打开该文件，因此该路径只能在服务器配置文件中定义的命名集合中指定，或在服务器配置中通过 `nats.credential_file` 指定。查询可以使用内联的 `nats_credentials` 覆盖此类已配置的路径，除非运维人员已通过 `<nats_credential_file overridable="false">` 将其锁定。在此限制引入之前创建的表，升级后仍可正常使用。[#114644](https://github.com/ClickHouse/ClickHouse/pull/114644) ([alexey-milovidov](https://github.com/alexey-milovidov))。

<h3 id="data-type-and-format-changes">
  数据类型与格式变更
</h3>

* 对于存储在对象存储上的备份 (即直接使用 `S3(...)`/`AzureBlobStorage(...)` 目标端，以及底层为 S3 或 Azure 的 `Disk(...)` 目标端) ，`BACKUP` 和 `RESTORE` 均不再支持 `zip`/`zipx` 备份归档格式。Zip 需要随机定位才能读取其中央目录，而这在对象存储上非常缓慢。请改用基于 tar 的格式，例如 `tar.gz`。[#101770](https://github.com/ClickHouse/ClickHouse/pull/101770) ([Onyx2406](https://github.com/Onyx2406))。
* 将 `DateTime64` 的支持范围从 `[1900-01-01, 2299-12-31]` 扩展到 `[0000-01-01, 9999-12-31]`。超出原有范围的值现在会 (通过 cctz) 正确计算，而不再被截断到边界值。当 precision 为 8 或 9 时，由于刻度值以 `Int64` 存储，范围仍然较窄 (在纳秒精度下，最大值仍为 `2262-04-11`) 。向后兼容性：如果您之前使用过超出范围的日期时间值，并依赖旧范围内非常特定的饱和规则，请注意现在的结果会有所变化，且更加准确。[#107907](https://github.com/ClickHouse/ClickHouse/pull/107907) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在 `JSONEachRow` 及类似格式中，`DateTime64`/`DateTime` 列中未加引号的 JSON 数字现在会被解释为 Unix 时间戳 (自纪元起的秒数) ，并可带有子秒级精度，与 `Values` 格式、`CAST` 和 `toDateTime64` 的行为保持一致。此前，带有小数部分的数字 (例如 `1703363853.035`) 会被拒绝并报错 `CANNOT_PARSE_INPUT_ASSERTION_FAILED`，而纯整数 (例如 `1703363853`) 会被读取为 `DateTime64` 的原始缩放值，从而得到 `1970-...` 的时间戳。对于写入 `DateTime64` 列的未加引号整数，这是一项向后不兼容的变更；带引号的字符串以及 ClickHouse 自身 (始终带引号) 的 JSON 输出不受影响。[#108091](https://github.com/ClickHouse/ClickHouse/pull/108091) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 实验性的 `ALP` 编解码器现在使用 `Float64` 执行 `Float32` 的缩放运算，从而消除了处理十进制数据时出现的异常，并显著提升了压缩率。[#111627](https://github.com/ClickHouse/ClickHouse/pull/111627) ([rienath](https://github.com/rienath))。
* 拒绝换算为 Int64 微秒时会溢出的时间跨度设置值 (毫秒/秒) [#112757](https://github.com/ClickHouse/ClickHouse/pull/112757) ([azat](https://github.com/azat))。
* 异步指标现在支持 `Map` 数据类型，按 CPU 核心和按设备划分的指标已合并为单个键值指标：`OSUserTimeCPU0`、`OSUserTimeCPU1`……合并为单个 `OSUserTimeCPU` 指标，其值为 CPU 核心编号到对应值的映射 (其他 `OS*TimeCPU*` 指标、`CPUFrequencyMHz_*`、`Temperature*`、`EDAC*`、`Block*_*`、`Network(Receive|Send)*_*`、`Disk*_*`、`*BlobsQueueEstimate` 和 `AsyncLogging*QueueSize` 同理) 。`system.asynchronous_metrics` 新增了 `key_values Map(LowCardinality(String), Float64)` 列 (此类指标的 `value` 列为 `NaN`) ；`system.asynchronous_metric_log` 通过新增的 `key` 列，按每个键一行记录这些指标；Prometheus 端点以标签形式导出这些指标 (例如 `ClickHouseAsyncMetrics_BlockReadBytes{device="sda"}`) ；Graphite `MetricsTransmitter` 则以 `<prefix>.<Metric>.<key>` 的形式发送。如果您的监控系统读取的是旧指标名称，请将 `asynchronous_metrics_key_values_mode` 设置为 `legacy_names` 以保留旧名称，或在迁移期间设置为 `both`；该服务器设置可通过 `SYSTEM RELOAD CONFIG` 生效，无需重启。[#115333](https://github.com/ClickHouse/ClickHouse/pull/115333) ([alexey-milovidov](https://github.com/alexey-milovidov))。[#116791](https://github.com/ClickHouse/ClickHouse/pull/116791) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对象存储磁盘现在默认使用原生元数据存储事务，从而提升了元数据更新的一致性。[#89658](https://github.com/ClickHouse/ClickHouse/pull/89658) ([Michicosun](https://github.com/Michicosun))。

<h3 id="settings-and-configuration-changes">
  设置与配置变更
</h3>

* 移除了早已弃用的函数 `snowflakeToDateTime`、`snowflakeToDateTime64`、`dateTimeToSnowflake` 和 `dateTime64ToSnowflake`。这些函数早在 v24.6 中就已弃用，取而代之的是 `snowflakeIDToDateTime`、`snowflakeIDToDateTime64`、`dateTimeToSnowflakeID` 和 `dateTime64ToSnowflakeID`，请改用后者。设置 `allow_deprecated_snowflake_conversion_functions` (此前用于重新启用这些函数) 现已过时，不再起任何作用。[#108711](https://github.com/ClickHouse/ClickHouse/pull/108711) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 将 `Date32` 的支持范围从 `[1900-01-01, 2299-12-31]` 扩展至 `[0000-01-01, 9999-12-31]`，与 `DateTime64` 保持一致。解析和类型转换现在支持扩展后的范围，不再静默截断到旧的边界值。向后兼容性说明：在数值转换 `toDate32(N)` 中，`[120530, 2932896]` 范围内的值现在会被解释为天数 (对应 `2300-01-01` 至 `9999-12-31` 之间的日期) ，而不再被视为 1970 年初的 Unix 时间戳。这与“凡落在天数范围内的数字均视为天数”的规则一致；小于 `0000-01-01` 对应天数的数字，以及晚于 `9999-12-31` 的时间戳，将被截断到新的边界值。[#111534](https://github.com/ClickHouse/ClickHouse/pull/111534) ([alexey-milovidov](https://github.com/alexey-milovidov))。

<h3 id="other-backward-incompatible-changes">
  其他向后不兼容的变更
</h3>

* `arrayIntersect` 和 `arraySymmetricDifference` 不再将同一参数内重复出现的值视为在多个参数中出现。依赖先前行为的查询现在可能返回不同的结果：`arrayIntersect([1], [2], [1, 1])` 返回 `[]` 而非 `[1]`，`arrayIntersect([1, 2], [2], [1, 1, 2])` 返回 `[2]` 而非 `[1, 2]`，`arraySymmetricDifference([1], [2], [1, 1])` 返回 `[2, 1]` 而非 `[2]`。对于 `arraySymmetricDifference`，只需两个参数即可出现差异：`arraySymmetricDifference([1], [2, 2])` 返回 `[2, 1]` 而非 `[1]`。现在，只有当某个值在当前参数之前的每个参数中都存在时，才会为当前参数计数，因此结果恰好包含所有参数中共有的值。此外，`arrayIntersect` 现在仅基于最小的参数构建哈希表，而不再基于所有参数构建；当各参数大小差异较大时，速度最高可提升 1.85 倍，内存占用减少三分之一。`arrayUnion` 不受影响。[#113021](https://github.com/ClickHouse/ClickHouse/pull/113021) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 弃用 `minmax` 列统计信息类型。[#108680](https://github.com/ClickHouse/ClickHouse/pull/108680) ([hanfei1991](https://github.com/hanfei1991)) 。
* 修复 `SYSTEM PREWARM PRIMARY INDEX CACHE ... ON CLUSTER` 的访问权限检查：此前它错误地要求 `SYSTEM PREWARM MARK CACHE` 特权，而非 `SYSTEM PREWARM PRIMARY INDEX CACHE` 特权。[#109198](https://github.com/ClickHouse/ClickHouse/pull/109198) ([Algunenano](https://github.com/Algunenano)) 。
* 修复了 `SYSTEM STOP/START CLEANUP` 和 `SYSTEM STOP/START VIRTUAL PARTS UPDATE ON CLUSTER` 错误地要求 `SYSTEM PULLING REPLICATION LOG` 特权，而非 `SYSTEM CLEANUP` / `SYSTEM VIRTUAL PARTS UPDATE` 特权的问题。[#110289](https://github.com/ClickHouse/ClickHouse/pull/110289) ([groeneai](https://github.com/groeneai)) 。
* `/` 通配符 (匹配任意层级的目录) 现在也能匹配当前目录本身。此前，通配符模式中的 `/` 未被作为特殊情况处理，因此 `data/**/file.txt` 无法匹配 `data/file.txt` (零层目录) 。[#97676](https://github.com/ClickHouse/ClickHouse/pull/97676) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。

<h2 id="new-features">
  新功能
</h2>

<h3 id="functions-and-data-types">
  函数与数据类型
</h3>

* 新增 `parseQueryToJSON` 和 `formatQueryFromJSON` 函数，用于将 AST 序列化为 JSON 以及从 JSON 反序列化为 AST；同时新增实验性的 `clickhouse_json` 方言，可通过 `enable_json_ast_dialect` 启用。[#100412](https://github.com/ClickHouse/ClickHouse/pull/100412) ([alexey-milovidov](https://github.com/alexey-milovidov))。[#113480](https://github.com/ClickHouse/ClickHouse/pull/113480) ([fm4v](https://github.com/fm4v))。
* 新增系统表 `system.stemmers`，用于列出 `stem` 函数可指定的所有词干提取器语言。[#100611](https://github.com/ClickHouse/ClickHouse/pull/100611) ([Ergus](https://github.com/Ergus))。
* 新增对标准 SQL `AT TIME ZONE` 和 `AT LOCAL` 后缀运算符的支持，作为 `toTimeZone` 的语法糖。现在，表达式 `expr AT TIME ZONE zone` 等价于 `toTimeZone(expr, zone)`，`expr AT LOCAL` 等价于 `toTimeZone(expr, timeZone())`。[#106092](https://github.com/ClickHouse/ClickHouse/pull/106092) ([lvzhipin03](https://github.com/lvzhipin03))。
* `URL` 表引擎和 `url` 表函数现在会根据 URL scheme 将请求分派到相应的后端：`file://` 由 `File` 引擎处理，`s3://`/`gs://`/`gcs://`/`oss://` 由 `S3` 处理，`az://`/`azure://`/`abfss://`/`abfs://` 由 `AzureBlobStorage` 处理，`hdfs://` 由 `HDFS` 处理，`http(s)://` 则仍与以往一样由 `URL` 引擎处理。`url_base` 设置会在 scheme 分派之前生效。仅默认 `url_scheme_mappers` 所解析的 S3 scheme 会被分派；其他兼容 S3 的厂商 scheme (`cos`、`obs` 等) 不会被分派，需直接使用 `s3` 引擎/函数。[#106093](https://github.com/ClickHouse/ClickHouse/pull/106093) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 `dotProductTransposed` 函数 (别名 `scalarProductTransposed`) ，用于计算 `QBit` 列与参考向量之间的近似内积，作为对现有 `L2DistanceTransposed` 和 `cosineDistanceTransposed` 函数的补充。[#108100](https://github.com/ClickHouse/ClickHouse/pull/108100) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 为 `QBit` 数据类型新增可选的 stride 参数 (`QBit(T, dimension, stride)`) ，可将维度分组存储在独立的流中，使向量搜索能够高效地仅读取前若干个维度 (例如适用于 Matryoshka 嵌入向量) 。转置距离函数新增可选的第四个参数 `used_dims`，用于只读取部分维度。[#108103](https://github.com/ClickHouse/ClickHouse/pull/108103) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `QBit` 数据类型新增对 `Int8` 元素类型的支持，从而可对量化后的 8 位整数向量进行存储和转置距离向量搜索 (`L2DistanceTransposed`、`cosineDistanceTransposed`) 。[#108105](https://github.com/ClickHouse/ClickHouse/pull/108105) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增函数 `randomHadamardTransform(vector[, seed[, output_dims]])`：对浮点向量执行确定性的随机化 Hadamard 变换。这是一种正交且保持范数的旋转，可用于在量化前对嵌入向量进行预处理；截断后还可用作 Johnson–Lindenstrauss / 子采样随机化 Hadamard 随机投影。[#108227](https://github.com/ClickHouse/ClickHouse/pull/108227) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 实现聚合函数 `mergedJSONPatch`，用于对 JSON 值进行 RFC 7396 风格的 merge-patch 聚合，支持状态合并，并可在 AggregatingMergeTree 中使用。用户可以将时间戳或其他排序列作为排序键对 JSON 列进行聚合，从而计算出最新状态。[#108349](https://github.com/ClickHouse/ClickHouse/pull/108349) ([larryluogit](https://github.com/larryluogit))。
* 新增函数 `xxHash64Spark`，该函数使用种子 `42` 为 `String` 和 `NULL` 输入计算与 Spark 兼容的 `xxHash64` 值，并返回 `Int64`。[#108436](https://github.com/ClickHouse/ClickHouse/pull/108436) ([lalitium](https://github.com/lalitium))。
* 新增 `digits(n, offset[, length])` 函数，用于返回 `n` 中从索引 `offset(1-indexed)` 处开始、共 `length` 位的数字。如果未指定 `length`，则返回从 offset 处直到末尾的数字。[#109012](https://github.com/ClickHouse/ClickHouse/pull/109012) ([1000ms](https://github.com/1000ms))。
* 新增 `sqr` 算术函数，用于计算数值的平方。[#109061](https://github.com/ClickHouse/ClickHouse/pull/109061) ([lalitium](https://github.com/lalitium))。
* 新增量化转置距离函数 `cosineDistanceTransposedQuantized`、`L2DistanceTransposedQuantized` 和 `dotProductTransposedQuantized`，这些函数作用于由 `quantizeBFloat16ToInt8` Lloyd-Max 编码构成的 `QBit(Int8)`，并在计算时实时对已存储的编码进行反量化。浮点参考向量作为全精度查询向量，以 `Float32` precision 进行比较 (`Float64` 查询向量会被收窄) ；`Array(Int8)` 参考向量本身也会被反量化，从而计算对称的量化对量化距离。[#109405](https://github.com/ClickHouse/ClickHouse/pull/109405) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增函数 `dictGetRoot`，用于返回层级字典中某个键的最顶层祖先 (即根节点) ，可作为 `dictGetHierarchy(dict_name, key)[-1]` 的便捷替代写法。[#109459](https://github.com/ClickHouse/ClickHouse/pull/109459) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 `mergeTreeCodecBlockCounts(database, table)` 表函数，可按 `MergeTree` 表的 (分片、列、子流) 维度，统计使用各编解码器的压缩块数量。[#109623](https://github.com/ClickHouse/ClickHouse/pull/109623) ([rienath](https://github.com/rienath))。
* 新增函数 `notHas`，作为 `has` 在数组、map 和 JSON 上的取反形式。当被查找对象为常量数组时，`optimize_rewrite_has_to_in` (默认启用) 会将 `notHas(constant_array, x)` 重写为 `x NOT IN constant_array`，从而通过集合查找执行，并可像 `NOT IN` 一样利用主键索引进行裁剪。[#109926](https://github.com/ClickHouse/ClickHouse/pull/109926) ([nihalzp](https://github.com/nihalzp))。
* 新增 `MultiPoint` 地理数据类型，以 `Array(Point)` 形式存储，并已纳入 `Geometry` 类型。[#109951](https://github.com/ClickHouse/ClickHouse/pull/109951) ([davidmenggx](https://github.com/davidmenggx))。
* 函数 `arrayElement` (即 `vec[n]` 运算符) 和 `arraySlice` 现已支持 `QBit` 数据类型：`qbit[n]` 以全精度返回第 n 个向量元素，`arraySlice(qbit, offset, length)` 返回在部分维度上的投影。两者都只读取所需 stride 组的比特平面，且与 stride 组边界对齐的切片会直接复用已存储的流，无需复制。[#109953](https://github.com/ClickHouse/ClickHouse/pull/109953) ([Utkal059](https://github.com/Utkal059))。
* 为文本索引和 `tokens` 函数新增 `splitByRegexp` 分词器。它以正则表达式作为分隔符将输入拆分为标记，例如 `tokenizer = splitByRegexp('[^\p{L}\p{N}#+]+')`，从而可以保留 `C++`、`C#` 等包含特殊字符的标记，避免像其他分词器那样将其拆开。[#110002](https://github.com/ClickHouse/ClickHouse/pull/110002) ([Ergus](https://github.com/Ergus))。
* 新增函数 `geometryIntersectCartesian` 和 `geometryIntersectSpherical`，用于判断两个几何对象是否相交。与 `polygonsIntersectCartesian`/`polygonsIntersectSpherical` 不同，这两个函数支持任意几何数据类型 (`Point`、`LineString`、`MultiLineString`、`Ring`、`Polygon`、`MultiPolygon`) ，包括通用的 `Geometry` 类型，且两个参数的类型可以不同。[#110062](https://github.com/ClickHouse/ClickHouse/pull/110062) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 原生 ORC 读取器现已支持 ORC 的 `uniontype`，并将其映射为 ClickHouse 的 `Variant` 类型 (此前此类列会因 `Unsupported ORC type` 而被拒绝) 。[#110078](https://github.com/ClickHouse/ClickHouse/pull/110078) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 原生 ORC 输出格式现已支持写入 ClickHouse 的 `Variant` 类型，并将其映射为 ORC 的 `uniontype` (此前会报错 `ILLEGAL_COLUMN`) 。[#110085](https://github.com/ClickHouse/ClickHouse/pull/110085) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增帧格式，可通过新设置 `framing_output_format` 选择：帧格式会将查询响应的各个部分复用到单个 HTTP 响应流中，包括数据块、总计值和极值、进度数据包、性能事件、服务器日志以及异常。目前已实现的帧格式有：`None` (默认值，行为与之前完全一致) 、`EventStream` (HTTP 服务器发送事件) 、`JSONEachPacketBase64` 和 `JSONEachPacketString` (每个数据包对应一个 JSON 对象，数据分别以 base64 编码或字符串形式表示) 。[#110127](https://github.com/ClickHouse/ClickHouse/pull/110127) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 `bigquery` 表函数和 `BigQuery` 表引擎，用于读写 Google BigQuery 表 (包括公共数据集) 。表结构会根据 BigQuery 表的 schema 自动推断。身份验证支持 OAuth 访问令牌、JSON 格式的服务账号密钥，以及带刷新令牌的 OAuth 客户端。[#110166](https://github.com/ClickHouse/ClickHouse/pull/110166) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增函数 `aiRedact`，借助 LLM 提供商检测文本中的个人身份信息 (PII) 并进行脱敏。可指定需要脱敏的类别 (例如 `['email', 'name']`) ，也可传入空数组以使用默认的 PII 类别集合。匹配到的值会被替换为标记 (默认为 `[REDACTED]`) 。[#110464](https://github.com/ClickHouse/ClickHouse/pull/110464) ([davidmenggx](https://github.com/davidmenggx))。
* 新增 `aiFilter` 函数，借助 LLM 判断文本是否满足自然语言描述的条件，并返回 `UInt8`，可用于 `WHERE`、`PREWHERE` 和 `JOIN ... ON`。[#110594](https://github.com/ClickHouse/ClickHouse/pull/110594) ([ylw510](https://github.com/ylw510))。
* `PostgreSQL` 表引擎、`postgresql` 表函数、`PostgreSQL` 和 `MaterializedPostgreSQL` 数据库引擎以及 `PostgreSQL` 字典现已支持通过 TLS/SSL 连接 PostgreSQL：支持 `sslmode` 以及证书和私钥，二者既可以直接以内容形式提供 (`sslrootcert_pem`、`sslcert_pem`、`sslkey_pem`；会像密码一样进行掩码处理) ，也可以以路径形式提供 (`sslrootcert`、`sslcert`、`sslkey`；仅可在服务器配置文件中定义的命名集合中指定) 。[#110615](https://github.com/ClickHouse/ClickHouse/pull/110615) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `postgresql` 表函数和 `PostgreSQL` 表引擎现在可以通过 PostgreSQL 协议连接到另一台 ClickHouse 服务器 (仅限指定表名的情况；暂不支持 `query(...)` 形式) 。新增 PostgreSQL 兼容函数 `format_type` 和 `current_setting`。[#110760](https://github.com/ClickHouse/ClickHouse/pull/110760) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增函数 `aiSimilarity`，使用嵌入模型计算两段文本之间的语义相似度。返回 `[-1, 1]` 范围内的 `Nullable(Float32)` 值，其中 `1` 表示两段文本完全相同；若某个操作数为 `NULL`/空值，或其嵌入计算失败，则返回 `NULL`。[#110777](https://github.com/ClickHouse/ClickHouse/pull/110777) ([davidmenggx](https://github.com/davidmenggx))。
* 新增 `Remote` 和 `RemoteSecure` 数据库引擎，可实时访问远程 ClickHouse 服务器上某个数据库中的表，并将 `SELECT` 和 `INSERT` 查询转发至该服务器。它们相当于 `MySQL` 和 `PostgreSQL` 数据库引擎在 ClickHouse 之间互访场景下的对应实现。[#110975](https://github.com/ClickHouse/ClickHouse/pull/110975) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* SQL 查询支持管道运算符：`FROM t |> WHERE x > 1 |> AGGREGATE count() AS c GROUP BY y |> ORDER BY c DESC |> LIMIT 10`，与 GoogleSQL 的管道语法类似。任何 `SELECT` 查询之后都可以接一串 `|>` 运算符，每个运算符都会将其前面的查询包装为子查询，因此生成的 AST 与使用嵌套子查询的等效查询相同。在以 `FROM` 子句开头的查询中，`SELECT` 子句现在可以省略，默认为 `SELECT *`。[#111151](https://github.com/ClickHouse/ClickHouse/pull/111151) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增聚合函数 `gini`，用于计算有限非负数值的基尼系数，支持分组聚合和分布式聚合。[#112280](https://github.com/ClickHouse/ClickHouse/pull/112280) ([amirreza1307](https://github.com/amirreza1307))。[#114643](https://github.com/ClickHouse/ClickHouse/pull/114643) ([groeneai](https://github.com/groeneai))。
* `PNG` 输出格式支持动画 PNG。通过 `t` 列可将查询结果生成为动画，`t` 的时间刻度由 `output_format_image_time_multiplier_seconds` 和 `output_format_image_time_divisor_seconds` 设置；启用 `output_format_image_streaming_animation` 后，帧会在查询生成时即时写出，而不是缓存在内存中。[#112846](https://github.com/ClickHouse/ClickHouse/pull/112846) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在 `system.mutations` 中新增 `finish_time` 列，用于记录变更的完成时间。对于未完成的变更以及完成时间未知的变更，该列值为零。[#113474](https://github.com/ClickHouse/ClickHouse/pull/113474) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 为 `system.metric_log` 新增 `bucketed` 模式类型，它采用包含 128 个桶的分桶 `Map` 序列化，将所有指标存储在单个 `Map(Enum16(...), Int64)` 列中，并为每个指标提供一个 `ALIAS` 列以保持兼容：该表仅由少量列组成，而非数千列；零值不会被存储；读取单个指标时只需读取 128 个桶中的一个。此外，键为 `Enum` 的 `Map` 现在可以通过枚举值的字符串名称进行索引，例如 `map['name']`。[#115380](https://github.com/ClickHouse/ClickHouse/pull/115380) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 为 `tokens` 函数和 `MergeTree` 文本索引新增 `chinese` 分词器。它使用字典和隐马尔可夫模型 (算法参考 [jieba](https://github.com/fxsjy/jieba)) 对中文文本进行分词，支持 `coarse_grained` (默认) 和 `fine_grained` 两种粒度。[#89945](https://github.com/ClickHouse/ClickHouse/pull/89945) ([amosbird](https://github.com/amosbird))。
* 新增 `groupFormat` 聚合函数，使用指定的输出格式对每个分组中的行进行格式化，并以字符串形式返回结果。[#93201](https://github.com/ClickHouse/ClickHouse/pull/93201) ([wandersofb](https://github.com/wandersofb))。
* 新增聚合函数组合器 `-Tuple`，它将底层聚合函数分别独立应用于 `Tuple` 列的每个元素，并以 `Tuple` 形式返回各结果，同时保留元素名称：对于 `t = (a, b)`，`sumTuple(t)` 返回 `(sum(a), sum(b))`。对于有多个参数的聚合函数，每个参数各传入一个 tuple，并按位置一一配对：`corrTuple((a1, a2), (b1, b2))` 返回 `(corr(a1, b1), corr(a2, b2))`。与作用于数组的 `-ForEach` 不同，各元素的类型可以不同，且每个元素的结果类型和名称均会保留。[#98190](https://github.com/ClickHouse/ClickHouse/pull/98190) ([RinChanNOWWW](https://github.com/RinChanNOWWW))。

<h3 id="sql-and-query-features">
  SQL 与查询功能
</h3>

* 新增在 projection 定义中支持 WHERE 子句。带有 WHERE 的 projection 仅物化满足谓词条件的行；当查询的 WHERE 条件蕴含 projection 的 WHERE 条件时，优化器可基于代价选择使用这些 projection。[#102347](https://github.com/ClickHouse/ClickHouse/pull/102347) ([SBALAVIGNESH123](https://github.com/SBALAVIGNESH123))。
* 新增在 HTTP 接口中通过 URL 路径访问表和数据库的方式 (例如 \`/database/table.format.gz?filter=a>0\`) ，并新增一系列设置 (\`http\_allow\_database\_as\_path\`、\`http\_allow\_table\_as\_file\`、\`http\_allow\_filters\_as\_path\`、\`http\_allow\_filters\_as\_unrecognized\_url\_parameters\`、\`select\`、\`order\`、\`sort\`、\`filter\`、\`page\`、\`compression\`、\`format\`、\`input\_format\`、\`output\_format\`、\`default\_format\`、\`database\`) ，这些设置既可相互组合，也可与现有的 \`query\` URL 参数搭配使用。[#105249](https://github.com/ClickHouse/ClickHouse/pull/105249) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 `Remote` 和 `RemoteSecure` 表引擎，即 `remote` 和 `remoteSecure` 表函数的持久化版本。现在除 `CREATE TABLE ... AS remote(...)` 外，也可使用 `CREATE TABLE ... ENGINE = Remote('addresses', db, table, ...)`。[#106189](https://github.com/ClickHouse/ClickHouse/pull/106189) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增用于分析查询性能的 `EXPLAIN ANALYZE`：该命令会实际执行查询，并以熟悉的查询计划格式展示实际的执行指标。[#106586](https://github.com/ClickHouse/ClickHouse/pull/106586) ([Fgrtue](https://github.com/Fgrtue))。[#110668](https://github.com/ClickHouse/ClickHouse/pull/110668) ([Fgrtue](https://github.com/Fgrtue))。
* 新增与引擎无关的 `SYSTEM STOP`、`SYSTEM START`、`SYSTEM PAUSE`、`SYSTEM CANCEL` 和 `SYSTEM REFRESH` 命令，以及作用于整个服务器的 `... ALL BACKGROUND` 形式，可通过统一的接口控制 `Kafka`、`RabbitMQ`、`NATS`、`S3Queue`/`AzureQueue` 表以及可刷新 materialized view 的后台活动。对于可刷新 materialized view，这些命令是现有 `SYSTEM ... VIEW` 命令的别名。为在 NATS 上支持这些控制，JetStream 表现在仅在插入成功后才确认消息 (至少一次语义；此前消息在投递时即被自动确认，一旦插入失败便可能丢失) 。新增 `nats_wait_for_flush_interval` 设置 (默认 `false`，保持此前的低延迟行为) ，启用后会在整个刷写时间间隔内保持消费周期开启，而不是在队列清空后立即刷写。新增 `nats_commit_on_select` 设置，启用后直接对 JetStream 表执行 `SELECT` 会消费 (确认) 所读取的消息。[#107476](https://github.com/ClickHouse/ClickHouse/pull/107476) ([NIKTONIKTO717](https://github.com/NIKTONIKTO717))。
* `mysql`、`postgresql` 和 `sqlite` 表函数及表引擎现支持接收用户自定义查询 (而非表名) ，并将其原样传递给外部数据库，写法可以是子查询 `(SELECT ...)`，也可以是 `query('SELECT ...')`。结果表的结构根据查询结果推断，且此类表为只读。[#107740](https://github.com/ClickHouse/ClickHouse/pull/107740) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 引入 `QueryRunner` 表引擎。插入 `QueryRunner` 表的每条记录都代表一个由该引擎执行的查询。该引擎可用于异步执行查询、批量执行生成的查询、将查询路由到远程集群、基准测试、模糊测试，以及基于影子流量的测试。[#107888](https://github.com/ClickHouse/ClickHouse/pull/107888) ([mstetsyuk](https://github.com/mstetsyuk))。
* 窗口函数支持 `GROUPS` 窗口帧模式 (SQL:2011) ，例如 `any(price) OVER (PARTITION BY symbol ORDER BY ts GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING)`。在 `GROUPS` 窗口帧中，边界以完整的对等组为单位计数 (对等组即在 `ORDER BY` 键上取值相同的一组行) ，因此 `N PRECEDING`/`N FOLLOWING` 表示当前行所在对等组之前/之后的 `N` 个对等组，而非物理行数 (`ROWS`) 或 `ORDER BY` 值的距离 (`RANGE`) 。[#108653](https://github.com/ClickHouse/ClickHouse/pull/108653) ([nihalzp](https://github.com/nihalzp))。
* 普通的 `CREATE MATERIALIZED VIEW ... POPULATE` 现在具备本地原子性：视图订阅源表的新插入数据与对现有数据创建快照这两个操作，会在源表上的一个短暂排他锁内一并完成，因此在填充期间通过同一服务器并发插入的行不会再被遗漏或重复 (新增设置 `materialized_views_populate_atomically`，默认启用) 。该保证仅覆盖本地插入路径——到达其他副本或经由分布式写入路径的插入不在保证范围内——且要求源表能够提供固定快照 (`MergeTree` 系列和 `Memory`) ；对于其他源表，以及 `CREATE OR REPLACE` / `REPLACE` 和在 `Replicated` 数据库中创建的视图，仍沿用原有的非原子填充方式。此外，`POPULATE` 现在也可以与 `TO` 搭配使用，用于回填目标表。[#108715](https://github.com/ClickHouse/ClickHouse/pull/108715) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `ALTER USER`、`ALTER ROLE` 和 `ALTER SETTINGS PROFILE` 现在支持将 `SET name = value` 作为 `MODIFY SETTING name = value` 的别名。该语法仅就地修改指定的设置，其余设置保持不变；而单独使用的 `SETTINGS` 子句则会替换整个设置列表。这样可以降低误清除用户其他设置的风险。[#108722](https://github.com/ClickHouse/ClickHouse/pull/108722) ([groeneai](https://github.com/groeneai))。
* 支持 `ALTER TABLE ... MODIFY CONSTRAINT [IF EXISTS] name CHECK expr`，可就地修改现有约束的表达式。[#108768](https://github.com/ClickHouse/ClickHouse/pull/108768) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增基于排序的 IEJoin 算法，适用于 `ON` 子句中在被连接表之间包含两个不等式比较 (`<`、`<=`、`>`、`>=`) 的连接，在 `join_algorithm` 设置中添加 `ie_join` 即可启用。支持的连接类型包括 `ALL INNER/LEFT/RIGHT/FULL JOIN` 和 `SEMI`/`ANTILEFT/RIGHT JOIN`。此前，此类查询会以带过滤条件的 `CROSS JOIN` 方式执行 (仅支持 `INNER`) ，在大表上速度要慢得多。[#109920](https://github.com/ClickHouse/ClickHouse/pull/109920) ([vdimir](https://github.com/vdimir))。
* 新增系统表 `system.user_query_log`，每个用户都可以通过它查看自己的查询日志记录，而无需拥有查询日志表的访问权限。最初的构想与实现出自 Yue Ni (@niyue)。[#110156](https://github.com/ClickHouse/ClickHouse/pull/110156) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增设置 `run_query_in_background`。启用后，服务器接收查询后会立即返回空结果，并且无论连接状况如何，都会将查询执行完毕，执行结果将被丢弃。可通过 `query_id` 在 `system.processes` 和 `system.query_log` 中跟踪该查询。适用于 `INSERT ... SELECT`、`CREATE TABLE … AS SELECT` 或 `CREATE MATERIALIZED VIEW … POPULATE` 等不应因连接断开而中止的长时间运行查询。[#112816](https://github.com/ClickHouse/ClickHouse/pull/112816) ([mstetsyuk](https://github.com/mstetsyuk))。
* 支持 ALTER TABLE ... MODIFY PROJECTION，可修改现有 projection 的 projection 级别设置 (例如 index\_granularity) ，而无需重建该 projection。新设置会在后续合并过程中以惰性方式生效。[#113343](https://github.com/ClickHouse/ClickHouse/pull/113343) ([diegomestre2](https://github.com/diegomestre2))。
* 面向数据湖的 S3 tables 引擎目录现在不仅支持查询现有表，还支持 `INSERT`。[#113505](https://github.com/ClickHouse/ClickHouse/pull/113505) ([scanhex12](https://github.com/scanhex12))。
* `Iceberg` 目录现已支持通过 `catalog_type = 'horizon'` 接入 Snowflake Horizon Catalog，可读写由 Snowflake 托管的 `Iceberg` 表。[#114547](https://github.com/ClickHouse/ClickHouse/pull/114547) ([melvynator](https://github.com/melvynator))。
* 新增 `skip_unavailable_shards_mode` 设置 (也可作为 `Distributed` 引擎设置使用) ，用于在启用 `skip_unavailable_shards` 时控制静默忽略远程分片的哪些异常，从而在分布式环境中更精细地控制查询行为。[#79091](https://github.com/ClickHouse/ClickHouse/pull/79091) ([byte-sourcerer](https://github.com/byte-sourcerer))。

<h3 id="storage-data-lakes-and-object-storage">
  存储、数据湖和对象存储
</h3>

* 新增对 Puffin 文件格式的支持 ([https://iceberg.apache.org/puffin-spec/](https://iceberg.apache.org/puffin-spec/)) 。现在可以在 `file`、`url`、`s3` 等表函数中使用该格式。[#103936](https://github.com/ClickHouse/ClickHouse/pull/103936) ([scanhex12](https://github.com/scanhex12))。
* 为 `MergeTree` 表新增 “packed” 数据分区片段存储方式，将一个 part 的所有文件存入单个归档文件 (`data.packed`) ，而不是每个 stream 各对应一个文件。该功能由 `min_bytes_for_full_part_storage`、`min_rows_for_full_part_storage` 和 `min_level_for_full_part_storage` 设置控制，默认禁用。兼容性说明：表一旦写入 packed parts，旧版本服务器便无法读取，因此启用此格式后将无法降级服务器。[#108118](https://github.com/ClickHouse/ClickHouse/pull/108118) ([Algunenano](https://github.com/Algunenano))。
* 为 NATS 表引擎新增 `nats_credentials` 设置，允许用户以字符串形式内联指定 NATS 凭证 (内容与 `.creds` 文件的载荷一致) 。[#110733](https://github.com/ClickHouse/ClickHouse/pull/110733) ([addshore](https://github.com/addshore))。

<h3 id="data-formats-and-ingestion">
  数据格式与摄取
</h3>

* 新增 `HiveText` 输出格式，以 Apache Hive `LazySimpleSerDe` 文本形式写入数据。字段以 `\x01` 分隔，行分隔符由新增的 `format_hive_text_rows_delimiter` 设置指定 (默认为 `\n`) ，嵌套的 `Array`、`Map` 和 `Tuple` 值则使用 Hive 的分隔符列表。该输出格式以 Hive 默认的 `LazySimpleSerDe` 为目标；对于嵌套值或自定义行分隔符，它与 ClickHouse 的 `HiveText` 输入格式并不对称。[#107582](https://github.com/ClickHouse/ClickHouse/pull/107582) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 `GeoJSON` 输出格式，用于写入每行对应一个 feature 的 GeoJSON `FeatureCollection` 文档。新增的 `format_geojson_validate_geometry` 设置 (默认启用) 会在读取和写入时校验 GeoJSON 几何形态；此外，`GeoJSON` 输入格式现在会将 `id` 推断为 `Nullable(String)`，从而将缺失或为 `null` 的 ID 与空字符串区分开来。[#108065](https://github.com/ClickHouse/ClickHouse/pull/108065) ([nihalzp](https://github.com/nihalzp))。

<h3 id="settings-access-and-observability">
  设置、访问与可观测性
</h3>

* 新增内置文档搜索页面，可通过 HTTP 接口的 `/docs` 路径访问，支持对 `system.documentation` 表进行即时搜索，并可渲染参考文档 (支持语法高亮、数学公式和交叉链接) 。[#108345](https://github.com/ClickHouse/ClickHouse/pull/108345) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增基于 MeCab 形态分析器的日语分词器，可用于文本索引以及 tokens/hasAnyTokens/hasAllTokens 函数。字典在运行时从服务器配置中指定的位置加载，并在使用前通过 SHA-256 校验和进行校验。[#111420](https://github.com/ClickHouse/ClickHouse/pull/111420) ([Ergus](https://github.com/Ergus))。
* 新增文件系统缓存设置 `system_cache_extensions`，用于在启用 `use_split_cache` 时控制哪些文件存储在系统缓存中。[#111575](https://github.com/ClickHouse/ClickHouse/pull/111575) ([kirillgarbar](https://github.com/kirillgarbar))。
* 新增 `always_fetch_mutated_part` 设置，允许副本直接从其他副本下载已变更的 parts，而无需在本地执行变更。[#113020](https://github.com/ClickHouse/ClickHouse/pull/113020) ([rorylshanks](https://github.com/rorylshanks))。

<h3 id="other-new-features">
  其他新功能
</h3>

* 负数 `LIMIT` 现已支持 `WITH TIES`。[#100930](https://github.com/ClickHouse/ClickHouse/pull/100930) ([nihalzp](https://github.com/nihalzp))。
* 新增 `restore_table_data`、`restore_access_entities` 和 `restore_functions` 恢复设置，用于精细控制要恢复的内容。这些设置可按类别分别覆盖 `structure_only`，例如 `structure_only=true, restore_access_entities=true` 会恢复表定义和访问实体，但不恢复表数据。[#102402](https://github.com/ClickHouse/ClickHouse/pull/102402) ([fm4v](https://github.com/fm4v))。
* 现在可以在字典定义中通过 `dictionary_lazy_load` 为单个字典配置延迟加载，以覆盖全局服务器设置 `dictionaries_lazy_load`。这样即可让部分字典延迟加载，其余字典则立即加载。[#108314](https://github.com/ClickHouse/ClickHouse/pull/108314) ([mstetsyuk](https://github.com/mstetsyuk))。
* 数组下标运算符支持以整数数组作为索引：`arr[indexes]` 返回所有指定位置上的元素，等价于 `arrayMap(i -> arr[i], indexes)`。[#108371](https://github.com/ClickHouse/ClickHouse/pull/108371) ([ucasfl](https://github.com/ucasfl))。
* 新增函数 `geoToUTM`、`UTMToGeo`、`geoToMGRS` 和 `MGRSToGeo`，用于在 WGS84 地理坐标与 UTM、MGRS 坐标系之间相互转换。[#108939](https://github.com/ClickHouse/ClickHouse/pull/108939) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 `SYSTEM UNLOAD DICTIONARY` 和 `SYSTEM UNLOAD DICTIONARIES` 命令，可在不删除字典定义的前提下释放字典占用的内存。字典将在下次访问时延迟重新加载。[#109639](https://github.com/ClickHouse/ClickHouse/pull/109639) ([Manerone](https://github.com/Manerone))。
* 为文本索引以及 `tokens`、`hasAnyTokens` 和 `hasAllTokens` 函数新增 `icu` 分词器，提供可感知区域设置的 Unicode 词语分割 (包括针对中文、日文、泰文等语言的基于字典的分割) 。[#109940](https://github.com/ClickHouse/ClickHouse/pull/109940) ([Ergus](https://github.com/Ergus))。
* 新增编解码器 `ZXC`——一种非对称 LZ 编解码器，压缩较慢但解压缩极快，压缩率介于 `LZ4` 和 `ZSTD` 之间。[#110620](https://github.com/ClickHouse/ClickHouse/pull/110620) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 `s3_base` 设置，使 `s3`、`s3Cluster`、`gcs` 和 `oss` 表函数以及 `S3` 表引擎中的相对 URL 能够基于 S3 基础 URL 进行解析。新增 `URL` 数据库引擎，可基于可选的基础 URL 将表名解析为 URL，并将其分派到相应的后端。[#111512](https://github.com/ClickHouse/ClickHouse/pull/111512) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `url()` 和 `URL` 引擎现支持通配符展开，其方式是列出 HTTP 索引页 (HTML 或纯文本目录列表) 并提取匹配的 URL。通配符针对 URL 路径组件进行匹配，并对索引页大小和读取的目录数量设有上限。[#95181](https://github.com/ClickHouse/ClickHouse/pull/95181) ([niyue](https://github.com/niyue))。
* `kafka_sasl_mechanism` 新增支持值 `AWS_MSK_IAM`，使 ClickHouse 能够使用 IAM 角色向 Amazon MSK 进行身份验证，无需管理 SASL/SCRAM 凭证。[#96100](https://github.com/ClickHouse/ClickHouse/pull/96100) ([kalavt](https://github.com/kalavt))。
* 为文本索引新增后处理器，用于在标记化之后对标记进行转换。[#98939](https://github.com/ClickHouse/ClickHouse/pull/98939) ([Ergus](https://github.com/Ergus))。

<h2 id="experimental-features">
  Experimental 功能
</h2>

<h3 id="experimental-query-planning-and-execution">
  查询规划与执行
</h3>

* 为可执行的用户自定义函数新增了"驱动程序"。在 `<user_defined_executable_function_drivers_config>` 中声明的驱动程序可用于 `CREATE FUNCTION name ARGUMENTS (...) RETURNS T ENGINE = DriverName(...) AS '...code...'`，在创建函数时编译或以其他方式处理用户代码片段，并生成可运行的可执行 UDF。生成的配置存储在 `<dynamic_user_defined_executable_functions_path>` 中，原始查询则以 `ATTACH FUNCTION` 的形式持久化，因此函数在服务器重启后依然可用。作为概念验证，`c_function_body` 驱动程序会以 `executable_pool` 模式在沙箱化的 Docker 容器中编译并运行 C 函数体。[#105131](https://github.com/ClickHouse/ClickHouse/pull/105131) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 发往 `/api/v1/query` 和 `/api/v1/query_range` 的 Prometheus Query API 请求现在会记录到 `system.query_log` 中，并包含 `read_rows` 和 `read_bytes` 指标。[#106611](https://github.com/ClickHouse/ClickHouse/pull/106611) ([JTCunning](https://github.com/JTCunning))。
* 启用 `make_distributed_plan` 时，支持对 MergeTree 家族表执行 `SELECT ... FINAL` 的分布式查询计划读取。[#108148](https://github.com/ClickHouse/ClickHouse/pull/108148) ([davenger](https://github.com/davenger))。
* 为 MergeTree 查询新增实验性的、基于查询计划的并行副本执行方式。[#108504](https://github.com/ClickHouse/ClickHouse/pull/108504) ([devcrafter](https://github.com/devcrafter))。
* 新增实验性表函数 `eval`，它将常量表达式求值为查询字符串，并执行由此得到的单个 `SELECT` 查询。该功能默认禁用，可通过设置 `allow_experimental_eval_table_function` 启用。作者：Yue Ni [#110132](https://github.com/ClickHouse/ClickHouse/pull/110132) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 基于查询计划的并行副本 (`parallel_replicas_plan_based`) ：本地/远程边界现在由作用于常规查询计划的计划级优化来确定；对包含 `UNION` 的视图的查询，无需启用 `parallel_replicas_allow_view_over_mergetree` 即可并行执行。使用 `IN (subquery)` 的查询现在会回退到本地查询计划，而不再直接报错。[#111063](https://github.com/ClickHouse/ClickHouse/pull/111063) ([devcrafter](https://github.com/devcrafter))。[#112443](https://github.com/ClickHouse/ClickHouse/pull/112443) ([devcrafter](https://github.com/devcrafter))。
* 增强实验性 AI 函数的安全性：默认拒绝指向远程主机的不安全 (`http`) 端点 (新增设置 `ai_function_allow_insecure_endpoint`) ，默认限制每个查询的出站 API 调用次数 (`ai_function_max_api_calls_per_query` 现默认为 `1000`) ，并对写入日志的提供方错误响应进行脱敏处理。[#111286](https://github.com/ClickHouse/ClickHouse/pull/111286) ([george-larionov](https://github.com/george-larionov))。
* 基于查询计划的并行副本 (`parallel_replicas_plan_based`) 现在可以分布式执行符合条件的 JOIN (`INNER`、`LEFT`、`RIGHT`，包括 `SEMI`/`ANTI`) ：整个连接在同一个分布式查询计划片段中执行，其中一侧由各副本协同处理，另一侧则进行广播。[#112268](https://github.com/ClickHouse/ClickHouse/pull/112268) ([devcrafter](https://github.com/devcrafter))。
* 分布式查询 (`make_distributed_plan = 1`) 被取消时，会报告导致取消的具体错误，而不再只返回 `QUERY_WAS_CANCELLED`。此前，失败的工作线程任务的真实错误只能在服务器日志中查看。[#112590](https://github.com/ClickHouse/ClickHouse/pull/112590) ([davenger](https://github.com/davenger))。
* 支持分布式执行包含 `IN (subquery)` 的查询计划，而无需将其改写为 `JOIN`。该集合仅在发起节点上构建一次，其值随工作线程任务一并下发。移除了对 `rewrite_in_to_join` 的强制覆盖；该改写仍可通过显式设置启用。[#113826](https://github.com/ClickHouse/ClickHouse/pull/113826) ([davenger](https://github.com/davenger))。
* 分布式查询计划 (`make_distributed_plan`) 现在会在满足 `LIMIT` 后停止其上游阶段，而不再先计算出完整结果再将其丢弃。[#114806](https://github.com/ClickHouse/ClickHouse/pull/114806) ([davenger](https://github.com/davenger))。
* 修复了 PromQL 查询在范围选择器中使用 `offset` (例如 `rate(m[2m] offset 5m)`) 时出现的错误 `Illegal type Decimal(18, 0) of argument of function toIntervalNanosecond`。[#114997](https://github.com/ClickHouse/ClickHouse/pull/114997) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 由 Cascades 优化器构建的分布式查询计划现已支持 `GROUPING SETS` 聚合 (`make_distributed_plan = 1, enable_cascades_optimizer = 1`) 。[#115426](https://github.com/ClickHouse/ClickHouse/pull/115426) ([davenger](https://github.com/davenger))。
* `TimeSeries` 表现在可以维护一张“最近样本”表：当新的引擎设置 `recent_samples_ttl_seconds` 不为零时，引擎会为样本表创建一个带生存时间 (TTL) 的副本 (按 `recent_samples_partition_by` 分区，默认按天分区) ，每次插入时都会同步写入；时间范围落在生存时间 (TTL) 窗口内的 PromQL 查询会自动从该副本读取数据，使大表上的告警/记录规则以及短时间范围仪表盘的速度提升数倍。可通过新的查询级别设置 `time_series_prefer_recent_samples_table` 关闭这一优先读取策略。[#115441](https://github.com/ClickHouse/ClickHouse/pull/115441) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 分布式查询计划 (`make_distributed_plan`) 现在会在 `LIMIT` 满足后及时停止空闲的上游阶段：空闲的 exchange sink 会在 `NoMoreDataNeeded` 到达后立即读取该信号，空闲的 exchange source 则会察觉其输出已关闭，并将停止信号转发给上游。此前，这些阶段会继续读取和计算无人消费的数据。[#115690](https://github.com/ClickHouse/ClickHouse/pull/115690) ([davenger](https://github.com/davenger))。
* 启用 `parallel_replicas_plan_based` 后，自动并行副本功能现在可以收集运行时统计信息，并为受支持的查询启用并行副本。[#115788](https://github.com/ClickHouse/ClickHouse/pull/115788) ([devcrafter](https://github.com/devcrafter))。
* 新增面向分布式查询计划的实验性 Cascades 基于代价的优化器，可通过同时设置 `enable_cascades_optimizer = 1` 和 `make_distributed_plan = 1` 启用。它会根据估算代价进行选择：join 策略可选 shuffle、broadcast、replicated 或本地 join；聚合方式可选两阶段、shuffle 或本地聚合；此外还支持两阶段分布式 top-N，以及并行读取和副本读取，并按需插入 exchange 算子。[#86353](https://github.com/ClickHouse/ClickHouse/pull/86353) ([davenger](https://github.com/davenger))。

<h3 id="experimental-storage-data-lakes-and-indexes">
  存储、数据湖与索引
</h3>

* 新增内存 SLRU 缓存，用于缓存反序列化后的 Paimon 元数据文件 (manifest 列表和清单) 。通过 `use_paimon_metadata_files_cache` 设置启用后，对同一 Paimon 表的重复查询无需再从对象存储重新下载和解析元数据。[#104657](https://github.com/ClickHouse/ClickHouse/pull/104657) ([Binnn-MX](https://github.com/Binnn-MX))。
* Experimental `ReaderExecutor` (`use_reader_executor`，默认关闭) 现在可以保持远程源连接处于打开状态，并在多次顺序读取之间复用该连接，从而减少扫描时的对象存储请求次数。[#107735](https://github.com/ClickHouse/ClickHouse/pull/107735) ([CheSema](https://github.com/CheSema))。
* 为 Experimental `ReaderExecutor` 的读取路径 (`use_reader_executor`，默认禁用) 新增读穿透 (read-through) 文件系统缓存。[#110029](https://github.com/ClickHouse/ClickHouse/pull/110029) ([CheSema](https://github.com/CheSema))。
* 新增实验性 `MergeTree` 设置 `allow_experimental_adaptive_codec_selection`。启用后，对于使用默认编解码器的列，合并和变更操作会针对每个数据块选择压缩后输出最小的编解码器。[#111834](https://github.com/ClickHouse/ClickHouse/pull/111834) ([rienath](https://github.com/rienath))。
* 为 Experimental `ReaderExecutor` 的读取路径 (`use_reader_executor`，默认关闭) 新增用户态页缓存层。缓存未命中时，executor 会将数据填充到用户态页缓存中，后续读取则以零拷贝方式直接从该缓存获取。[#114890](https://github.com/ClickHouse/ClickHouse/pull/114890) ([CheSema](https://github.com/CheSema))。
* 现在可以通过 `OPTIMIZE TABLE ... MANIFEST` 对 `Iceberg` manifest 文件进行合并整理，以减少元数据文件数量。该功能需通过 `allow_experimental_iceberg_compaction` 设置启用。[#98178](https://github.com/ClickHouse/ClickHouse/pull/98178) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni))。

<h3 id="experimental-functions-formats-and-ai">
  函数、格式与 AI
</h3>

* Experimental：当谓词能将列精确划分为默认值与非默认值时，可直接利用 `serialization.json` 中的按列稀疏性统计信息响应 `SELECT count(*) FROM t WHERE col <op> default(col)`，无需扫描任何数据。[#105890](https://github.com/ClickHouse/ClickHouse/pull/105890) ([Algunenano](https://github.com/Algunenano))。
* 新增 experimental 的 `Quantize(...)` 向量编解码器系列，以及一种可选启用的两阶段近似向量搜索重写机制，该机制基于量化的伴随数据流运行。[#108565](https://github.com/ClickHouse/ClickHouse/pull/108565) ([shankar-iyer](https://github.com/shankar-iyer))。
* 重新启用 experimental 的 `SZ3` 误差有界有损压缩编解码器，适用于 `Float32`/`Float64` 类型的列 (及其数组) 。需要启用 `allow_experimental_codecs`。[#108788](https://github.com/ClickHouse/ClickHouse/pull/108788) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了读取经 experimental `SZ3('ALGO_LORENZO_REG', ...)` 编解码器压缩的数据时报 `CORRUPTED_DATA` 错误的问题，并避免了使用 experimental `SZ3` 编解码器压缩非有限浮点值 (`NaN` 和无穷大) 时出现未定义行为。[#110762](https://github.com/ClickHouse/ClickHouse/pull/110762) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* PromQL：日期/时间函数 (`hour()`、`minute()`、`month()`、`year()`、`day_of_week()`、`day_of_month()`、`day_of_year()`、`days_in_month()`) 现在可以不带参数调用，此时与 Prometheus 一致，默认使用 `vector(time())`。[#111869](https://github.com/ClickHouse/ClickHouse/pull/111869) ([valerypetrov](https://github.com/valerypetrov))。
* PromQL：修复了对不带标签的瞬时向量执行操作时因类型错误而失败的问题，例如 `vector(1) + vector(2)`、`topk(1, vector(1))`、`label_replace(vector(1), ...)` 以及带 `on()` 的二元运算符。[#111872](https://github.com/ClickHouse/ClickHouse/pull/111872) ([valerypetrov](https://github.com/valerypetrov))。
* PromQL：实现了 `deriv` 函数，同时修复了在毫秒级分辨率时间戳下，其底层聚合函数的返回值偏小 1000 倍的缺陷。[#112360](https://github.com/ClickHouse/ClickHouse/pull/112360) ([valerypetrov](https://github.com/valerypetrov))。
* 启用 `parallel_replicas_plan_based` 时，对 `ORDER BY` 查询应用按序读取优化：排序操作现在会下发到各副本，再在发起服务器上合并，使每个副本都按 sorting key 顺序读取数据。同时修复了启用该设置后，对非主键列执行 `ORDER BY` 时报 `Unknown function __topKFilter` 的问题。[#114315](https://github.com/ClickHouse/ClickHouse/pull/114315) ([devcrafter](https://github.com/devcrafter))。
* 修复了重新加载数据分区片段后 (例如执行 `ATTACH` 或重启服务器后) 的向量搜索读取问题：数据分区片段不再丢失其 `Quantized` 编解码器子列，因此搜索会读取量化子列，而不会回退到全精度列。[#114763](https://github.com/ClickHouse/ClickHouse/pull/114763) ([shankar-iyer](https://github.com/shankar-iyer))。
* experimental 的 `TimeSeries` 表引擎不再对 samples 内部表中自动创建的 `value` 列应用 `Gorilla` 编解码器，这些列现在默认使用 `CODEC(ZSTD(1))`。显式声明的列仍沿用用户指定的编解码器。`timestamp` 列的默认设置保持不变 (`CODEC(DoubleDelta, ZSTD(1))`) 。[#112110](https://github.com/ClickHouse/ClickHouse/pull/112110) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。[#114790](https://github.com/ClickHouse/ClickHouse/pull/114790) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 在以 `make_distributed_plan = 1` 执行的查询中支持 `ROLLUP`、`CUBE`、`GROUPING SETS` 以及 `grouping` 函数。[#114950](https://github.com/ClickHouse/ClickHouse/pull/114950) ([davenger](https://github.com/davenger))。
* 为实验性的 ALP 编解码器新增 Real Doubles (RD) 变体，并支持可选参数 `ALP(AUTO|STD|RD)`。不带参数的 ALP 现在会在现有的 STD 方案和 RD 之间自动选择，不再固定使用 STD。[#99654](https://github.com/ClickHouse/ClickHouse/pull/99654) ([nazarii-piontko](https://github.com/nazarii-piontko))。

<h3 id="other-experimental-features">
  其他 Experimental 功能
</h3>

* 通过 kafka\_partition\_shard\_num 和 kafka\_shard\_count 设置，为 StorageKafka2 添加静态的分区到分片亲和性，使多个 ClickHouse 分片能够以确定性的方式消费 Kafka 分区中互不相交的子集。[#108886](https://github.com/ClickHouse/ClickHouse/pull/108886) ([JingYanchao](https://github.com/JingYanchao))。
* 现在可以通过 `onelake_bearer_token` 设置，使用预先获取的 Bearer 令牌向 OneLake 进行身份验证，而无需使用 `onelake_client_id` 和 `onelake_client_secret`，从而避免共享长期有效的客户端密钥。该令牌不会自动刷新，因此令牌过期后必须重新创建数据库。[#109104](https://github.com/ClickHouse/ClickHouse/pull/109104) ([asya-ch](https://github.com/asya-ch))。
* 修复了打包到 `skp_idx.packed` (通过 `packed_skip_index_max_bytes`) 中的跳数索引的 `data_uncompressed_bytes` 值错误的问题：此前报告的未压缩大小实际上是压缩后的大小，这还可能导致 `distributed_index_analysis` 无法生效。[#109272](https://github.com/ClickHouse/ClickHouse/pull/109272) ([Algunenano](https://github.com/Algunenano))。
* 为实验性的 Prometheus 远程写入 v1 HTTP handler 添加了 Zstandard 压缩支持。[#110907](https://github.com/ClickHouse/ClickHouse/pull/110907) ([JTCunning](https://github.com/JTCunning))。
* PromQL：实现了函数 `clamp`、`clamp_min`、`clamp_max` 和 `round`。[#111870](https://github.com/ClickHouse/ClickHouse/pull/111870) ([valerypetrov](https://github.com/valerypetrov))。
* PromQL：当分位数级别超出 \[0, 1] 范围时，`quantile` 现在会与 Prometheus 一致，返回 -Inf/+Inf/NaN，而不再抛出错误；`histogram_quantile` 现在也会与 Prometheus 一致，忽略 `le` 标签缺失或无法解析的输入序列。[#111871](https://github.com/ClickHouse/ClickHouse/pull/111871) ([valerypetrov](https://github.com/valerypetrov))。
* PromQL：实现了函数 `changes()` 和 `resets()`。[#112352](https://github.com/ClickHouse/ClickHouse/pull/112352) ([valerypetrov](https://github.com/valerypetrov))。
* 现在可以正确收集通过 Prometheus 远程写入端点执行的插入统计信息和查询。[#112825](https://github.com/ClickHouse/ClickHouse/pull/112825) ([JTCunning](https://github.com/JTCunning))。
* PromQL：当除数为无穷大时，取模运算现在会保留有限值。[#113746](https://github.com/ClickHouse/ClickHouse/pull/113746) ([fallintoplace](https://github.com/fallintoplace))。
* 普通带引号的 PromQL 字符串中如果包含字面换行符，现在会被拒绝。[#114381](https://github.com/ClickHouse/ClickHouse/pull/114381) ([fallintoplace](https://github.com/fallintoplace))。
* 在启用实验性的 `make_distributed_plan` 和 `enable_cascades_optimizer` 时，设置过大的 `distributed_plan_workers_num` 不会再导致服务器因 `std::length_error` 而中止运行，此类节点数量现在会被拒绝并返回 `INVALID_SETTING_VALUE`。[#115398](https://github.com/ClickHouse/ClickHouse/pull/115398) ([groeneai](https://github.com/groeneai))。
* 为 `TimeSeries` 表实现了 Prometheus HTTP API 的 `/api/v1/series` 端点：支持 `match[]` 序列选择器 (多个值取并集) 、可选的 `start`/`end` 时间范围，以及可选的 `limit` 参数。[#115676](https://github.com/ClickHouse/ClickHouse/pull/115676) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。

<h2 id="performance-improvements">
  性能提升
</h2>

<h3 id="join-and-aggregation-performance">
  JOIN 与聚合性能
</h3>

* 为经过 TopK 动态过滤 (`ORDER BY ... LIMIT n`) 的查询启用查询条件缓存。QCC 条目按 TopK 计划参数进行分区，因此相同的查询会复用已缓存的 WHERE 过滤结果，而 `LIMIT`、排序列或排序方向不同时则会生成新的条目。[#104478](https://github.com/ClickHouse/ClickHouse/pull/104478) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 将 LIMIT 下推到按顺序聚合 (aggregation-in-order) 中，当 GROUP BY 键与 ORDER BY 键及表的 sorting key 一致时可提前终止，从而显著减少读取的行数。[#104859](https://github.com/ClickHouse/ClickHouse/pull/104859) ([thevar1able](https://github.com/thevar1able))。
* 默认启用 `allow_aggregate_partitions_independently`。当 `GROUP BY` 键与分区键相匹配时，ClickHouse 可以对每个分区独立聚合，并跳过全局合并步骤。若分区布局不利于该优化 (分区过少、分区过多或分区大小严重倾斜) ，运行时启发式规则会自动跳过该优化。[#105128](https://github.com/ClickHouse/ClickHouse/pull/105128) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 默认启用 `read_in_order_use_virtual_row`。在包含大量 parts 的表上按主键顺序读取时 (例如 `ORDER BY primary_key LIMIT n`) ，仅读取真正可能影响结果的 parts (外加一个最多包含 `max_threads` 个 parts 的预读窗口，以保持并行读取) ，从而显著降低峰值内存占用。[#106215](https://github.com/ClickHouse/ClickHouse/pull/106215) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 降低了 `JOIN` 的内存使用量并提升了其性能。哈希连接的右侧现在使用紧凑的、基于索引的 8 字节行引用，因此对于所有键类型，`ALL` 连接的哈希表条目都与 `ANY` 连接一样小。在大型 `parallel_hash` 连接查询上进行了基准测试——对 1 亿至 3 亿行的表基于 `UInt64` 和 `String` 键执行 `INNER` 和 `ANY` 连接，涵盖唯一键和重复键两种情况：查询耗时中位数缩短约 12%，峰值内存占用减少约 15%，且没有任何查询变慢。其中基于 `UInt64` 键的 `INNER` 连接提升最为明显 (耗时中位数缩短约 21%，内存减少 38%) 。[#107189](https://github.com/ClickHouse/ClickHouse/pull/107189) ([harikrishnan94](https://github.com/harikrishnan94))。
* 新增 dpsub 连接顺序枚举算法，能够以低于 dpsize 的优化开销生成最优连接计划，并支持非内连接。[#107351](https://github.com/ClickHouse/ClickHouse/pull/107351) ([fkastrati](https://github.com/fkastrati))。
* 为聚合状态单独挂接内存跟踪器，而不再使用整个查询的内存，从而避免将内存使用量较小的单级聚合转换为两级聚合。[#107490](https://github.com/ClickHouse/ClickHouse/pull/107490) ([m-selmi](https://github.com/m-selmi))。
* 改为基于查询计划而非 AST 计算聚合哈希表大小统计信息的缓存键，从而避免在分析聚合查询时构建完整的查询 AST。[#107643](https://github.com/ClickHouse/ClickHouse/pull/107643) ([novikd](https://github.com/novikd))。
* 支持根据首次运行时收集的统计信息，将首次查询中使用的 `hash` 连接在后续运行中切换为 `parallel_hash`。[#108125](https://github.com/ClickHouse/ClickHouse/pull/108125) ([m-selmi](https://github.com/m-selmi))。
* 利用运行时连接统计信息中的哈希表大小，在后续查询执行中优化连接运行时过滤器的大小。可通过新增设置 `join_runtime_filter_size_from_hash_table_stats` 进行控制。[#108313](https://github.com/ClickHouse/ClickHouse/pull/108313) ([m-selmi](https://github.com/m-selmi))。
* 对分区 `MergeTree` 表上的 `DISTINCT` 查询进行优化：将每个分区的行保留在同一个 stream 中，使每个 stream 的预备 `DISTINCT` 处理互不相交的键集合，避免同一组键出现在多个预备 `DISTINCT` 中，从而提升查询速度并降低内存使用量。此优化适用于分区表达式是 `DISTINCT` 列的确定性函数的情况，并由基于分区数量和数据倾斜程度的代价启发式规则决定是否启用 (可通过设置 `force_distinct_partitions_independently` 强制开启，默认禁用) 。这种按分区不相交的特性还会经由 `Expression`、`Filter` 和 `ARRAY JOIN` 步骤传递给下游最终的 `DISTINCT`、`LIMIT BY` 和 `GROUP BY` 算子，使它们同样可以跳过合并。该功能由新增设置 `allow_distinct_partitions_independently` (默认启用) 控制，并可通过 `max_number_of_partitions_for_independent_distinct` 调整启发式规则。[#108326](https://github.com/ClickHouse/ClickHouse/pull/108326) ([nihalzp](https://github.com/nihalzp)) 。
* 现在即使 `ON` 子句中同时包含非等值谓词，也会基于等值键构建运行时过滤器，从而在混合等值与非等值条件的连接中减少进入哈希连接的行数。`LEFT ANTI JOIN` 不受影响。[#108579](https://github.com/ClickHouse/ClickHouse/pull/108579) ([29antonioac](https://github.com/29antonioac)) 。
* 将聚合和连接所用哈希表的软件预取阈值从 `4 * L2 cache size` 降低到 `L2 cache size`，使哈希表一旦超出 L2 缓存容量即启用预取。此项修复了在报告 L2 容量较大的平台 (例如 L2 为 2 MiB 的 aarch64) 上，对中等规模哈希表 (约 1-8 MiB) 执行 `GROUP BY` 和 `JOIN` 时出现的性能回退。[#108655](https://github.com/ClickHouse/ClickHouse/pull/108655) ([groeneai](https://github.com/groeneai)) 。
* 提升窗口函数性能。对宽表执行且包含 `SELECT *` 的窗口查询，现在内存使用量显著降低，运行速度也更快。使用 `OVER ()` 和 `OVER (ORDER BY ... RANGE ...)` 时，`quantile*`、`uniq*`、`groupArray` 等窗口聚合函数的执行速度更快。`cume_dist` 函数同样得到提速；此外，使用 `PARTITION BY` 或 `ORDER BY` 的窗口在包含大量重复值的列上性能更好。[#108688](https://github.com/ClickHouse/ClickHouse/pull/108688) ([nihalzp](https://github.com/nihalzp)) 。
* 对于不含聚合函数的聚合查询，现在会使用基于 `HashSet` 的方法代替 `HashMap` (仅限受支持的键类型) ，实测最高可提速 1.8 倍。[#108862](https://github.com/ClickHouse/ClickHouse/pull/108862) ([nickitat](https://github.com/nickitat)) 。
* 降低 `parallel_hash` 连接算法中锁争用带来的开销。[#108938](https://github.com/ClickHouse/ClickHouse/pull/108938) ([m-selmi](https://github.com/m-selmi)) 。
* 新增 `join_algorithm` 取值 `parallel_full_sorting_merge`：对于哈希兼容的等值连接，它会按连接键的哈希值将 full sorting merge join 切分为多个相互独立的分片级 merge join，并在所有线程上并行执行。它在实现并行化的同时，保留了 merge join 内存占用低、流式处理的优势 (在一项基准测试中，比 `parallel_hash` 快约 2.4 倍，内存占用减少约 3.3 倍) 。`ASOF` 连接会回退为单个 `full_sorting_merge`；对于哈希不兼容的键类型 (浮点数、`JSON`、`Object`、`Dynamic`) ，仅跳过哈希分散重写，在启用 `query_plan_join_shard_by_pk_ranges` 时仍可在数据源处按主键范围分片。结果不保证有序。[#109005](https://github.com/ClickHouse/ClickHouse/pull/109005) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 现在，当表的当前活跃大小加上写入块的大小不超过新设置 `materialize_statistics_on_insert_max_table_size` (默认 25 GiB) 时，列统计信息默认会在 `INSERT` 时物化；该检查针对每个写入块分别进行，因此向空表首次批量加载数据时，仍可能为每个写入块物化统计信息。这使基于代价的连接优化器能够准确估算新加载的维度表，避免产生极差的连接顺序 (例如，TPC-H Q5 和 Q8 在 scale factor 40 下不再超时) ，而已有的大型事实表仍会在合并期间物化统计信息。[#109454](https://github.com/ClickHouse/ClickHouse/pull/109454) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 优化了无键聚合场景下的聚合函数 `uniqCombined`。[#109794](https://github.com/ClickHouse/ClickHouse/pull/109794) ([CurtizJ](https://github.com/CurtizJ))。
* 优化了聚合函数 `uniqHLL12` 和 `uniqCombined`。[#109831](https://github.com/ClickHouse/ClickHouse/pull/109831) ([CurtizJ](https://github.com/CurtizJ))。
* `parallel_hash` 连接算法在另外两种情况下也能并行处理未连接的行：存在残余过滤器时，以及连接键较小 (使用单层哈希映射) 时。[#110008](https://github.com/ClickHouse/ClickHouse/pull/110008) ([m-selmi](https://github.com/m-selmi))。
* 当谓词仅引用窗口的 `PARTITION BY` 列时，将过滤器下推到窗口函数之下。此类写在窗口之后的谓词 (包裹窗口子查询的外层 `WHERE`，或 `QUALIFY` 中的合取项) 现在可以下推到存储层，从而启用主键/分区裁剪、跳过索引和投影。例如，`SELECT ... row_number() OVER (PARTITION BY key ORDER BY ts) AS rn ... QUALIFY rn = 1 AND key = 'x'` 不再需要读取整张表并对其执行窗口计算。[#110114](https://github.com/ClickHouse/ClickHouse/pull/110114) ([groeneai](https://github.com/groeneai))。
* 在 `join_use_nulls = 1` 时，若拒绝 NULL 的 `WHERE` 条件引用了外连接两侧的列 (例如 `WHERE l.k = 42 AND r.k = 42`) ，现在会将该连接转换为 `INNER` (或 `LEFT`/`RIGHT`) 并利用主键进行裁剪，与 `join_use_nulls = 0` 时的行为一致。此前这种情况下会跳过该转换，导致两张表都被完整读取。[#110121](https://github.com/ClickHouse/ClickHouse/pull/110121) ([groeneai](https://github.com/groeneai))。
* 优化了无键聚合中的函数 `uniq`、`uniqExact` 和 `uniqHLL12`。[#110150](https://github.com/ClickHouse/ClickHouse/pull/110150) ([CurtizJ](https://github.com/CurtizJ))。
* `ON` 条件恒为假的 `JOIN` (例如 `ON 1 = 2`、`ON NULL`，或可折叠为假的条件，如 `a.t = 'A' AND a.t = 'B'`) 不再读取对结果无贡献的一侧。一项新的查询计划优化会将不可能产生任何行的输入侧替换为空数据源。该行为由设置 `query_plan_short_circuit_constant_false_join` 控制 (默认启用) 。[#110234](https://github.com/ClickHouse/ClickHouse/pull/110234) ([groeneai](https://github.com/groeneai))。
* 并行执行单层聚合哈希表的最终合并：键空间被划分为互不相交的哈希分区，由各线程独立合并 (设置 `enable_parallel_single_level_merge`，默认启用) 。对于每线程哈希表未达到两级阈值、但合并阶段占用了大部分运行时间的 `GROUP BY` 查询，可显著提速。[#110395](https://github.com/ClickHouse/ClickHouse/pull/110395) ([nihalzp](https://github.com/nihalzp))。
* 单个 `String` 聚合键现在采用更紧凑的哈希表表示，从而提升以字符串为主的 `GROUP BY` 工作负载的性能。新增的 `enable_packed_string_keys_in_aggregation` 设置默认启用；禁用该设置，或将 `compatibility` 设为低于 `26.8` 的版本，将恢复使用旧版 `StringHashTable` 路径。对于长度超过 11 字节且基数极低的键，旧路径可能更快。[#110573](https://github.com/ClickHouse/ClickHouse/pull/110573) ([harikrishnan94](https://github.com/harikrishnan94))。[#112089](https://github.com/ClickHouse/ClickHouse/pull/112089) ([harikrishnan94](https://github.com/harikrishnan94))。
* 在稀疏场景下，full sorting merge join 的性能最高提升 1.5-3 倍。[#111200](https://github.com/ClickHouse/ClickHouse/pull/111200) ([vdimir](https://github.com/vdimir))。
* 当探测端与构建端的连接键类型不同时 (例如探测键为 Nullable，而构建键为非 Nullable) ，现在也会启用 `join_runtime_filter_from_fixed_hash_table`。[#111244](https://github.com/ClickHouse/ClickHouse/pull/111244) ([m-selmi](https://github.com/m-selmi))。
* 当右侧包含 `NULL` 连接键或被 `ON` 表达式过滤掉的行时，通过避免重建 null map，提升了使用 `parallel_hash` 算法的 `RIGHT` 和 `FULL` 连接的性能。[#111258](https://github.com/ClickHouse/ClickHouse/pull/111258) ([m-selmi](https://github.com/m-selmi))。
* 为并行 `GROUP BY` 新增自适应算法 (由设置 `enable_adaptive_aggregator` 控制，默认启用) ：每个线程先在各自的哈希表中进行聚合，当表中的键数达到 `adaptive_aggregator_freeze_threshold` 时将其冻结。这样，高频键会持续更新驻留在缓存中的小型表，无需任何协调；低频键则按哈希值路由到各个桶的积压队列中，并在按桶并行的合并阶段中仅聚合一次。[#111459](https://github.com/ClickHouse/ClickHouse/pull/111459) ([nihalzp](https://github.com/nihalzp))。
* 通过避免为每个值重建 `ColumnDynamic`，加快了对存储在共享数据中的 JSON/`Object` 列值逐行计算哈希的速度 (例如对 JSON 列执行 `uniq`/`uniqExact`，以及基于哈希的 `GROUP BY`/`DISTINCT` 键都会用到) 。哈希值保持不变。[#111501](https://github.com/ClickHouse/ClickHouse/pull/111501) ([valerypetrov](https://github.com/valerypetrov))。
* 提升了 ON 子句中包含多个 `OR` 析取项的 RIGHT 和 FULL 哈希 JOIN 的性能，以及带有残余 (不等) 条件的 RIGHT/FULL JOIN 的性能。[#111590](https://github.com/ClickHouse/ClickHouse/pull/111590) ([m-selmi](https://github.com/m-selmi))。
* 当哈希连接配置了自动落盘阈值 (自 26.5 起默认如此) 时，现在也可以通过 JOIN 按顺序读取。该优化生效时，连接会保留在内存中，以维持左侧的顺序；设置 `query_plan_read_in_order_through_spilling_join = 0` 可恢复之前的行为，即此类连接不参与按顺序读取，可自由落盘。此外，对按顺序读取的 `LEFT JOIN` 执行 `ORDER BY ... LIMIT` 时，不再将整张表的行数报告为预计读取行数，因此在 `read_overflow_mode = 'throw'` 下，提前终止的读取不会再触发 `max_rows_to_read` 限制。[#111973](https://github.com/ClickHouse/ClickHouse/pull/111973) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在合并期间为 `TTL ... GROUP BY` 聚合重新启用连续键优化。此前构造聚合器时，在本应传入 `min_hit_rate_to_use_consecutive_keys_optimization` (取值范围为 `[0, 1]` 的命中率，默认 0.5) 的参数位置误传了 `min_chunk_bytes_for_parallel_parsing` (字节阈值，默认 10 MiB) ，导致该路径上的优化一直处于禁用状态。查询结果不受影响。[#112314](https://github.com/ClickHouse/ClickHouse/pull/112314) ([groeneai](https://github.com/groeneai))。
* 序列化查询计划时，`ARRAY JOIN` 的延迟列复制不再丢失。此前在 `serialize_query_plan = 1` 时，执行远程计划片段的节点会忽略 `enable_lazy_columns_replication`，始终物化所有复制副本，尽管该设置默认处于启用状态。[#112330](https://github.com/ClickHouse/ClickHouse/pull/112330) ([groeneai](https://github.com/groeneai))。
* 当 `WHERE` 等值条件的操作数类型不同但存在共同超类型 (例如 `Int32` 和 `Nullable(Int32)`) 时，现在会将其合并到 `JOIN` 条件中，从而使 CROSS 连接能够转换为 INNER 连接。[#112630](https://github.com/ClickHouse/ClickHouse/pull/112630) ([m-selmi](https://github.com/m-selmi))。
* 修复了复制元素以共享数据形式保存 `JSON` 值的 `Array` 时出现的二次方重新分配问题，例如将常量 `Array(JSON)` 传递给聚合函数的场景。此类查询复制的字节数会随行数呈二次方增长。[#112897](https://github.com/ClickHouse/ClickHouse/pull/112897) ([groeneai](https://github.com/groeneai))。
* 当 MergeTree 主键或分区键上范围谓词的边界值通过与单行常量侧的 `JOIN ON` 子句提供时 (例如 `SELECT count() FROM t JOIN bounds ON t.d >= bounds.lo AND t.d <= bounds.hi`) ，恢复了对数据分片和粒度的裁剪。自 25.2 起，此类查询会读取所有数据分片，而此前可用于恢复裁剪的 `query_plan_use_logical_join_step` 设置已在 26.5 中废弃，导致裁剪再也无法恢复。[#112957](https://github.com/ClickHouse/ClickHouse/pull/112957) ([groeneai](https://github.com/groeneai))。
* 修复了对基于大量不同结构表的 `Merge` 表执行 JOIN 时，查询规划呈三次方复杂度的问题。此前此类查询可能在查询规划阶段耗费数分钟，且不响应 `max_execution_time` 或 `KILL QUERY`。[#113140](https://github.com/ClickHouse/ClickHouse/pull/113140) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了一个性能回退问题：不带 `GROUP BY` 键的聚合在每次执行时都会序列化完整的输入计划子树 (包括常量折叠字面量的全部内容) ，只为计算一个根本用不上的哈希表大小缓存键。例如 `SELECT quantileMerge(arrayJoin(arrayMap(x -> state, range(5000000))))` 这样的查询，此前每次执行在查询计划优化上约耗时 63 ms，现在仅需 0.15 ms。[#113333](https://github.com/ClickHouse/ClickHouse/pull/113333) ([groeneai](https://github.com/groeneai))。
* PromQL 聚合运算符 `topk`、`bottomk` 和 `limitk` 现采用流式计划求值，其选择状态为 `O(time_steps * k)`，不再将所有序列收集到单行中并占用 `O(time_steps * series^2)` 的中间内存。此前在高基数指标上因 `MEMORY_LIMIT_EXCEEDED` 而失败的查询，现在可在有界内存中运行，且求值过程由单线程改为并行执行。[#113656](https://github.com/ClickHouse/ClickHouse/pull/113656) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 将 `timeSeries*ToGrid` 聚合函数内部按桶划分的哈希表替换为扁平的有序样本数组：对于有序输入 (绝大多数情况) ，样本写入变为 O(1) 的追加操作，同时省去了最终化阶段按桶进行的复制与排序。[#113681](https://github.com/ClickHouse/ClickHouse/pull/113681) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 被多个计划步骤共享的 PromQL 子表达式 (`topk`/`bottomk`/`limitk` 的操作数、`or` 的左侧) 现在只求值一次而非两次：由 PromQL 生成的 SQL 会物化共享子查询。这消除了对样本表的重复扫描；基于 `rate` 的 `topk` 冷查询速度提升约 2 倍，kubernetes-mixin 规则查询性能提升 10–29%。[#113772](https://github.com/ClickHouse/ClickHouse/pull/113772) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 对于使用 `ORDER BY <column> LIMIT n` (TopK) 优化的查询，[查询条件缓存](/zh/operations/query-condition-cache)现已默认启用。如需禁用，可设置 `use_query_condition_cache_for_top_k = 0`。[#111492](https://github.com/ClickHouse/ClickHouse/pull/111492) [#114539](https://github.com/ClickHouse/ClickHouse/pull/114539) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 在合并之前，并行执行每线程聚合状态从单级到两级的转换。此改动修复了在核心数非常多的机器上，带有重型聚合状态 (例如 `COUNT(DISTINCT ...)`、ClickBench Q10/Q11) 的短 `GROUP BY` 查询出现的 2-3 倍性能回退；该回退是在 26.7 开发构建版本中为使聚合内存统计更精确而引入的。[#114691](https://github.com/ClickHouse/ClickHouse/pull/114691) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 加速分区 `MergeTree` 表上的窗口函数：每个分区通过各自独立的 stream 读取，并按分区计算窗口，从而省去通常在窗口排序前将所有行在线程间重新打散的哈希分发步骤。该优化适用于表的分区表达式是窗口 `PARTITION BY` 列的确定性函数的情况，并与按分区执行的 `GROUP BY` / `DISTINCT` 采用相同的成本启发式规则 (相对于 `max_threads` 有足够多的分区，且不存在占主导地位的分区) 。由新设置 `allow_window_partitions_independently` (默认启用) 、`force_window_partitions_independently` 和 `max_number_of_partitions_for_independent_window` 控制。[#114783](https://github.com/ClickHouse/ClickHouse/pull/114783) ([nihalzp](https://github.com/nihalzp)) 。
* 加速 `timeSeries*ToGrid` 聚合函数：每个样本的桶计算不再使用 Int128 除法，且落在同一个桶中的连续样本会跳过哈希表查找。[#114889](https://github.com/ClickHouse/ClickHouse/pull/114889) ([nikitamikhaylov](https://github.com/nikitamikhaylov)) 。
* `timeSeries*ToGrid` 聚合函数现在将落入同一网格桶的连续样本作为一批进行处理，使 `timeSeriesRateToGrid` 及相关函数在已排序时间序列数据上的样本摄取阶段提速 1.2-2 倍。[#115041](https://github.com/ClickHouse/ClickHouse/pull/115041) ([nikitamikhaylov](https://github.com/nikitamikhaylov)) 。
* 不带 `GROUP BY` 键的聚合不再将其单行输出扩散到 `max_threads` 个流，因此对于执行计划在此类聚合之后仍有后续步骤的查询，其流水线会显著缩小 (需要创建、调度和分析的处理器更少) ，且不会损失任何并行度。[#115170](https://github.com/ClickHouse/ClickHouse/pull/115170) ([nikitamikhaylov](https://github.com/nikitamikhaylov)) 。
* 加快 PromQL 即时查询的计算：`timeSeries*ToGrid` 聚合函数对单点网格采用向量化的样本分类路径，`timeSeriesIdToGroup` 则直接填充其结果列。[#115267](https://github.com/ClickHouse/ClickHouse/pull/115267) ([nikitamikhaylov](https://github.com/nikitamikhaylov)) 。
* 当 `JOIN` 的 `ON` 子句包含多个以 `OR` 连接的等值条件时，不再物化查询中未选取的右侧键列。[#115465](https://github.com/ClickHouse/ClickHouse/pull/115465) ([nickitat](https://github.com/nickitat)) 。
* 当右侧存在大量重复的连接键时，加快 `ANY`、`SEMI` 或 `ANTI` 连接的哈希表构建：连接不再针对右侧的每一行从内存中重新读取 `join_any_take_last_row` 设置。[#115820](https://github.com/ClickHouse/ClickHouse/pull/115820) ([nickitat](https://github.com/nickitat)) 。
* 加速基于 `String`、`FixedString` 和 `LowCardinality` 键且不含聚合函数的 `GROUP BY`：查询不再为每一行向哈希表重写未使用的占位符，而仅对新增键的行执行此操作。[#115834](https://github.com/ClickHouse/ClickHouse/pull/115834) ([nickitat](https://github.com/nickitat)) 。
* 降低了对大型常量折叠字面量执行带键聚合时的内存使用量和查询计划优化时间。聚合哈希表统计信息的缓存键现在会在序列化的同时完成哈希计算，不再先在内存中累积，因此携带大型字面量的查询计划在优化期间不再保留该字面量的副本。以 80 MB 的字面量为例，峰值内存占用降低约 250 MB，优化速度提升约 2.5 倍。计算得到的键保持不变。[#115847](https://github.com/ClickHouse/ClickHouse/pull/115847) ([groeneai](https://github.com/groeneai))。
* 优化了 `GROUP BY ... ORDER BY ... LIMIT` 和 `GROUP BY ... LIMIT` 查询：在聚合过程中维护一个有界堆，提前剪除不可能出现在结果中的分组，从而显著降低高基数分组场景下的内存使用量和执行时间。该优化由 `enable_group_by_top_k_optimization` 设置控制。基于 Dmitriy Terenichev 的初始实现。[#96630](https://github.com/ClickHouse/ClickHouse/pull/96630) ([thevar1able](https://github.com/thevar1able))。

<h3 id="query-optimization-and-execution">
  查询优化与执行
</h3>

* 使用并行副本进行按序读取时，现在采用与本地读取相同的逻辑，将表拆分为 `max_threads` 个部分，以提升并行度。[#101434](https://github.com/ClickHouse/ClickHouse/pull/101434) ([nickitat](https://github.com/nickitat))。
* 为 Parquet 读取器新增行组级和页级的 GeoParquet 空间裁剪。行组裁剪会跳过边界框与查询几何体不重叠的整个行组；页级裁剪则利用 `covering.bbox` 列索引跳过行组内的无关页。此外，还通过 `IFunctionBase::isSpatialPredicate()` 泛化了空间谓词下推，并新增 `GeoFilter`，用于在读取 Parquet 行时对空间谓词进行求值。[#104435](https://github.com/ClickHouse/ClickHouse/pull/104435) ([bacek](https://github.com/bacek))。
* 新增 `use_constant_folding_in_index_analysis` 设置 (默认禁用) 。启用后，`MergeTree` 主键、`MinMax` 和跳数索引分析会针对每个数据分片，分别将分区级常量折叠到过滤谓词中，从而改善分支依赖于分区值的过滤条件的裁剪效果，例如在 `PARTITION BY a` 下的 `(a = 1 AND b >= 1) OR (a = 2 AND b > 10)`。[#104582](https://github.com/ClickHouse/ClickHouse/pull/104582) ([Michicosun](https://github.com/Michicosun))。
* 对于启用 `vector_search_with_rescoring` 的向量搜索查询，在查询管道中执行精确距离计算之前，先进行精确的行定位。[#105591](https://github.com/ClickHouse/ClickHouse/pull/105591) ([skuznetsov](https://github.com/skuznetsov))。
* 新增一项查询计划优化：将可缩减数据量的函数 (`length`、`lengthUTF8`、`empty`、`notEmpty`) 下推到 `Sorting` 和 `Filter` 步骤之下，用定长结果替换较宽的 `String` / `FixedString` 参数，从而既无需在排序时缓冲，也无需在过滤时复制。该优化由新设置 `query_plan_push_down_volume_reducing_functions` 控制，默认启用。[#106199](https://github.com/ClickHouse/ClickHouse/pull/106199) ([fastio](https://github.com/fastio))。
* 将每个缓存文件的大小编码到文件名中 (`<offset>_<size>`) ，无需再对每个文件执行 `stat`，从而加快启动时文件系统缓存的加载速度。旧版本写入的缓存文件仍可正常加载。[#107415](https://github.com/ClickHouse/ClickHouse/pull/107415) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 提升了带主键过滤条件的文本搜索查询的性能。[#108114](https://github.com/ClickHouse/ClickHouse/pull/108114) ([CurtizJ](https://github.com/CurtizJ))。
* 提升了 `pointInPolygon` 函数在多边形为常量时的性能。预处理多边形缓存现在以原始常量参数作为键，因此常量多边形只需解析一次 (缓存未命中时) ，而无需针对每个输入块重复解析。[#108184](https://github.com/ClickHouse/ClickHouse/pull/108184) ([groeneai](https://github.com/groeneai))。
* 当该功能处于禁用状态时 (`predicate_statistics_sample_rate = 0`，即默认值) ，不再在 MergeTree 读取路径上维护 `system.predicate_statistics_log` 选择性计数器。这样每次读取都省去了逐颗粒的原子更新以及 `O(rows)` 的过滤器 popcount 操作，修复了在 aarch64 上尤为明显的性能回退。[#108190](https://github.com/ClickHouse/ClickHouse/pull/108190) ([groeneai](https://github.com/groeneai))。
* 新增 `merge_use_batch_sorting_queueMergeTree` 设置，可选择为普通 `MergeTree` 合并启用批量排序队列，对于排序合并开销较大的合并负载，可降低 CPU 时间和实际耗时。[#108468](https://github.com/ClickHouse/ClickHouse/pull/108468) ([rorylshanks](https://github.com/rorylshanks))。
* 构建 actions DAG 时不再重复构建共享子表达式，从而加快分析器的查询规划速度，适用于多次引用同一 `WITH` 别名或多次重复同一子表达式的表达式 (例如深度嵌套的 `if`/`multiIf` 链) 。[#108523](https://github.com/ClickHouse/ClickHouse/pull/108523) ([novikd](https://github.com/novikd))。
* 加快了包含大量或超长 `AND` 比较链的查询的查询分析速度：`optimize_and_compare_chain` 优化现在受工作量预算约束 (新增设置 `optimize_and_compare_chain_max_hash_work`) ，不再对查询树的大部分内容进行哈希计算；此外，lambda 解析在其递归保护中不再重复计算 lambda 主体的哈希。[#108757](https://github.com/ClickHouse/ClickHouse/pull/108757) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 仅用于过滤的后处理器 (`if(..., '', token)`) 现在直接基于原始标记构建 granule，并在构建时丢弃空值，从而避免了通用路径中针对每次出现的物化操作以及 `ActionsDAG` 执行。[#109049](https://github.com/ClickHouse/ClickHouse/pull/109049) ([ahmadov](https://github.com/ahmadov))。
* 消除了分布式查询计划中 `ShuffleSendStep` 的单线程瓶颈：每个上游流现在各自独立地按目标桶分发其行，而不再将整个片段汇集到单个 `ScatterByPartitionTransform` 中处理。[#109206](https://github.com/ClickHouse/ClickHouse/pull/109206) ([davenger](https://github.com/davenger))。
* 降低了列数很多的查询在表达式求值时的 CPU 开销 (例如，在步长较小的 `QBit` 列上执行向量搜索时，每个向量会展开为数百个位平面子列，并全部传入同一个 `*DistanceTransposed` 调用) 。[#109380](https://github.com/ClickHouse/ClickHouse/pull/109380) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 当谓词仅引用 `LIMIT BY` 键列，且该子句对每个非空分组至少保留一行 (`LIMIT n BY` 且 `n >= 1`、`OFFSET 0`) 时，将过滤器下推到 `LIMIT BY` 之下。这样，此类谓词 (以外层 `WHERE` 包裹 `LIMIT BY` 子查询的形式编写) 即可下推至存储层，用于主键裁剪、跳过索引和投影，而无需先读取整张表再执行每组 top-N，同时不会改变 `OFFSET`、`LIMIT 0 BY` 或负数 `LIMIT BY` 形式的异常语义。[#110116](https://github.com/ClickHouse/ClickHouse/pull/110116) ([groeneai](https://github.com/groeneai))。
* 在主键索引分析中避免了每次超矩形检查时的堆内存分配，视查询形态不同，mark 过滤速度可提升 5-26%。[#110153](https://github.com/ClickHouse/ClickHouse/pull/110153) ([raimannma](https://github.com/raimannma))。
* Parquet 过滤器下推 (行组裁剪和列索引) 现在支持 `DateTime64` 各变体之间、`Decimal` 各变体之间以及 `Float32`/`Float64` 之间的转换。[#110457](https://github.com/ClickHouse/ClickHouse/pull/110457) ([al13n321](https://github.com/al13n321))。
* 优化了使用 sparseGrams 分词器构建基于文本和布隆过滤器的跳过索引的过程 [#110541](https://github.com/ClickHouse/ClickHouse/pull/110541) ([UnamedRus](https://github.com/UnamedRus))。
* 在 PREWHERE 条件排序中综合考虑 I/O 开销与选择性。此改动修复了自 [https://github.com/ClickHouse/ClickHouse/pull/101275](https://github.com/ClickHouse/ClickHouse/pull/101275) 起在某些情况下出现的 PREWHERE 执行性能回退问题。属于 [https://github.com/ClickHouse/ClickHouse/issues/110462](https://github.com/ClickHouse/ClickHouse/issues/110462) 的一部分 [#110695](https://github.com/ClickHouse/ClickHouse/pull/110695) ([Avogar](https://github.com/Avogar))。
* 减少了对后处理器 `IN`/`NOT IN` 过滤器中所定义标记的哈希计算。[#111690](https://github.com/ClickHouse/ClickHouse/pull/111690) ([ahmadov](https://github.com/ahmadov))。
* 启用 enable\_lazy\_columns\_replication 时，使用非常量模式的 mapContainsKeyLike、mapContainsValueLike、mapExtractKeyLike 和 mapExtractValueLike 函数占用的内存更少、耗时更短。模式不再在捕获时为每个 map 条目立即复制，而是推迟到内部 lambda 执行时才复制，并能更早释放，因此峰值时模式的展开副本会少一份。[#111749](https://github.com/ClickHouse/ClickHouse/pull/111749) ([diegomestre2](https://github.com/diegomestre2))。
* 默认启用两项磁盘端特性 (并提升为 beta) ：1) `packed_skip_index_max_bytes = '1M'`：不超过 1 MiB 的跳数索引子流现在会写入每个 part 中的单个 `skp_idx.packed` 归档文件，从而减少对象存储上的对象数量和写入请求。兼容性：仅影响新写入的 parts，且这些 parts 在旧版本上仍可完整读取；26.6 之前的版本只是不会利用打包索引进行剪枝 (将其视为未 materialized) 。设置 `packed_skip_index_max_bytes = 0` 可保留每个文件独立存放的布局。2) `compute_exact_num_defaults_for_sparse_columns` 与 `optimize_trivial_count_with_sparsity_filter`：持久化每列精确的 `num_defaults` 计数器；当谓词将行划分为默认值与非默认值时，可直接据此得出 `SELECT count() FROM t WHERE <pred>` 的结果，无需扫描数据。兼容性：旧版本会忽略 `serialization.json` 中的 `exact_num_defaults` 标志，因此降级后 parts 仍可完整读取；count 重写仅适用于带有精确计数器的 parts，因此在混合新旧 parts 的表上结果依然正确。[#111816](https://github.com/ClickHouse/ClickHouse/pull/111816) ([Algunenano](https://github.com/Algunenano))。
* 传递条件优化在无法应用完整过滤器时，现在仅将其附加过滤器用于索引分析。参见 `optimize_and_compare_chain` 设置。[#112076](https://github.com/ClickHouse/ClickHouse/pull/112076) ([yariks5s](https://github.com/yariks5s))。
* 实验性 TimeSeries 引擎的 Prometheus 查询 API (`/api/v1/query`、`/api/v1/query_range`) 现在改为并行执行查询，不再局限于单线程。[#112108](https://github.com/ClickHouse/ClickHouse/pull/112108) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 对常量向量调用 `randomHadamardTransform` 时，现在只计算一次，而不再逐行计算。对于先用 `randomHadamardTransform` 旋转查询向量、再与 `QBit` 列进行比较的向量搜索查询，这将带来明显提速。[#112921](https://github.com/ClickHouse/ClickHouse/pull/112921) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 恢复了在主键列上按 `IN (subquery)` 过滤的单个变更中，各 part 任务之间的 set 共享。`enable_sharing_sets_for_mutations` 默认开启，但为主键分析构建的 set 此前不再参与共享缓存，导致包含 N 个 parts 的表会将同一个 set 物化 N 次。[#112941](https://github.com/ClickHouse/ClickHouse/pull/112941) ([groeneai](https://github.com/groeneai))。
* 在分布式查询计划 (`make_distributed_plan`) 中，`ORDER BY ... LIMIT k` 现在会在每个副本上使用延迟物化：宽列仅针对该副本本地的 top-k 行读取，而不必为每个候选行读取。[#113111](https://github.com/ClickHouse/ClickHouse/pull/113111) ([shankar-iyer](https://github.com/shankar-iyer))。
* 加快使用 `uniq_v2` 列统计信息时的查询计划速度。估算的不同值数量现在会被缓存，不再在每次请求时重新计算，而查询计划在单个查询中会多次发出此类请求。[#113357](https://github.com/ClickHouse/ClickHouse/pull/113357) ([groeneai](https://github.com/groeneai))。
* 过滤器下推现已支持 Parquet 和 ORC 文件中的 `Tuple` 子列。对 `file()`、`s3()` 或 `url()` 使用诸如 `WHERE tup.1 = 555555` 的谓词时，现在会利用该元组元素自身的统计信息来剪枝行组和行索引步长，而无需读取整个文件。[#113383](https://github.com/ClickHouse/ClickHouse/pull/113383) ([groeneai](https://github.com/groeneai))。
* 提升基于 TimeSeries 引擎的 PromQL 查询性能：内部选择器 SQL 现在直接读取样本表的主键列 (不再进行无实际作用的类型转换) ，并先检查时间戳范围、再检查 series-id 集合，使冷查询中大量使用选择器的查询提速 30-44%。[#113768](https://github.com/ClickHouse/ClickHouse/pull/113768) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 当 id 布局为使用规范 id 生成器的二元组时，匹配某一指标所有序列的 PromQL 选择器现在会在索引分析阶段，通过 `id` 上的连续主键范围来过滤 `TimeSeries` 表的样本表，而不再使用庞大的 `id IN <set>` 条件。这消除了大量使用选择器的 PromQL 查询中占主导地位的单线程索引分析开销：在一张包含 620 亿个样本的表上，仪表板和规则类查询的冷启动延迟最多降低 45%，整个测试套件的冷启动几何平均值降低 11%。[#114131](https://github.com/ClickHouse/ClickHouse/pull/114131) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* Prometheus HTTP API 端点 `/api/v1/query` 和 `/api/v1/query_range` 现在对多个计划步骤共享的 PromQL 子查询只求值一次，与 `prometheusQuery` 和 `prometheusQueryRange` 表函数的现有行为保持一致。此前，以 `enable_analyzer = 0` 发起的请求，或由配置文件中设置了该项的用户发起的请求，会针对每个引用该子查询的步骤重新扫描一次共享子查询。[#114261](https://github.com/ClickHouse/ClickHouse/pull/114261) ([groeneai](https://github.com/groeneai))。
* 修复了 26.7 中的一个回归问题：对于按 `DateTime64` 列的 `toUnixTimestamp` (或其他整数转换) 排序的 `MergeTree` 表，针对该列的普通范围过滤不再使用主键，而是会读取匹配分片中的所有粒度。此外，对于按原始 `DateTime64` 列排序的表，诸如 `toInt64(ts) >= c` 的过滤条件现在也会使用主键。[#114413](https://github.com/ClickHouse/ClickHouse/pull/114413) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对于聚簇列 (例如按主键排序的列) ，遇到值相等的连续行时会复用上一行的结果，从而加快 `IN` 的执行速度。[#114853](https://github.com/ClickHouse/ClickHouse/pull/114853) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* 修复了函数 `h3kRing`、`h3ToChildren`、`h3PolygonToCells` 和 `h3PolygonToCellsWithContainment` 在基于大量行构建结果时时间复杂度呈二次方增长的问题。在一次 CI 压力测试中，一个处理 196 000 行的查询耗费了 838 秒用于内存复制；现在仅需约 5 秒。[#115773](https://github.com/ClickHouse/ClickHouse/pull/115773) ([groeneai](https://github.com/groeneai))。
* 优化了反向字典查找。诸如 `WHERE dictGet(dict, attr, key_expr) = value` 的常量等值谓词现在会直接常量折叠为键过滤器 (`key_expr = const`、`key_expr IN [...]` 或 `WHERE 0`) ，而不再改写为 `IN (SELECT ... FROM dictionary(...))` 子查询；同时，`dictGetKeys` 的常量路径现已支持并行执行。[#91164](https://github.com/ClickHouse/ClickHouse/pull/91164) ([nihalzp](https://github.com/nihalzp))。
* 新增设置 `merge_tree_generic_exclusion_search_max_steps`，用于限制通用排除搜索算法分析每个数据分片的主键索引时所用的步数。该预算会优先分配给剩余的最大键范围，因此即使预算很小，也能裁剪掉大部分数据；未完全分析的范围会被整体读取，因此查询结果依然正确，只是可能会读取更多粒度。该限制并不严格：最多可超出 `merge_tree_coarse_index_granularity` 步，此外分片中已划分出的每个范围 (例如由查询条件缓存划分) 还会各额外增加一步。默认值 0 表示不限制步数。[#92779](https://github.com/ClickHouse/ClickHouse/pull/92779) ([EmeraldShift](https://github.com/EmeraldShift))。
* 对基于分布式表的 `VIEW` 执行带有 `ORDER BY` 和 `LIMIT` 的查询时，现在会使用“合并已排序流”优化。外层的 `ORDER BY`/`LIMIT` 会被下推到简单视图的内部查询中，由各分片在本地完成排序，再由协调节点合并这些预先排好序的流，而无需在协调节点上执行完整排序。[#94102](https://github.com/ClickHouse/ClickHouse/pull/94102) ([matanper](https://github.com/matanper))。

<h3 id="storage-io-and-data-lake-performance">
  存储、I/O 与数据湖性能
</h3>

* 对于 `MergeTree` 表，当某个主键列同时也是分区键的输入列时，在主键分析过程中利用分区 minmax 索引的边界裁剪更多粒度。例如，在使用 `ORDER BY (id, event_time)` 和 `PARTITION BY toYYYYMM(event_time)` 的 `MergeTree` 表中，ClickHouse 会在主键索引分析期间使用 `event_time` 上的分区 minmax 索引，从而做出更精准的粒度裁剪决策。该行为由新增设置 `use_partition_minmax_for_primary_key_pruning` 控制 (默认启用) 。[#103480](https://github.com/ClickHouse/ClickHouse/pull/103480) ([UnamedRus](https://github.com/UnamedRus))。
* 加速在已排序数据流中扫描相等键值连续序列的算子，包括按序 `DISTINCT`、按序 `LIMIT BY`、按序负向 `LIMIT BY`，以及 `full_sorting_merge` 和 `partial_merge` 连接。[#106502](https://github.com/ClickHouse/ClickHouse/pull/106502) ([nihalzp](https://github.com/nihalzp))。
* 当列块完全采用字典编码时，Parquet v3 读取器现在可以针对等值条件和 `IN` 条件，利用字典页跳过整个行组 (作为 min/max 统计信息和布隆过滤器之外的补充手段) 。该行为由新增设置 `input_format_parquet_dictionary_filter_push_down` 控制。[#106952](https://github.com/ClickHouse/ClickHouse/pull/106952) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 改用 libdeflate 进行 gzip/zlib/deflate 压缩和解压缩，提升了 `.gz`/HTTP/`url`/`s3` 数据以及 Parquet GZIP 编解码器的处理速度 (压缩约快 1.15 倍且压缩比更高，解压缩约快 1.4–1.5 倍) 。[#108074](https://github.com/ClickHouse/ClickHouse/pull/108074) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 加速默认去除空白字符的 `trimLeft`/`trimRight`/`trimBoth` 函数 (及其别名 `ltrim`/`rtrim`/`trim`) ：无需去除空白的连续行会一次性批量复制，逐行空格扫描仅对确实带有前导或尾随空格的行执行。[#108177](https://github.com/ClickHouse/ClickHouse/pull/108177) ([groeneai](https://github.com/groeneai))。
* 在解析当前 manifest 文件的同时预取下一个 manifest 文件，使 I/O 与 CPU 计算并行进行，从而加快 Iceberg 表的读取速度。[#108543](https://github.com/ClickHouse/ClickHouse/pull/108543) ([asya-ch](https://github.com/asya-ch))。
* 使用重评分的向量搜索查询现在仅对向量索引返回的候选行计算精确距离，而不再对同一 `MergeTree` 粒度中的相邻行进行暴力重评分。[#108846](https://github.com/ClickHouse/ClickHouse/pull/108846) ([skuznetsov](https://github.com/skuznetsov))。
* 新增 `merge_tree_min_bytes_per_read_stream` 设置，用于在高核心数服务器上执行普通的本地无序窄列 `MergeTree` 扫描时，减少过多的读取流及流水线开销。[#109035](https://github.com/ClickHouse/ClickHouse/pull/109035) ([jiebinn](https://github.com/jiebinn))。
* 加速共享数据中包含大量稀疏路径的 `JSON` 列的序列化与合并。在将共享数据展平为按路径划分的列时，`flattenAndBucketSharedDataPaths` 不再针对每一行扫描所有已累积的路径列，也不再逐个单元格插入默认值；针对所有路径的逐行扫描已被移除，空缺部分改为批量回填。[#109341](https://github.com/ClickHouse/ClickHouse/pull/109341) ([groeneai](https://github.com/groeneai))。
* 当通信双方的协议修订版本均为 54489 或更高时，原生协议现在会先发送一个独立的累积字节偏移量 stream (与 `Array` 存储偏移量所用的布局相同) ，再发送拼接后的数据，以此传输 `String` 列，而不再为每个值附加 varint 长度前缀。这样，客户端读取 `String` 列时即可精确预分配缓冲区，并通过单次批量复制完成读取，速度约为逐值布局的 4 倍。旧版客户端和服务器不受影响：该布局通过协议修订版本协商确定。`Native` 和 `Buffers` 格式也可通过新增设置 `output_format_native_write_string_with_size_stream` / `input_format_native_read_string_with_size_stream` 使用相同布局 (默认关闭，以保持格式的可移植性) 。[#110320](https://github.com/ClickHouse/ClickHouse/pull/110320) ([vahid-sohrabloo](https://github.com/vahid-sohrabloo))。
* 对于按主键顺序读取 (`ORDER BY` 为 sorting key 的前缀) 且 `LIMIT` 较小的 `FINAL` 查询，不再使用 `split_intersecting_parts_ranges_into_layers_final`。[#110431](https://github.com/ClickHouse/ClickHouse/pull/110431) ([KochetovNicolai](https://github.com/KochetovNicolai))。
* 从对象存储 (包括 Iceberg 表) 读取 Parquet 文件时支持延迟物化 (late materialization) ：对于 `ORDER BY ... LIMIT n` 查询，排序和过滤用不到的列仅针对经 `LIMIT` 筛选后保留的 `n` 行进行读取。以 S3 上一个 200 MB 的 Parquet 文件为例，`SELECT k, s ... ORDER BY k DESC LIMIT 10` 仅读取 3.3 MB，而非 171 MB (IO 减少至 1/51，速度提升 8 倍) 。该功能由新增设置 `query_plan_optimize_lazy_materialization_for_object_storage` 控制 (默认启用，且需同时启用 `query_plan_optimize_lazy_materialization`) 。[#110970](https://github.com/ClickHouse/ClickHouse/pull/110970) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对包含大量删除文件的 Iceberg 表执行查询时，启动速度更快。ClickHouse 现在会并发读取和解码删除清单文件，而非逐个处理，使各文件的存储读取得以并行进行。新增设置 `iceberg_delete_manifest_decode_concurrency` (默认值为 `4`) 用于控制同时解码的文件数量。[#112679](https://github.com/ClickHouse/ClickHouse/pull/112679) ([asya-ch](https://github.com/asya-ch))。
* 新增可选功能：将 UInt128/UInt256/Int128/Int256 以 DECIMAL 形式序列化到 Parquet，从而支持行组级和页级剪枝。[#113347](https://github.com/ClickHouse/ClickHouse/pull/113347) ([bobrik](https://github.com/bobrik))。
* 修复了读取器链中的某个步骤读取碎片化标记范围 (例如经主键或跳数索引过滤后的范围) 时，远程磁盘上读取请求成倍增加的问题。[#113584](https://github.com/ClickHouse/ClickHouse/pull/113584) ([CurtizJ](https://github.com/CurtizJ))。
* 写入 sorting key 全部为常量的 `MergeTree` 数据部分时，跳过多余的有序性检查扫描。[#113899](https://github.com/ClickHouse/ClickHouse/pull/113899) ([perfloop-agent](https://github.com/perfloop-agent))。
* `ORDER BY ... LIMIT n` 查询的延迟物化现在也适用于通过 `file` 表函数和 `File` 表引擎读取的本地 Parquet 文件：排序和过滤用不到的列仅针对经 `LIMIT` 筛选后保留的 `n` 行进行读取。如果文件在两轮读取之间被修改，对保留文件的第二次读取将以安全方式失败，并报出新增的 `FILE_CHANGED_DURING_READ` 错误。该功能由新增设置 `query_plan_optimize_lazy_materialization_for_file` 控制 (默认启用) 。此外，还修复了所请求的子列 (例如 `JSON` 列的子列) 被延迟读取时，对象存储的延迟物化报错 `Not found column or subcolumn ... in block` 的问题。[#114262](https://github.com/ClickHouse/ClickHouse/pull/114262) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 加速分区 `MergeTree` 表上 `IN (subquery)` 的 Set 构建：将每个分区的行保留在单个 stream 中，并在各 stream 内独立去重，这样，唯一的 Set 填充转换 (此前需串行地对每一行计算哈希) 只需处理去重后的行。当分区表达式是子查询输出列的确定性函数时，此优化生效。若最大分区的行数超过平均分区行数的两倍，则不应用该优化；新增设置 `force_creating_set_partitions_independently` (默认禁用) 可跳过此检查。该优化由新增设置 `allow_creating_set_partitions_independently` (默认启用) 控制。[#114645](https://github.com/ClickHouse/ClickHouse/pull/114645) ([nihalzp](https://github.com/nihalzp))。
* 将已轮转且未配置生存时间 (TTL) 的非复制 `MergeTree` 系统日志表标记为 `table_readonly`，以避免不必要的后台操作。`table_readonlyMergeTree` 设置现在还会禁止普通 `MergeTree` 表上的所有后台工作 (包括常规合并、生存时间 (TTL) (`DELETE`/`MOVE`/重新压缩) 合并和重新压缩合并、后台变更以及后台分片移动) ，并拒绝会修改数据的分区命令 (`ATTACH`/`MOVE`/`DROP`/`DROP DETACHED`/`FETCH`/`REPLACE PARTITION`，以及以该表为目标的 `MOVE PARTITION ... TO TABLE`) ；此前已拒绝的插入、变更和 `OPTIMIZE` 也仍会被拒绝。因此，在该设置启用期间，配置了生存时间 (TTL) 的 `table_readonly` 表将不再清理其过期数据。[#95079](https://github.com/ClickHouse/ClickHouse/pull/95079) ([matt-metivier](https://github.com/matt-metivier))。

<h3 id="memory-and-resource-efficiency">
  内存与资源效率
</h3>

* 降低 `UNLOCK SNAPSHOT` 的内存使用量：不再加载解锁路径用不到的各数据 part 元数据，避免快照包含海量 parts 时出现内存不足。[#111849](https://github.com/ClickHouse/ClickHouse/pull/111849) ([jkartseva](https://github.com/jkartseva))。
* 减少读取备份元数据时的内存分配：现在每个文件条目都以移动而非复制的方式存入内存映射。[#111718](https://github.com/ClickHouse/ClickHouse/pull/111718) ([jkartseva](https://github.com/jkartseva))。

<h3 id="function-type-and-format-performance">
  函数、类型与格式性能
</h3>

* 将 `Decimal` 值格式化为文本的速度大幅提升——对于 scale 较大的 `Decimal256`，最高可提升 190 倍；对于 `Decimal64`，约提升 1.6 倍。在支持 AVX-512 IFMA 的处理器上，将 64 位整数转换为文本的速度提升约 1.4 倍。同时修复了 `toDecimalString` 的舍入问题：此前该函数会丢失小数部分产生的进位，`toDecimalString(toDecimal64('9.995', 3), 2)` 原先返回 `9.00`，现在正确返回 `10.00`。[#112457](https://github.com/ClickHouse/ClickHouse/pull/112457) ([thevar1able](https://github.com/thevar1able))。
* 提升了 `partial_merge` 连接算法在 `FixedString` 键上的性能：改为批量比较一段连续的值，而不再对每个值单独调用一次比较。[#105737](https://github.com/ClickHouse/ClickHouse/pull/105737) ([4ertus2](https://github.com/4ertus2))。
* `HashJoin` 现已原生支持单列、非 Nullable 的 LowCardinality 字符串键。[#107264](https://github.com/ClickHouse/ClickHouse/pull/107264) ([nickitat](https://github.com/nickitat))。
* 提升了 `replaceAll` 和 `replaceRegexpAll` 在模式和替换内容均为单个字符时的性能 (例如 `replaceRegexpAll(s, ' ', '_')`) 。此类替换不会改变字符串布局，因此现在只需复制一次列，并就地改写匹配的字节，而不再针对每次匹配执行搜索循环。[#108178](https://github.com/ClickHouse/ClickHouse/pull/108178) ([groeneai](https://github.com/groeneai))。
* 加快了在 best-effort 模式 (`date_time_input_format = 'best_effort'`、`cast_string_to_date_time_mode = 'best_effort'`，即默认设置) 下解析规范 `YYYY-MM-DD hh:mm:ss` 日期时间格式的速度，从而消除了这些默认值从 `basic` 切换为 `best_effort` 时引入的解析性能回退。[#108187](https://github.com/ClickHouse/ClickHouse/pull/108187) ([groeneai](https://github.com/groeneai))。
* 深度嵌套的 array 和 tuple 字面量的解析时间复杂度由平方级降为线性。[#108892](https://github.com/ClickHouse/ClickHouse/pull/108892) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对于 `SECOND`、`MINUTE` 和 `HOUR` 时间间隔，函数 `toStartOfInterval` (别名 `time_bucket`、`date_bin`) 的速度最高提升 5 倍。[#109729](https://github.com/ClickHouse/ClickHouse/pull/109729) ([raimannma](https://github.com/raimannma))。
* 不带 lambda 调用时，函数 `arraySort` 和 `arrayReverseSort` 处理数值数组 (包括 `Decimal` 和 `DateTime64`) 的速度提升数倍。[#109832](https://github.com/ClickHouse/ClickHouse/pull/109832) ([raimannma](https://github.com/raimannma))。
* 通过采用算术快速路径，加快了 `addDays`、`addWeeks`、`subtractDays` 和 `subtractWeeks` 在固定偏移时区 (如 UTC) 下处理 `DateTime` 和 `DateTime64` 值的速度。[#109836](https://github.com/ClickHouse/ClickHouse/pull/109836) ([raimannma](https://github.com/raimannma))。
* 对 `Delta` 编解码器的解压缩进行了向量化。对于 8/16/32 位数据类型，解码速度提升 1.5–5 倍，扫描 `Delta` 压缩列的速度最高可提升 20%。[#110189](https://github.com/ClickHouse/ClickHouse/pull/110189) ([raimannma](https://github.com/raimannma))。
* 加快了字符串搜索函数 (`like`、`position`、`match`、`countSubstrings`、`hasToken` 等) 使用常量 needle 搜索 `Enum` 列的速度：仅在去重后的枚举名称中搜索，再将结果逐行映射回去，而不再逐行搜索。[#110325](https://github.com/ClickHouse/ClickHouse/pull/110325) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在 needle 为非常量的情况下，将子串搜索函数 (`position`、`countSubstrings`、`multiSearch*`、`replaceAll`/`replaceOne`，以及它们的不区分大小写变体和 UTF-8 变体) 的性能最高提升至 1.5 倍。具体做法是在逐行处理路径上改用基于 SIMD 的字符串搜索器，不再回退到朴素实现。[#110580](https://github.com/ClickHouse/ClickHouse/pull/110580) ([Algunenano](https://github.com/Algunenano))。
* 提升了对包含大量动态 Variant 或 JSON 路径的 `Dynamic` 和 `Object` 列进行块压缩合并 (squashing) 与合并 (merging) 的性能。[#110583](https://github.com/ClickHouse/ClickHouse/pull/110583) ([cv4g](https://github.com/cv4g))。
* 提升了使用 `NONE` 编解码器时 `estimateCompressionRatio` 的执行速度 [#111107](https://github.com/ClickHouse/ClickHouse/pull/111107) ([rienath](https://github.com/rienath))。
* 对于路径存储在共享数据中的 `JSON` 列，加快了排序及其他基于比较的操作。此前，每次比较值时都会物化一个临时 `Dynamic` 列，并对比较双方执行完整的二进制反序列化，导致对此类列执行 `ORDER BY` 慢得异常。[#111894](https://github.com/ClickHouse/ClickHouse/pull/111894) ([groeneai](https://github.com/groeneai))。
* 256 位整数 (`Int256`、`UInt256` 和 `Decimal256`) 的除法现在以 64 位 limb 为单位逐段计算商：当除数可用 64 位表示时，使用 128 / 64 除法循环，否则使用 Knuth 的 Algorithm D，不再采用逐比特移位相减的长除法。此改动影响 `intDiv`、`modulo`、`Decimal256` 算术运算，以及这些类型到文本的转换。[#112477](https://github.com/ClickHouse/ClickHouse/pull/112477) ([thevar1able](https://github.com/thevar1able))。
* 从二进制编码的类型 (`Native`，或启用了 `input_format_binary_decode_types_in_binary_format` 的 `RowBinary`) 中读取 `Nested` 列时，不再先将类型转换回类型名称再重新解析。此外，格式错误的嵌套 `Tuple` 类型名称现在会直接报告为语法错误，而不会再耗费随嵌套深度呈指数增长的时间，最终以 `TOO_SLOW_PARSING` 失败。[#112560](https://github.com/ClickHouse/ClickHouse/pull/112560) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 加快了针对 TimeSeries 表的 PromQL 查询：当连续多行的 series id 相同时，`timeSeriesIdToGroup` 现在会复用上一行的分组，从而省去逐行的 id 序列化和哈希查找。[#113580](https://github.com/ClickHouse/ClickHouse/pull/113580) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。

<h3 id="other-performance-improvements">
  其他性能提升
</h3>

* 为 `Arrow` 和 `ArrowStream` 格式实现了不依赖 Apache Arrow 库的原生读取器和写入器，避免了额外的数据复制和转换。该实现现已设为默认 (对应设置 `input_format_arrow_use_native_reader` 和 `output_format_arrow_use_native_writer`) ，读写速度均有提升。[#106522](https://github.com/ClickHouse/ClickHouse/pull/106522) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 优化 `nullIf(key, sentinel) = const` 谓词，使其能够构建键范围，从而支持主键、分区和跳过索引裁剪。[#107308](https://github.com/ClickHouse/ClickHouse/pull/107308) ([adityaksolves](https://github.com/adityaksolves))。
* 将 \`INTERSECT ALL\` 和 \`EXCEPT ALL\` (\`INTERSECT\` 和 \`EXCEPT\` 的默认模式) 的性能提升了数倍：现在直接以行值作为多重集的键，不再使用 SipHash 对每一行计算哈希。[#107649](https://github.com/ClickHouse/ClickHouse/pull/107649) ([Algunenano](https://github.com/Algunenano))。
* 借助 LLVM 将简单正则表达式编译为原生代码，加速了 `match`、`extract`、`extractAll`、`replaceRegexpOne` 和 `replaceRegexpAll` 函数。该功能由新增设置 `compile_regular_expressions` 控制 (默认启用) ；超出支持范围的模式会透明地回退到 RE2 引擎。[#108004](https://github.com/ClickHouse/ClickHouse/pull/108004) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 利用 NEON 对短偏移重叠复制进行向量化，加快了 AArch64 (ARM) 上匹配偏移较小的列 (例如定宽整数列) 的 ZSTD 解压缩速度。例如，在 AWS Graviton 4 上，`UInt64` 列的解压缩速度最高可提升约 2.3 倍。[#108049](https://github.com/ClickHouse/ClickHouse/pull/108049) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 提升了定长、低基数列的 LZ4 解压缩速度。[#108175](https://github.com/ClickHouse/ClickHouse/pull/108175) ([nickitat](https://github.com/nickitat))。
* 通过在分块 Myers 代码路径中避免逐行堆内存分配，提升了 ARM 上 `levenshteinDistance` (及 `editDistance`) 处理中等长度字符串的性能。[#108185](https://github.com/ClickHouse/ClickHouse/pull/108185) ([groeneai](https://github.com/groeneai))。
* 加快了在 `precise_float_parsing = 1` 时从文本解析浮点数的速度，在几乎所有输入上都不慢于默认解析器，甚至更快。同时将内置的 `fast_float` 库升级至 v8.2.10。[#108205](https://github.com/ClickHouse/ClickHouse/pull/108205) ([Algunenano](https://github.com/Algunenano))。
* Base64 编码和解码函数现已改用 `simdutf`，性能得到提升。[#108333](https://github.com/ClickHouse/ClickHouse/pull/108333) ([thevar1able](https://github.com/thevar1able))。
* 针对计算开销较大的高基数键优化了 `DISTINCT`。[#108366](https://github.com/ClickHouse/ClickHouse/pull/108366) ([nihalzp](https://github.com/nihalzp))。
* 通过启用不保留 `errno` 的编译器优化，提升了数学函数的性能。[#108628](https://github.com/ClickHouse/ClickHouse/pull/108628) ([nickitat](https://github.com/nickitat))。
* 对于 `T64` 编码的列，改为通过解析计算得出压缩后大小，而非实际执行压缩，从而加快了 `estimateCompressionRatio` 的速度。[#109054](https://github.com/ClickHouse/ClickHouse/pull/109054) ([rienath](https://github.com/rienath))。
* JOIN 现在可以利用左表的主键索引或跳过索引来裁剪数据颗粒。[#109085](https://github.com/ClickHouse/ClickHouse/pull/109085) ([shankar-iyer](https://github.com/shankar-iyer))。
* 提升 H3 地理函数 (`h3ToGeoBoundary`、`h3ToGeo`、`h3CellAreaM2`/`h3CellAreaRads2`、`geoToH3`) 的性能：成对的正弦/余弦值改为一次性同时计算，并消除了坐标变换中冗余的三角函数调用。计算结果保持不变 (逐比特完全一致) 。[#109399](https://github.com/ClickHouse/ClickHouse/pull/109399) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 将比较和符号扩展代码改为无分支实现，使宽整数类型 (`Int128`、`UInt128`、`Int256`、`UInt256` 以及基于它们的类型，如 `Decimal128`) 的比较运算 (`<`、`>`、`<=`、`>=`) 性能最高提升 7 倍，有符号整数转换为 `Int256` 的性能也最高提升 7 倍 (针对正负混合数据) 。[#109474](https://github.com/ClickHouse/ClickHouse/pull/109474) ([raimannma](https://github.com/raimannma))。
* 对于只有单个非常量 `Nullable` 参数的函数，其结果现在直接共享该参数的空值映射，不再分配并合并新的空值映射。[#110151](https://github.com/ClickHouse/ClickHouse/pull/110151) ([raimannma](https://github.com/raimannma))。
* 改用向量化归约替代逐元素比较循环，使函数 `arrayMin` 和 `arrayMax` 在数值数组上的性能提升约 1.3-1.5 倍。[#110163](https://github.com/ClickHouse/ClickHouse/pull/110163) ([raimannma](https://github.com/raimannma))。
* 当输入流已按 distinct 列的前缀排序时 (例如 `SELECT DISTINCT a, b FROM table ORDER BY a`) ，提升 `DISTINCT` 的性能。此类查询最高可提速 2.4 倍。[#110170](https://github.com/ClickHouse/ClickHouse/pull/110170) ([nihalzp](https://github.com/nihalzp))。
* 为 `groupBitOr`/`groupBitAnd`/`groupBitXor` 以及方差函数家族 (`varPop`、`varSamp`、`stddevPop`、`stddevSamp`、`skewPop`、`skewSamp`、`kurtPop`、`kurtSamp`、`covarPop`、`covarSamp`、`corr`) 实现了向量化批处理路径：在条件不可预测时，配合 `-If` 组合器使用最高可提速 4 倍；方差函数家族在不使用该组合器时最高可提速 3 倍。[#110461](https://github.com/ClickHouse/ClickHouse/pull/110461) ([raimannma](https://github.com/raimannma))。
* 优化了文本索引的分析过程。[#110530](https://github.com/ClickHouse/ClickHouse/pull/110530) ([CurtizJ](https://github.com/CurtizJ))。
* 将十六进制字符的校验与转换从两次遍历合并为一次，加快了从文本解析 `UUID` 值的速度 (例如使用 `JSONExtract` 提取为 `LowCardinality(UUID)`、`toUUID`、`CAST AS UUID`) 。[#110625](https://github.com/ClickHouse/ClickHouse/pull/110625) ([groeneai](https://github.com/groeneai))。
* 借助 SSSE3 `pshufb` 对短偏移量的重叠拷贝进行向量化，加快了 x86\_64 平台上匹配偏移量较小的列 (例如定宽整数列) 的 ZSTD 解压缩速度 (相当于 [#108049](https://github.com/ClickHouse/ClickHouse/pull/108049) 中 AArch64 NEON 优化在 x86\_64 上的对应实现) 。[#110909](https://github.com/ClickHouse/ClickHouse/pull/110909) ([thevar1able](https://github.com/thevar1able))。
* 改用 CRC32 哈希 (与 `uniqExact` 相同) 并内联逐行插入操作，使数值类型的 `groupUniqArray` 最高提速 3 倍。[#110917](https://github.com/ClickHouse/ClickHouse/pull/110917) ([raimannma](https://github.com/raimannma))。
* 提升浮点列的 minmax 及基础列统计信息的效率。[#111221](https://github.com/ClickHouse/ClickHouse/pull/111221) ([cv4g](https://github.com/cv4g))。
* 现在可直接根据文本索引的基数元数据返回 `COUNT()` 查询的结果。[#111494](https://github.com/ClickHouse/ClickHouse/pull/111494) ([ahmadov](https://github.com/ahmadov))。
* 提升了 `min` 和 `max` 在 128 位和 256 位类型 (`Int128`、`UInt128`、`Int256`、`UInt256`、`Decimal128`、`Decimal256`) 上的执行速度。宽整数类型最高提速 1.8 倍，宽十进制类型最高提速 3.4 倍。[#111965](https://github.com/ClickHouse/ClickHouse/pull/111965) ([raimannma](https://github.com/raimannma))。
* 修复了 `system.query_log` 写入过程中的性能回退问题。此前构建 `Settings` 和 `asynchronous_read_counters` 这两个 Map 列的速度比原来慢约 6 倍，在记录大量查询且每个查询都更改了许多设置的服务器上，可能导致 `SYSTEM FLUSH LOGS query_log` 超出 180 秒的超时时间。[#112210](https://github.com/ClickHouse/ClickHouse/pull/112210) ([groeneai](https://github.com/groeneai))。
* 新增可选功能，用于缓存文本索引中不存在的词元。[#112742](https://github.com/ClickHouse/ClickHouse/pull/112742) ([rorylshanks](https://github.com/rorylshanks))。
* 异步日志现在使用有界无锁队列：写入日志消息的线程不会再因互斥锁而阻塞，也不会唤醒日志线程。[#112803](https://github.com/ClickHouse/ClickHouse/pull/112803) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 当 point 参数是类型为 `Point` (或其他由两个数值元素组成的 `Tuple`) 的完整键列时，`pointInPolygon` 现在会使用主键索引，例如对按 `coord` 排序的表执行 `pointInPolygon(coord, [...])`。此前仅会分析使用两个标量键列的 `pointInPolygon((x, y), [...])` 形式。[#112956](https://github.com/ClickHouse/ClickHouse/pull/112956) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `text_index_posting_list_apply_mode` 的默认值现为 `lazy`。因此，对于设置了 `posting_list_codec` 的文本索引，文本索引查询会借助游标以打包块粒度按需解码倒排列表，而不再预先将其物化为位图。[#113521](https://github.com/ClickHouse/ClickHouse/pull/113521) ([CurtizJ](https://github.com/CurtizJ))。
* 当标签组 ID 位于紧凑范围内时，改用直接索引替代基于哈希的重映射，从而加快向量化 TimeSeries 标签转换。[#114244](https://github.com/ClickHouse/ClickHouse/pull/114244) ([fallintoplace](https://github.com/fallintoplace))。
* 提升了文本索引合并的性能。[#114525](https://github.com/ClickHouse/ClickHouse/pull/114525) ([CurtizJ](https://github.com/CurtizJ))。
* PromQL 集合运算符现使用紧凑的存在掩码。[#115224](https://github.com/ClickHouse/ClickHouse/pull/115224) ([fallintoplace](https://github.com/fallintoplace))。
* 挂载系统表时，不再仅为设置表注释而将每个表的元数据 (包括完整的列描述) 复制两次。[#115490](https://github.com/ClickHouse/ClickHouse/pull/115490) ([thevar1able](https://github.com/thevar1able))。
* 加快了针对全零 PromQL 条件向量的重复序列检查。[#115822](https://github.com/ClickHouse/ClickHouse/pull/115822) ([fallintoplace](https://github.com/fallintoplace))。
* 加快了 `toUTCTimestamp`/`to_utc_timestamp` 和 `fromUTCTimestamp`/`from_utc_timestamp` 处理 `DateTime64` 参数的速度，使其吞吐量恢复到此前溢出修正后的水平。结果保持不变。[#115838](https://github.com/ClickHouse/ClickHouse/pull/115838) ([groeneai](https://github.com/groeneai))。
* 降低了 x86-64 平台上随机数据生成 (`rand`、`rand64`、`randomString`、`randomFixedString`、`generateUUIDv4`、`generateUUIDv7`) 的固定初始化开销。块较小时效果尤为明显；生成的值不受影响。[#116158](https://github.com/ClickHouse/ClickHouse/pull/116158) ([Algunenano](https://github.com/Algunenano))。
* 现在可以通过 `enable_function_early_short_circuit` 设置，在分析阶段对内置的 `and` 和 `or` 启用提前短路折叠。这样可以跳过执行无效的单行 `count()` 标量子查询，同时保留常规的类型推断和语义校验。[#83505](https://github.com/ClickHouse/ClickHouse/pull/83505) ([fhw12345](https://github.com/fhw12345))。
* 对可平凡序列化的向量改为使用单次缓冲区 IO 调用 [#89842](https://github.com/ClickHouse/ClickHouse/pull/89842) ([Ergus](https://github.com/Ergus))。
* 默认启用 `optimize_or_like_chain`。[#94517](https://github.com/ClickHouse/ClickHouse/pull/94517) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在服务器用户数量较多时，提升了从 system.users 中拉取单个用户记录的性能。[#96699](https://github.com/ClickHouse/ClickHouse/pull/96699) ([alistairjevans](https://github.com/alistairjevans))。

<h2 id="improvements">
  改进
</h2>

<h3 id="query-and-sql-improvements">
  查询与 SQL 改进
</h3>

* 在 `UNION` 查询的多个分支中引用的 Materialized CTE 现在只会物化一次，并在所有分支之间共享。此前，每个分支都会获得各自的 CTE 副本，并将其内联后单独求值。[#102107](https://github.com/ClickHouse/ClickHouse/pull/102107) ([novikd](https://github.com/novikd))。
* 当探测端 (probe side) 的估算规模较小时，跳过 JOIN 运行时过滤器。新增设置 `join_runtime_filter_min_probe_rows` (默认值为 `1000`) 用于控制该阈值 [#104860](https://github.com/ClickHouse/ClickHouse/pull/104860) ([vdimir](https://github.com/vdimir))。
* 将 `EXPLAIN [PLAN] actions=1, compact=1, pretty=1` 设为默认行为。[#105036](https://github.com/ClickHouse/ClickHouse/pull/105036) ([Fgrtue](https://github.com/Fgrtue))。
* 降低了 LIMIT BY 正向形式 (LimitByTransform、LimitBySortedStreamTransform) 的取消延迟：KILL QUERY 和 Ctrl+C 现在可在单个数据块内中断处理，无需等待整个步骤完成。[#106070](https://github.com/ClickHouse/ClickHouse/pull/106070) ([rvasin](https://github.com/rvasin))。
* JOIN 查询现已支持自动并行副本。[#106073](https://github.com/ClickHouse/ClickHouse/pull/106073) ([nickitat](https://github.com/nickitat))。
* 新增异步指标 UntrackedMemory (可在 `system.asynchronous_metrics` 中查看) ，用于报告线程已分配但尚未计入全局内存跟踪计数器的内存。每个线程会先在本地累积小额分配，再批量上报。这有助于解释 `MemoryTracking` 与进程实际内存使用量之间的差异。`MEMORY_LIMIT_EXCEEDED` 错误消息现在也会包含未跟踪内存的大小，便于了解查询或服务器为何触及内存上限。[#106386](https://github.com/ClickHouse/ClickHouse/pull/106386) ([mstetsyuk](https://github.com/mstetsyuk))。
* 在构建插入管道时，如果 materialized view 的 `TO` target table 拒绝写入 (例如目标是 `View`，或不支持事务) 导致 `INSERT` 失败，错误消息现在会指明该 materialized view 及其 target table，而不再仅报告底层存储错误。[#107234](https://github.com/ClickHouse/ClickHouse/pull/107234) ([groeneai](https://github.com/groeneai))。
* 对具名 `Tuple` 执行 `ALTER TABLE ... MODIFY COLUMN <col> Tuple(...)` 时，如果仅添加子字段，现在只需修改元数据，速度与顶层 `ADD COLUMN` 相当。该功能需通过 `SET allow_metadata_only_named_tuple_alter = 1` 启用。[#107305](https://github.com/ClickHouse/ClickHouse/pull/107305) ([amosbird](https://github.com/amosbird))。
* 为 `MaterializedPostgreSQL` 数据库引擎新增创建时设置 `materialized_postgresql_use_extended_date_and_time_types`。默认 (启用) 情况下，PostgreSQL 的 `date`/`timestamp` 列会被推断为 `Date32`/`DateTime64`；若在 `CREATE DATABASE` 时将其设为 `0`，则会推断为范围更窄的 `Date`/`DateTime` 类型。该设置不适用于 `MaterializedPostgreSQL` 表引擎。[#107428](https://github.com/ClickHouse/ClickHouse/pull/107428) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 当连接的估算结果行数来自提示或随机回退值而非表统计信息时，`EXPLAIN PLAN` 现在会将其标记为近似值 (`~~...`) ，便于识别缺少可靠统计信息、无法有效进行 JOIN 重排序的执行计划。[#107666](https://github.com/ClickHouse/ClickHouse/pull/107666) ([vdimir](https://github.com/vdimir))。
* 向 `MergeTree` 表执行 `INSERT` 时，在写入大量数据分片的过程中现在会响应查询取消和 `max_execution_time`，不再出现被终止后仍长时间运行的情况。[#107929](https://github.com/ClickHouse/ClickHouse/pull/107929) ([al13n321](https://github.com/al13n321))。
* `arrayFold` 现在会响应查询取消和 `max_execution_time`。此前，对超长 array 执行 fold (例如 `arrayFold(acc, x -> arrayPushFront(acc, x), range(number), emptyArrayUInt64())`) 时，整个 fold 过程都在单次函数调用中完成，无法中断，因此在 fold 结束之前，`KILL QUERY` 和时间限制都不会生效。[#108192](https://github.com/ClickHouse/ClickHouse/pull/108192) ([groeneai](https://github.com/groeneai))。
* 新增按阶段划分的查询执行前 `ProfileEvents`：`QueryParseMicroseconds`、`QueryAnalysisMicroseconds`、`QueryPlanBuildMicroseconds` 和 `QueryPipelineBuildMicroseconds`。它们展示了查询执行前各阶段 (解析、分析、查询计划构建、管道构建) 的耗时情况，可在 `system.query_log` 和 `system.events` 中查看。[#108282](https://github.com/ClickHouse/ClickHouse/pull/108282) ([jrdi](https://github.com/jrdi))。
* 如果 `ALTER TABLE` 操作生成的表元数据会超过 `max_query_size`，该操作现在会被预先拒绝，从而避免 DDL 分发和副本恢复等组件无法加载该表。[#108283](https://github.com/ClickHouse/ClickHouse/pull/108283) ([lockie](https://github.com/lockie))。
* 新增 `ConstantJoin`，用于笛卡尔连接以及由 analyzer 规划的常量谓词连接，因此在使用 analyzer 时，这些查询不会再因 `join_algorithm` 设置不兼容而失败。[#108289](https://github.com/ClickHouse/ClickHouse/pull/108289) ([antaljanosbenjamin](https://github.com/antaljanosbenjamin))。
* 在 `system.documentation` 中新增 `source` 列，记录定义各实体文档的源文件路径。该表现在还收录了压缩编解码器、profile events、当前指标、异步指标以及系统表本身 (及其列) 的文档，设置的文档中也新增了类型和默认值。[#108346](https://github.com/ClickHouse/ClickHouse/pull/108346) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 如果在 WHERE 中提供 `table` 和 `database` 过滤条件，`system.iceberg_history` 将只列出匹配的数据库。当服务器上存在大量无关的远程数据库时，这可以节省一定时间。[#108492](https://github.com/ClickHouse/ClickHouse/pull/108492) ([Diskein](https://github.com/Diskein))。
* 查询参数 (`{name:Type}` 替换) 现在可以用作设置值，既可用于查询 (如 `SELECT` 或 `INSERT`) 的 `SETTINGS` 子句，也可用于独立的 `SET` 查询，例如 `SELECT ... SETTINGS max_threads = {threads:UInt64}` 和 `SET max_threads = {threads:UInt64}`。[#108760](https://github.com/ClickHouse/ClickHouse/pull/108760) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 支持在 EXPLAIN WHATIF 中计算跳数索引的综合收益。结果会显示数据比例，即所有现有适用假设索引效果的交集。[#108934](https://github.com/ClickHouse/ClickHouse/pull/108934) ([yariks5s](https://github.com/yariks5s))。
* 仅包含单个 CTE 的查询现在会采用与包含多个 CTE 的查询相同的换行和缩进格式。此前，`WITH a AS (...)` 会将 CTE 与 `WITH` 放在同一行，而包含两个或更多 CTE 时，`WITH` 会单独占一行，且每个 CTE 均缩进。[#109092](https://github.com/ClickHouse/ClickHouse/pull/109092) ([groeneai](https://github.com/groeneai))。
* 通过 `File` 表引擎读取的本地 Parquet 文件现已支持查询条件缓存 (此前仅支持对象存储和数据湖) 。[#109247](https://github.com/ClickHouse/ClickHouse/pull/109247) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对于远程 (对象存储) Parquet 文件，查询条件缓存现在除路径外还以 ETag 作为键，因此原地覆盖对象后不会再返回过期的缓存结果。[#109310](https://github.com/ClickHouse/ClickHouse/pull/109310) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对于在 `ON` 条件中被判定相等的 `INNER JOIN` 键，非限定引用 (例如 `SELECT id FROM a INNER JOIN b ON a.id = b.id`) 不再被报告为歧义标识符，因为两侧的值必然相同。[#109366](https://github.com/ClickHouse/ClickHouse/pull/109366) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 基于 `QBit` 的转置距离函数 (`L2DistanceTransposed`、`cosineDistanceTransposed`、`dotProductTransposed`，以及对应的量化版本 `L2DistanceTransposedQuantized`、`cosineDistanceTransposedQuantized`、`dotProductTransposedQuantized`) 现在可以接受长度超过待搜索维度数的参考向量，多余的尾随元素将被忽略。因此，在进行降维 (Matryoshka) 搜索时，可以直接复用完整的查询向量，无需先对其切片。[#109388](https://github.com/ClickHouse/ClickHouse/pull/109388) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增合理性检查，确保分布式查询始终携带已知的客户端版本；若未携带，将抛出逻辑错误，而不是静默地向远程分片转发零版本。由服务器发起的查询 (后台刷写、流式消费者、字典重新加载、异步插入刷写) 现在会将服务器自身的版本作为发起方版本上报。[#109408](https://github.com/ClickHouse/ClickHouse/pull/109408) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 此补丁修复了对 MergeTree 系列表引擎执行变更 (mutation) 操作时，在 where 子句中使用限定列名的问题。[#109491](https://github.com/ClickHouse/ClickHouse/pull/109491) ([Michicosun](https://github.com/Michicosun))。
* 分布式查询计划 (`make_distributed_plan`) 现已支持非分区窗口函数 (`OVER (ORDER BY ...)`) 。此前，由于 `WindowStep` 无法序列化以供远程执行，任何包含窗口函数的查询都会失败；带有 `PARTITION BY` 的窗口目前仍不受支持。[#109802](https://github.com/ClickHouse/ClickHouse/pull/109802) ([VighneshPath](https://github.com/VighneshPath))。
* 现在可以通过 `ALTER DATABASE ... MODIFY SETTING = 'xxx'` 修改 one-lake catalog 的部分认证设置。[#110019](https://github.com/ClickHouse/ClickHouse/pull/110019) ([alesapin](https://github.com/alesapin))。
* 当 `IN` 右侧子查询仅返回一列，且该列是比左侧参数多一维的数组时，现在会将其解释为该数组元素的集合 (与数组字面量或返回数组的函数的处理方式相同) ，而不再报出令人费解的类型不匹配错误。例如，`x IN (SELECT groupArray(x) FROM ...)` 现在可以正常工作。[#110169](https://github.com/ClickHouse/ClickHouse/pull/110169) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 借助 TopK 动态过滤加速的查询 (`ORDER BY ... LIMIT k`) 现在能更充分地利用查询条件缓存：即使应用了延迟物化，也会填充缓存；并且此类查询可以复用此前由具有相同 `WHERE` 谓词的普通查询写入的缓存条目。[#110507](https://github.com/ClickHouse/ClickHouse/pull/110507) ([shankar-iyer](https://github.com/shankar-iyer))。
* 当请求的表不存在时，`SHOW CREATE TABLE` (以及 `SHOW CREATE VIEW` / `SHOW CREATE DICTIONARY`) 现在会像 `SELECT` 查询一样，在错误消息中提示名称相近的表。[#110633](https://github.com/ClickHouse/ClickHouse/pull/110633) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 STREAM BOUNDED 修饰符，使流式查询仅读取第一个快照后即结束，而不再订阅后续更新。[#110653](https://github.com/ClickHouse/ClickHouse/pull/110653) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni))。
* 修复 PromQL 查询的查询结果缓存问题。`promql` 方言会绕过非确定性函数检查，可能返回锚定于 `now()` 的过期结果；而 Prometheus HTTP API (`/api/v1/query`、`/api/v1/query_range`) 则从未存储任何缓存条目。[#110887](https://github.com/ClickHouse/ClickHouse/pull/110887) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。
* `EXPLAIN ANALYZE` 现在会报告 join 两侧各自的行数、匹配率、扇出，以及特定于算法的状态信息，例如哈希表内存占用和溢写情况。如需收集需要额外记录开销的匹配指标，请使用 `matches = 1`。[#110892](https://github.com/ClickHouse/ClickHouse/pull/110892) ([Fgrtue](https://github.com/Fgrtue))。
* 修复了 pipeline 执行器中的 heap-use-after-free 问题：当查询在运行时移除处理器 (例如结合延迟读取或外部排序使用 `FINAL`) 时，可能导致服务器崩溃。该问题由 AST fuzzer 发现。[#111017](https://github.com/ClickHouse/ClickHouse/pull/111017) ([groeneai](https://github.com/groeneai))。
* 修复了一个 use-after-free (段错误) 问题：当启用共享存储快照 (设置 `enable_shared_storage_snapshot_in_query`) 的查询从快照中剥离数据分片时会触发该问题，例如某个流式子查询所读取的 `MergeTree` 表正被同一查询的其他部分并发读取。[#111192](https://github.com/ClickHouse/ClickHouse/pull/111192) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对于在规划阶段即可确定数据源不会产生任何行的查询 (例如从空的 `MergeTree` 表读取) ，现已支持分布式查询计划 (`make_distributed_plan`) 。此类查询此前会报错 `SUPPORT_IS_DISABLED`。[#111941](https://github.com/ClickHouse/ClickHouse/pull/111941) ([groeneai](https://github.com/groeneai))。
* 修复了当 `WHERE` 子句包含多个 `AND` 条件时，被最后一个合取项以外的条件排除的粒度未写入*查询条件缓存*的问题。[#112083](https://github.com/ClickHouse/ClickHouse/pull/112083) ([shankar-iyer](https://github.com/shankar-iyer))。
* 降低了使用分桶共享数据序列化 (map\_with\_buckets 和 advanced) 写入 JSON 列时的峰值内存占用：写入时逐个将共享数据拆分到各个桶中，而不是同时物化所有桶。这主要对 Array(JSON) 列有益：对于标量 JSON，共享数据按粒度拆分 (受 index\_granularity\_bytes 限制) ，因此节省有限；而单个 Array(JSON) 粒度可能包含大量嵌套行，进而包含大量共享数据，此时逐桶拆分可显著降低峰值内存占用 [#112172](https://github.com/ClickHouse/ClickHouse/pull/112172) ([Avogar](https://github.com/Avogar))。
* 内存预留调度 (experimental) 中，如果待处理的内存释放足以腾出超限预留增长所需的空间，则不再驱逐分配：驱逐决策现在会等待进行中的内存减少操作生效后再做出，从而避免在内存压力下不必要地终止查询。[#112299](https://github.com/ClickHouse/ClickHouse/pull/112299) ([serxa](https://github.com/serxa))。
* `SYSTEM DROP FILESYSTEM CACHE` 现在会并行删除缓存元数据键，从而加快大规模文件系统缓存的清理速度。新增的文件缓存设置 `drop_cache_threads` 用于控制删除工作线程的数量，默认值为 16；设为 1 时将在查询线程中执行删除。[#112532](https://github.com/ClickHouse/ClickHouse/pull/112532) ([kssenii](https://github.com/kssenii))。
* 列声明的修饰符 (`COMMENT`、`CODEC`、`STATISTICS`、`TTL`、`COLLATE`、`PRIMARY KEY` 以及列级 `SETTINGS`) 现在在 `CREATE TABLE` 中可以按任意顺序书写，但每个修饰符最多出现一次。此前仅接受一种固定顺序，例如 `x UInt64 CODEC(ZSTD) COMMENT 'text'` 会被视为语法错误。在 `ALTER TABLE ... ADD COLUMN` / `MODIFY COLUMN` 中，所支持的修饰符 (`COMMENT`、`CODEC`、`STATISTICS`、`TTL` 以及列级 `SETTINGS`) 同样可以按任意顺序书写；`ADD COLUMN` 中的列级 `SETTINGS`，以及 `ADD COLUMN` / `MODIFY COLUMN` 中声明的 `STATISTICS`，现在会真正生效，而不再被静默丢弃；这些 `ALTER` 命令中的 `COLLATE` 和 `PRIMARY KEY` 现在会抛出异常，而不再被静默忽略。[#112788](https://github.com/ClickHouse/ClickHouse/pull/112788) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对匹配大量表的 `Merge` 表 (或 `merge` 表函数) 执行查询时，现在在构建各表查询计划的过程中即可响应 `KILL QUERY` 和 `max_execution_time`，而无需等到所有子表的规划全部完成。[#113415](https://github.com/ClickHouse/ClickHouse/pull/113415) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在 `timeout_overflow_mode = 'break'` 下，若对 `Merge` 表执行的 `SELECT` 超过 `max_execution_time`，现在会立即停止为其余匹配的表构建查询计划，而不再先对每个匹配的表完成完整的查询分析后才停止。与该模式的文档说明一致，查询仍会正常结束，不会报错。[#113642](https://github.com/ClickHouse/ClickHouse/pull/113642) ([groeneai](https://github.com/groeneai))。
* 读取 `MergeTree` 时，如果某列的声明类型与其实际数据不一致 (类型来源混杂，例如 `ALTER TABLE ... MODIFY COLUMN` 的变更尚未完成时) ，服务器现在会抛出明确的异常，指明列名及两种结构，而不再执行未经检查的类型转换：此前，debug 和 sanitizer 构建会直接中止，仅给出一条不含列名的 `Bad cast from type A to B`，而 release 构建则会悄无声息地访问不匹配的内存。[#114087](https://github.com/ClickHouse/ClickHouse/pull/114087) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 默认启用 `ie_join`：`join_algorithm` 的默认值现为 `direct,parallel_hash,hash,ie_join`。如果 `JOIN` 的 `ON` 子句中仅包含不等式条件 (即在参与连接的表的表达式之间进行两次 `<`、`<=`、`>`、`>=` 比较) ，现在会使用基于排序的 IEJoin 算法执行，而不再采用带过滤条件的 `CROSS JOIN`；同时，带此类条件的 `LEFT`/`RIGHT`/`FULL`/`SEMI`/`ANTI` 连接也已得到支持。由于 `ie_join` 位于列表末尾，只有在其他算法均不适用时才会使用它。[#114327](https://github.com/ClickHouse/ClickHouse/pull/114327) ([vdimir](https://github.com/vdimir))。
* 将 OpenTelemetry trace 上下文传播到用于异步建立连接和执行远程查询的 fiber 中 (hedged requests、`async_socket_for_remote`、`async_query_sending_for_remote`) 。分布式查询中远程查询的 span 现在会正确地以发起方的 `Connection::sendQuery` span 为父级，而不再直接挂到客户端提供的 trace 上下文下；此外，每次异步任务执行都会生成独立的 span。[#114813](https://github.com/ClickHouse/ClickHouse/pull/114813) ([diegomestre2](https://github.com/diegomestre2))。
* `DROP DATABASE` 现在会同时依据加载依赖和引用依赖，按逆拓扑顺序删除表 (此前仅考虑加载依赖) ，因此即使 `DROP DATABASE` 执行中途发生崩溃，也不会遗留依赖项已被删除的表。[#114952](https://github.com/ClickHouse/ClickHouse/pull/114952) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 支持 PostgreSQL 风格的正则表达式匹配运算符：`~` (`match` 函数的别名) 、`~*` (不区分大小写匹配) 、`!~` 和 `!~*` (取反) 。通过 PostgreSQL 兼容协议连接到 ClickHouse 时，`psql` 的 `\d`、`\dt`、`\dv` 命令现已可用，且查询失败不再导致连接中断。[#115066](https://github.com/ClickHouse/ClickHouse/pull/115066) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `EXPLAIN WHATIF` 现在会说明跳过经验估算的原因：当 `empirical_status` 为 `unsupported` 时，会显示新增的 `empirical_reason` 行。[#115140](https://github.com/ClickHouse/ClickHouse/pull/115140) ([yariks5s](https://github.com/yariks5s))。
* 当 `join_algorithm` 设置所启用的连接算法均无法执行某个 `JOIN` 时，错误消息现在会列出已尝试的算法，以及失败 JOIN 的严格性和类型，而不再只是笼统地报告所有算法均不可用。[#115226](https://github.com/ClickHouse/ClickHouse/pull/115226) ([elkinal](https://github.com/elkinal))。
* 当参考向量为整数数组字面量时 (例如 `ORDER BY L2Distance(vec, [1, 2])`) ，向量搜索查询现在可以使用向量相似度索引。此前，此类查询会静默回退为穷举扫描。[#115255](https://github.com/ClickHouse/ClickHouse/pull/115255) ([rschu1ze](https://github.com/rschu1ze))。
* 如果创建锁文件的那次 `BACKUP` 尝试在写入任何内容之前就失败了 (无论是在占用目标端时，还是在打开归档时) ，现在不会再在目标端遗留锁文件。此前，后续任何备份都无法匹配这种锁，导致对同一目标端的每次重试都会失败，只能手动删除该文件。备份到 `S3` 和 `Azure` 目标端时，也会以独占方式创建锁；若锁属于其他备份，则会报告为并发备份，而不是直接抛出存储返回的错误。[#115387](https://github.com/ClickHouse/ClickHouse/pull/115387) ([jkartseva](https://github.com/jkartseva))。
* 通过采样 (`opentelemetry_start_trace_probability`) 启动的 trace 现在会回写到查询的客户端信息中，使远程查询、分布式二级查询以及 DDL 条目都加入同一个 trace，而不是各自启动互不关联的 trace。[#115619](https://github.com/ClickHouse/ClickHouse/pull/115619) ([diegomestre2](https://github.com/diegomestre2))。
* 修复了对基于 Amazon S3 Tables (会自行管理表位置) 的 Iceberg 表执行 `CREATE TABLE` 的问题。[#115652](https://github.com/ClickHouse/ClickHouse/pull/115652) ([scanhex12](https://github.com/scanhex12))。
* 自适应 `GROUP BY` 聚合 (`enable_adaptive_aggregator`) 现在会评估延迟处理稀有键是否划算；当这些键或聚合参数过宽、复制得不偿失时，会回退到普通算法，因此对大字符串列的聚合 (例如按用户计算 `min(URL)`) 可以达到普通算法的速度和内存开销。新增 `adaptive_aggregator_freeze_threshold_bytes`，用于按字节限制每个线程冻结表的大小 (该阈值与键数量阈值中先达到者触发冻结) 。[#115755](https://github.com/ClickHouse/ClickHouse/pull/115755) ([nihalzp](https://github.com/nihalzp))。
* 新增设置 `query_plan_aggregation_bucket_top_k` (默认启用) ，用于开关以下查询计划优化：当最终聚合的输出交由带 `LIMIT n` 的 `ORDER BY` 处理时，仅物化每个两级桶中最优的 `n` 个分组。该优化现在也会显示在 `EXPLAIN` 输出中。[#116124](https://github.com/ClickHouse/ClickHouse/pull/116124) ([nihalzp](https://github.com/nihalzp))。
* 改进了 `DESCRIBE` 查询对参数化视图的支持。新分析器支持在标量表达式中使用参数化视图。[#68978](https://github.com/ClickHouse/ClickHouse/pull/68978) ([novikd](https://github.com/novikd))。
* 类似 `SELECT * FROM t WHERE id` 的查询现在会在 `id` 列上使用跳数索引。[#89603](https://github.com/ClickHouse/ClickHouse/pull/89603) ([adityachopra29](https://github.com/adityachopra29))。
* 新增 `query_plan_merge_expression_into_join` 设置，允许在 JOIN 重排序优化过程中将 Expression 步骤合并到 JOIN 步骤中。这样一来，JOIN 重排序便可跨越包裹连接的子查询进行 (例如 JOIN 位于带有计算列的子查询内部时) ，从而更好地优化复杂的连接树。[#98533](https://github.com/ClickHouse/ClickHouse/pull/98533) ([vdimir](https://github.com/vdimir))。
* 在 `system.grants` 表中新增 `is_wildcard` 列，用于标识授权是否使用通配符前缀匹配 (例如 `GRANT SELECT ON db*.*`) 。此前，在 `system.grants` 中无法区分同一名称上的通配符授权与精确授权。[#98577](https://github.com/ClickHouse/ClickHouse/pull/98577) ([il9ue](https://github.com/il9ue))。

<h3 id="functions-and-data-types-improvements">
  函数与数据类型
</h3>

* 新增设置 `allow_lossy_numeric_supertype` (默认禁用) 。启用后，当 `if`、`multiIf`、`coalesce`、`ifNull`、`array` 和 `map` 作用于不存在无损公共类型的数值参数时 (例如 `Decimal` 与 `Float64`，或 `Int64` 与 `Float64`) ，结果类型将解析为数值超类型 `Float64` 而非 `Variant`，从而可用于 `sum`、`avg`、`min` 和 `max` 等聚合函数。相关聚合函数的错误消息中现在也会提示该设置名称。[#107236](https://github.com/ClickHouse/ClickHouse/pull/107236) ([groeneai](https://github.com/groeneai))。
* `SOME` / `ALL` 数组量词 (`expr OP SOME(array)` / `expr OP ALL(array)`) 现已支持关键字比较谓词 `IS DISTINCT FROM` 和 `IS NOT DISTINCT FROM`，以及字符串搜索谓词 `LIKE`、`ILIKE`、`NOT LIKE`、`NOT ILIKE` 和 `REGEXP`，这些谓词会被重写为 `arrayExists` / `arrayAll`。[#107454](https://github.com/ClickHouse/ClickHouse/pull/107454) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增 `input_format_json_max_object_size` 设置，用于在解析时限制 JSON 对象的大小。[#107669](https://github.com/ClickHouse/ClickHouse/pull/107669) ([Avogar](https://github.com/Avogar))。
* 修复了打开 SQLite 数据库失败时出现的内存泄漏问题 (例如为 `sqlite` 表函数或 `SQLite` 数据库引擎指定了无法打开的路径时) 。[#107807](https://github.com/ClickHouse/ClickHouse/pull/107807) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `QBit` 数据类型现已支持 `length` 函数，该函数以常量形式返回向量的维度。[#108071](https://github.com/ClickHouse/ClickHouse/pull/108071) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 支持通过 `CAST` 将 `QBit` 转换为 `Array`，以还原原始向量。这是现有 `Array` 到 `QBit` 转换的逆操作。[#108072](https://github.com/ClickHouse/ClickHouse/pull/108072) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `MySQL` 数据库引擎、表引擎和表函数现在会将 MySQL 的空间列类型 (`LINESTRING`、`POLYGON`、`MULTILINESTRING`、`MULTIPOLYGON` 以及通用的 `GEOMETRY`) 映射为相应的 ClickHouse 几何类型，而不再映射为 `String`。该行为由 `mysql_datatypes_support_level` 设置中新增的 `geometry` 标志控制，默认启用。`POINT` 仍始终转换为 `Point`。通用的 `GEOMETRY` 列映射为统一的 `Geometry` 类型；若所读取值的子类型在 ClickHouse 中没有对应类型 (`MULTIPOINT`、`GEOMETRYCOLLECTION`) ，则会在读取时抛出异常。[#108944](https://github.com/ClickHouse/ClickHouse/pull/108944) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 默认采用精确 (取最接近的可表示值) 的浮点数解析算法，并将 `precise_float_parsing` 设置的作用范围扩展到输入格式 (CSV、TSV、JSON、VALUES 等) 和数值字面量，而不再仅限于 `toFloat*`/`CAST`。如需恢复之前的行为 (某些情况下更快，但精度较低) ，请设置 `precise_float_parsing = 0`。[#109086](https://github.com/ClickHouse/ClickHouse/pull/109086) ([Algunenano](https://github.com/Algunenano))。
* 支持通过 `reinterpret` 将由定长元素组成的 `Array` 重新解释为 `String`，这是现有通过 `reinterpret` 将 `String`/`FixedString` 重新解释为 `Array` 的逆操作。[#109383](https://github.com/ClickHouse/ClickHouse/pull/109383) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 允许在元素类型和/或 stride 不同的 `QBit` 类型之间执行 `CAST`，前提是维度保持不变 (例如对 `QBit(Float32, N)` 类型的值执行 `CAST(x AS QBit(Float64, N))`) 。仅更改 stride 的转换是无损的；更改元素类型的转换遵循相应的 `Array` 转换语义 (例如 `Float32` 转换为 `BFloat16` 可能会损失精度，而 `accurateCast` / `accurateCastOrNull` 会拒绝无法精确表示的行) 。[#109387](https://github.com/ClickHouse/ClickHouse/pull/109387) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 函数 `quantizeBFloat16ToInt8` 和 `dequantizeInt8ToBFloat16` 除现有的标量重载外，现在还接受 `Array` 和 `QBit` 参数，对整个向量应用 Lloyd-Max 编解码器 (返回对应元素类型的 `Array`/`QBit`) 。[#109398](https://github.com/ClickHouse/ClickHouse/pull/109398) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `parseDateTime` / `parseDateTime64` (及其 `OrZero` / `OrNull` 变体) 中的 MySQL 风格格式说明符 `%f` 现在接受 1 到 6 位小数，并与 MySQL 的 `STR_TO_DATE` 一样按左对齐的微秒进行解释，不再要求恰好为 6 位。同时修复了内置函数文档示例中 `PrettyCompact` 表格未对齐的问题。[#109421](https://github.com/ClickHouse/ClickHouse/pull/109421) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `basic` 统计信息中的 `NullCount` 子统计项已重命名为 `DefaultCount`：`build` 不再统计 `Nullable` 列中的 `NULL` 行，而是通过 `IColumn::getNumberOfDefaultRows` 统计等于该列类型固有默认值的行数。[#109977](https://github.com/ClickHouse/ClickHouse/pull/109977) ([hanfei1991](https://github.com/hanfei1991))。
* 对于较少使用的混合类型组合 (`Decimal` 与不同宽度的整数，以及涉及 `Int128`/`UInt128`/`Int256`/`UInt256` 的组合) ，比较和算术运算改为先转换为公共类型再执行，不再为每种类型组合单独编译专用内核，从而使二进制文件体积减少约 10.5 MB。相同类型组合、常用组合以及受内存带宽限制的 `plus`/`minus`/`multiply` 仍保留专用内核；结果、结果类型和异常情况均保持不变。[#110131](https://github.com/ClickHouse/ClickHouse/pull/110131) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 当 SQLite 数据库被其他连接锁定时，从 `SQLite` 表引擎或 `sqlite` 表函数读取数据不再忙等并占满一个 CPU 核心。现在读取操作在等待锁期间处于空闲状态，且仍可取消。[#110248](https://github.com/ClickHouse/ClickHouse/pull/110248) ([groeneai](https://github.com/groeneai))。
* 日志和异常消息中的耗时、速率和比率值现在四舍五入保留三位有效数字，诸如 `1.345844286 sec.` 之类的数值不再以全精度输出。[#110277](https://github.com/ClickHouse/ClickHouse/pull/110277) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `MergeTree` 在跳过前导行后读取带有独立 size 流的 `String` 列时，可能返回错误数据或越界读取子流缓存的问题。同时修复了并发或重复读取以 map shared-data 序列化方式存储的 `JSON` 子对象时可能返回错误数据的问题。[#110471](https://github.com/ClickHouse/ClickHouse/pull/110471) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `PostgreSQL` 表引擎和 `postgresql` 表函数现已支持 `SETTINGS` 子句 (例如 `SETTINGS postgresql_connection_pool_size = 50`) ，在功能上与 `MySQL` 引擎看齐。[#110614](https://github.com/ClickHouse/ClickHouse/pull/110614) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 函数 `bitmaskToArray` 和 `bitmaskToList` 现已支持 `(U)Int128` 和 `(U)Int256` 参数。对于大整数参数，函数 `bitPositionsToArray` 的运行时间现在与置位数量成正比，而不再取决于最高置位的位置。[#110743](https://github.com/ClickHouse/ClickHouse/pull/110743) ([raimannma](https://github.com/raimannma))。
* 修复了 GCD 编解码器处理含负数的有符号定宽值时的问题。此前它直接基于有符号值计算除数，可能找不到公约数，从而显著降低有符号整数列和小数列的压缩效率。现在对于有符号类型，会基于绝对值计算除数，同时无符号类型及解压缩的现有行为保持不变。[#113798](https://github.com/ClickHouse/ClickHouse/pull/113798) ([kshcherbatov](https://github.com/kshcherbatov))。
* 带有 `PARTITION BY` 的窗口函数现在可以在 `make_distributed_plan` 下运行。在查询计划结构允许的情况下，窗口会在多个桶之间并行执行，每个桶均接收完整的分区。[#114111](https://github.com/ClickHouse/ClickHouse/pull/114111) ([VighneshPath](https://github.com/VighneshPath))。
* 外部 Nullable 定宽聚合方法现改用 64 位哈希函数 (避免极高基数聚合时出现严重的哈希冲突) 。[#114210](https://github.com/ClickHouse/ClickHouse/pull/114210) ([nickitat](https://github.com/nickitat))。
* 作用于 `LowCardinality` 列的 `x IN (subquery)` 现在返回 `LowCardinality(UInt8)`，与 `x IN (literal list)` 的返回类型一致。此前这两种形式返回的类型不同，包含此类 `IN` 的分布式查询计划需要在计划类型检查中做特殊处理。[#114229](https://github.com/ClickHouse/ClickHouse/pull/114229) ([davenger](https://github.com/davenger))。
* 支持在 `JSON` 数据类型、`JSONExtract` 和 `isValidJSON` 中解析超出 64 位范围的整数。此类值会被读取为 `Int128`/`UInt256` 等宽整数类型，而不再导致整个文档被拒绝。[#114379](https://github.com/ClickHouse/ClickHouse/pull/114379) ([Avogar](https://github.com/Avogar))。
* 新增 `keyword` 作为文本索引分词器 `array` 的别名，以提升与 OpenSearch、Elasticsearch、SolR 和 Lucene 的兼容性。[#115507](https://github.com/ClickHouse/ClickHouse/pull/115507) ([rschu1ze](https://github.com/rschu1ze))。
* 函数 `toDateOrNull`、`toDateTimeOrNull` 和 `toDateTime64OrNull` 现在接受所有原生整数类型的整数参数 (解析方式与 `toDate`、`toDateTime` 和 `toDateTime64` 相同，并可选传入时区参数) ，对于超出结果类型范围的值返回 `NULL`。例如，`toDateTimeOrNull(1583851242, 'Asia/Shanghai')` 返回 `2020-03-10 22:40:42`，而 `toDateTimeOrNull(4294967296)` 返回 `NULL`。[#79791](https://github.com/ClickHouse/ClickHouse/pull/79791) ([jitendra1411](https://github.com/jitendra1411))。

<h3 id="storage-data-lakes-and-object-storage-improvements">
  存储、数据湖与对象存储
</h3>

* 新增可选启用的文件系统缓存淘汰相关 Prometheus 指标 (`filesystem_cache_evictions_total`、`filesystem_cache_evicted_bytes_total`、`filesystem_cache_evicted_segment_hits`、`filesystem_cache_evicted_segment_size_bytes`，以及带有 `user_id` 标签的按用户变体) ，按缓存分别通过 `system.dimensional_metrics`、`system.histogram_metrics` 和 Prometheus 端点对外暴露。这些指标由缓存磁盘配置中的 `expose_prometheus_eviction_metrics` 和 `expose_prometheus_eviction_metrics_per_user` 设置控制 (默认均关闭) ，并可在运行时通过 `SYSTEM RELOAD CONFIG` 开启或关闭。[#105020](https://github.com/ClickHouse/ClickHouse/pull/105020) ([sacheendra](https://github.com/sacheendra)).
* 当目标表为 `MergeTree` 系列引擎时，`Alias` 引擎现已支持并行副本读取。[#107830](https://github.com/ClickHouse/ClickHouse/pull/107830) ([nauu](https://github.com/nauu)).
* 在 Azure Blob 存储的“先读后写”复制 (备份在原生复制不可用时使用) 中，将并发暂存的分片数量限制为 max\_inflight\_parts\_for\_one\_file，避免并行复制大量大文件时内存使用量过高。[#108232](https://github.com/ClickHouse/ClickHouse/pull/108232) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)).
* HDFS 存储支持 `_etag` 虚拟列 [#108255](https://github.com/ClickHouse/ClickHouse/pull/108255) ([zhangyifan27](https://github.com/zhangyifan27)).
* 在 `system.backups` 和 `system.backup_log` 中新增 `settings` 和 `engine_settings` 列。`settings` 展示某次操作所请求的备份/恢复专用设置 (例如 `allow_s3_native_copy`、`deduplicate_files`、`structure_only`) ，`engine_settings` 则展示备份引擎读取器/写入器实际生效的设置 (例如 `allow_native_copy` 等 S3 请求设置，在与端点配置合并后可能与所请求的值不同) 。借此即可查看 `BACKUP`/`RESTORE` 操作实际运行时采用的设置。[#108334](https://github.com/ClickHouse/ClickHouse/pull/108334) ([jkartseva](https://github.com/jkartseva)).
* 新增 `system.s3_queue_metadata` 和 `system.azure_queue_metadata`，用于查看已注册的 `S3Queue` 和 `AzureQueue` 表在 Keeper 中的状态，包括已处理、处理中和失败的文件数。[#108522](https://github.com/ClickHouse/ClickHouse/pull/108522) ([kssenii](https://github.com/kssenii)).
* 将文本索引头部缓存的内存使用量降低至原来的 1/2 到 1/2.5。缓存 (由设置 `text_index_header_cache_size` 控制) 可容纳更多数据分区片段的头部信息，从而减少文本搜索查询的磁盘读取。[#109332](https://github.com/ClickHouse/ClickHouse/pull/109332) ([CurtizJ](https://github.com/CurtizJ)).
* 为 `INFORMATION_SCHEMA` 视图新增 MySQL 兼容列：`SCHEMATA.DEFAULT_COLLATION_NAME` 和 `DEFAULT_ENCRYPTION`；`TABLES.ENGINE` 及相关 MySQL 列；以及 `COLUMNS.COLUMN_KEY`、`PRIVILEGES`、`GENERATION_EXPRESSION`、`SRS_ID`。这样，兼容 MySQL 的客户端在执行目录自省查询时便不会再遇到 `UNKNOWN_IDENTIFIER` 错误。[#109351](https://github.com/ClickHouse/ClickHouse/pull/109351) ([alexey-milovidov](https://github.com/alexey-milovidov)).
* 降低了包含大量数据分区片段的 `MergeTree` 表的内存使用量：由 schema 派生的每个 part 的元数据 (列列表、列描述、序列化信息以及列子流) 现在在同一张表的各个 parts 之间共享，而不再复制到每个 part 中。对于包含大量小 parts 的宽表，效果最为明显。[#109816](https://github.com/ClickHouse/ClickHouse/pull/109816) ([Algunenano](https://github.com/Algunenano)).
* 新增设置 `use_projection_index_in_read_pools` (默认禁用) 。启用后，被 projection 索引完全过滤掉的 mark ranges 会在 `MergeTree` 读取池中被直接丢弃，不再为其创建读取任务，而不是在读取过程中逐个粒度跳过。这样可以避免为不会被读取的数据创建读取任务和初始化读取器，并使读取任务的大小按保留下来的标记数计算。[#110291](https://github.com/ClickHouse/ClickHouse/pull/110291) ([KochetovNicolai](https://github.com/KochetovNicolai))。
* 降低了 `MergeTree` 中按分片执行的主键二分查找诊断信息的详细程度，将其从 trace 级别日志下调为 test 级别日志。[#110324](https://github.com/ClickHouse/ClickHouse/pull/110324) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了基于 TLS (HTTPS、S3) 的池化 HTTP keep-alive 连接出现虚假重连的问题。此前的失效连接检查对套接字使用 `poll`，会把带有未读 TLS 握手后记录 (会话票据或 `KeyUpdate`) 的活跃安全连接误判为已关闭；现在对普通套接字改用非阻塞的 `MSG_PEEK`，对 TLS 套接字改用 `SSL_peek`/`SSL_has_pending`，并且还能正确识别正常的 TLS 关闭以及仅部分到达的 TLS 记录。[#110402](https://github.com/ClickHouse/ClickHouse/pull/110402) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* OneLake 目录现在支持使用 OAuth refresh token 续期访问令牌。[#110413](https://github.com/ClickHouse/ClickHouse/pull/110413) ([alesapin](https://github.com/alesapin))。
* 新增 `DuplicationDataHashComputations` ProfileEvent，用于统计对插入 `*MergeTree` 表的块进行去重时所执行的按列数据哈希计算次数。[#111173](https://github.com/ClickHouse/ClickHouse/pull/111173) ([valerypetrov](https://github.com/valerypetrov))。
* 通过存储抽象层将 UNIQUE KEY 索引 SST 直接写入分片，不再先暂存到本地临时文件。[#111189](https://github.com/ClickHouse/ClickHouse/pull/111189) ([JingYanchao](https://github.com/JingYanchao))。
* 支持在本地磁盘上并发写入 Iceberg 表：`LocalObjectStorage` 现已实现条件写入，因此通过 `version-hint.text` 发布新快照的 compare-and-swap 操作可在本地磁盘上正常工作，并发写入方之间不会再互相覆盖丢失更新。[#112556](https://github.com/ClickHouse/ClickHouse/pull/112556) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `S3` 客户端的 bucket 区域缓存现在同样适用于数据湖目录；此前每次向其发出请求时都会重新解析区域。[#113330](https://github.com/ClickHouse/ClickHouse/pull/113330) ([scanhex12](https://github.com/scanhex12))。
* Azure 客户端侧的网络故障 (连接重置/被拒、DNS 和 TLS 错误) 现在会作为传输错误进行重试，而不再以人为构造的 `500` 错误抛出，与 S3 客户端的行为保持一致。[#115269](https://github.com/ClickHouse/ClickHouse/pull/115269) ([arsenmuk](https://github.com/arsenmuk))。

<h3 id="formats-and-ingestion-improvements">
  格式与摄取
</h3>

* HTTP 接口现已支持 snappy 压缩 (`Accept-Encoding: snappy`) ，并新增 `snappy_mode` 设置，可为通用 `file`/`url` snappy I/O 选择 Hadoop snappy 块格式或 snappy 帧格式。[#100752](https://github.com/ClickHouse/ClickHouse/pull/100752) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 新增设置 `input_format_csv_missing_nullable_as_empty_string` (默认禁用) 。启用后，CSV 输入中缺失的 `Nullable(String)` 值将读取为空 `String`，而非 `NULL`，且不受 `input_format_csv_empty_as_default` 的影响。[#107577](https://github.com/ClickHouse/ClickHouse/pull/107577) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 使用 `input_format_protobuf_oneof_presence` 处理 protobuf 消息时，不再要求标签精确匹配，从而支持 schema 变更。[#109174](https://github.com/ClickHouse/ClickHouse/pull/109174) ([ilejn](https://github.com/ilejn))。
* 移除了基于 Apache Arrow 的旧版 ORC 读取器。ORC 输入格式现在始终使用 ClickHouse 原生解码器 (此前已是默认选项) 。`input_format_orc_use_fast_decoder` 设置已废弃 (仍可设置，但不再生效) 。[#110074](https://github.com/ClickHouse/ClickHouse/pull/110074) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* Hive 引擎现改用 ClickHouse 原生 ORC 读取器读取 ORC 文件元数据 (min/max 索引、行数) ，不再依赖 Apache Arrow ORC adapter。[#110086](https://github.com/ClickHouse/ClickHouse/pull/110086) ([alexey-milovidov](https://github.com/alexey-milovidov))。

<h3 id="security-access-and-observability-improvements">
  安全、访问与可观测性
</h3>

* 在 `system.tables` 表中新增列 `skipping_indices_types`，列出每张表上定义的数据跳过索引的各个类型 (已去重) 。[#106388](https://github.com/ClickHouse/ClickHouse/pull/106388) ([CurtizJ](https://github.com/CurtizJ))。
* `max_threads` 等设置的自动值现在在 `system.settings` 中显示为 `auto(8)`，而不再是 `'auto(8)'`；外层的单引号是长期以来固化在该值中的历史遗留问题。跨版本兼容性不受影响：解析从旧版本服务器接收的设置时，仍接受旧的带引号形式。[#108657](https://github.com/ClickHouse/ClickHouse/pull/108657) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在 `system.documentation` 中，空的设置默认值现在显示为 *空字符串*，而不再是一对空的反引号。[#108708](https://github.com/ClickHouse/ClickHouse/pull/108708) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `system.documentation` 中的设置文档 (由内置的 `/docs` 页面和 `help` 命令展示) 现在包含其默认值的变更历史：包括该设置引入时的版本，以及此后默认值的每一次变更，并列出变更前的值、变更后的值及变更原因。[#112177](https://github.com/ClickHouse/ClickHouse/pull/112177) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 现在可以从系统表 `system.statements` 中查询所有 SQL 语句的文档 (如名称、语法、描述、示例) 。[#115341](https://github.com/ClickHouse/ClickHouse/pull/115341) ([rschu1ze](https://github.com/rschu1ze))。

<h3 id="settings-and-configuration-improvements">
  设置与配置
</h3>

* 新增服务器设置 `memory_worker_rss_speculative_reserve_ratio` (默认值为 `1.0`，在 sanitizer 构建中为 `0`) ，使全局内存跟踪器在每次 `MemoryWorker` 周期中，在观测到的 RSS 基础上额外推测性地预留 `ratio * min(resident - previous_resident, resident - tracked)`。当两次采样之间 RSS 的增长速度超过跟踪器的记账速度时，该机制会让跟踪器的数值适当偏高，使内存分配更早触发 `MEMORY_LIMIT_EXCEEDED`，从而降低内核 OOM-killer 抢先介入的可能性。将该比率设为 `0` 即可禁用推测预留。sanitizer 构建默认使用 `0`，因为在这类构建中，`resident - tracked` 差值主要来自 sanitizer 的影子内存。[#104976](https://github.com/ClickHouse/ClickHouse/pull/104976) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 文本索引的延迟倒排列表应用模式不再是实验性功能，无需设置 `allow_experimental_text_index_lazy_apply`，即可通过 `text_index_posting_list_apply_mode = 'lazy'` 启用。密度阈值设置已从 `text_index_density_threshold` 重命名为 `text_index_lazy_intersection_density_threshold`。[#108814](https://github.com/ClickHouse/ClickHouse/pull/108814) ([CurtizJ](https://github.com/CurtizJ))。
* `merge_selector_enable_heuristic_to_lower_max_parts_to_merge_at_once` 设置现已默认启用：合并选择器会根据分区的填充程度，自动降低单次合并的 parts 数量上限。[#110726](https://github.com/ClickHouse/ClickHouse/pull/110726) ([Michicosun](https://github.com/Michicosun))。
* PostgreSQL wire 协议现将 PostgreSQL 清理命令 `RESET`、`UNLISTEN` 和 `DISCARD` 作为空操作处理，不再报语法错误。这提升了与 Skunk 等驱动程序的兼容性，此类驱动会在建立和清理连接时发送 `RESET ALL` 和 `UNLISTEN *`。[#110780](https://github.com/ClickHouse/ClickHouse/pull/110780) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* AI 文本函数 (`aiGenerate`、`aiClassify`、`aiExtract`、`aiTranslate`) 现在会拒绝被截断或其他不完整的提供方响应 (例如模型达到 `max_tokens` 上限时) ，而不再静默返回部分输出。具体行为由 `ai_function_throw_on_error` 设置决定。[#111830](https://github.com/ClickHouse/ClickHouse/pull/111830) ([george-larionov](https://github.com/george-larionov))。
* 改进低精度模式下的 `L2DistanceTransposedQuantized`、`cosineDistanceTransposedQuantized` 和 `dotProductTransposedQuantized`：使用高斯条件均值前缀质心重建 `p < 8QBit(Int8)` 编码。全精度 (`p = 8`) 仍保持比特级精确；低精度下的近似距离可能有所变化，召回率和延迟方面的收益因工作负载而异。[#111867](https://github.com/ClickHouse/ClickHouse/pull/111867) ([skuznetsov](https://github.com/skuznetsov))。
* `write_snapshot_version` 设置现已支持热重载。[#112150](https://github.com/ClickHouse/ClickHouse/pull/112150) ([alesapin](https://github.com/alesapin))。
* 为纤程栈 (用于与远程副本进行异步通信) 新增可观测性支持：profile events `FiberStackAllocs`、`FiberStackAllocBytes`、`FiberStackAllocNanoseconds`、`FiberStackFreeNanoseconds`，以及指标 `FiberStacks`、`FiberStackBytes`。[#114541](https://github.com/ClickHouse/ClickHouse/pull/114541) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* Prometheus 远程写入协议现已支持异步插入：来自多个并发远程写入请求的数据会先合批，再生成 parts，具体行为遵循 `async_insert` 设置 (默认启用；在 handler URL 中添加 `async_insert=0` 可保留同步行为) 。只有当数据刷新到目标 `TimeSeries` 表的所有内部表之后，请求才会得到确认。[#115688](https://github.com/ClickHouse/ClickHouse/pull/115688) ([nikitamikhaylov](https://github.com/nikitamikhaylov))。

<h3 id="other-improvements">
  其他改进
</h3>

* 新增两个设置 `shrink_over_allocated_columns_min_waste_ratio` 和 `shrink_over_allocated_columns_min_waste_bytes`，可使 INSERT 在物化和写入分片之前，将过度分配的列 (即变长列按 2 的幂增长、导致预留内存超出实际使用内存的列) 收缩至合适大小，从而降低峰值内存占用。默认禁用。[#112161](https://github.com/ClickHouse/ClickHouse/pull/112161) ([Avogar](https://github.com/Avogar))。
* 对于 `TTLDrop` 合并，完全跳过数据读取步骤，以避免内存使用量过高，尤其是读取/预取缓冲区的内存分配。[#105859](https://github.com/ClickHouse/ClickHouse/pull/105859) ([Avogar](https://github.com/Avogar))。
* `dotProduct` 新增对 `BFloat16` 的支持，并通过对 SIMD 路径进行批处理提升了点积性能。[#106569](https://github.com/ClickHouse/ClickHouse/pull/106569) ([nickitat](https://github.com/nickitat))。
* `max_named_collection_num_to_throw`、`max_table_num_to_throw`、`max_replicated_table_num_to_throw`、`max_view_num_to_throw`、`max_dictionary_num_to_throw` 和 `max_database_num_to_throw` 现在无需重启服务器即可修改。[#106821](https://github.com/ClickHouse/ClickHouse/pull/106821) ([UberDever](https://github.com/UberDever))。
* 由 `allow_experimental_delta_lake_writes` 控制的 `DeltaLake` 表写入功能已升级为 Beta。[#107034](https://github.com/ClickHouse/ClickHouse/pull/107034) ([kssenii](https://github.com/kssenii))。
* 新增 `uniq_v2` 列统计信息类型，它基于 `uniqCombined64` sketch，是 `uniq` 的轻量级替代方案。[#107863](https://github.com/ClickHouse/ClickHouse/pull/107863) ([hanfei1991](https://github.com/hanfei1991))。
* 新增 ProfileEvents `DistributedPlanRemoteTasks`、`DistributedPlanLocalExecution` 和 `DistributedPlanHostsUsed`，用于观测 make\_distributed\_plan 的执行情况。[#107985](https://github.com/ClickHouse/ClickHouse/pull/107985) ([shankar-iyer](https://github.com/shankar-iyer))。
* 发往 OneLake 等 REST 数据湖目录的请求现在会携带 ClickHouse `User-Agent` 请求头。[#108117](https://github.com/ClickHouse/ClickHouse/pull/108117) ([scanhex12](https://github.com/scanhex12))。
* `MVTEncodeGeom` 现在会在裁剪前将几何图形吸附到整数像素网格，并使用 `wagyu` 裁剪多边形，从而确保裁剪输出有效 (自相交的环会被修复) 且边缘对齐，与 PostGIS `ST_AsMVTGeom` 的结果一致。[#108248](https://github.com/ClickHouse/ClickHouse/pull/108248) ([saarthak2002](https://github.com/saarthak2002))。
* 全局启用全部三种文本索引缓存——此前它们仅在查询内部启用。此外，倒排列表缓存大小现设为零 (实际上相当于再次禁用该缓存) ，因为倒排列表体积较大，缓存成本过高。[#108274](https://github.com/ClickHouse/ClickHouse/pull/108274) ([rschu1ze](https://github.com/rschu1ze))。
* 在加载表之前即启动 Prometheus 端点 (适用于仅含指标的配置) 和异步指标收集，以便在可能耗时较长的元数据加载阶段也能观测指标。[#108402](https://github.com/ClickHouse/ClickHouse/pull/108402) ([cwurm](https://github.com/cwurm))。
* 二元数学函数支持 BFloat16 [#108442](https://github.com/ClickHouse/ClickHouse/pull/108442) ([zhangyifan27](https://github.com/zhangyifan27))。
* 转置向量距离函数 `L2DistanceTransposed`、`cosineDistanceTransposed` 和 `dotProductTransposed` 现在会对 `Nullable(QBit)` 列应用部分位平面读取优化，仅读取所需的位平面，而无需读取整列。[#109358](https://github.com/ClickHouse/ClickHouse/pull/109358) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `arraySum`、`arrayAvg` 和 `arrayProduct` 现已支持 `BFloat16` 类型的数组。[#109420](https://github.com/ClickHouse/ClickHouse/pull/109420) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 函数 `L1Normalize`、`L2Normalize`、`LinfNormalize` 和 `LpNormalize` (及其别名) 现在除元组外也支持数组，与 `L2Norm` 及距离函数的行为保持一致。[#110052](https://github.com/ClickHouse/ClickHouse/pull/110052) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 池化连接在每次使用前不再发送 ping。此前每个复用的连接都会额外产生一次 `Ping`-`Pong` 往返，此项改动将其消除，从而降低了分布式查询和 `clickhouse-benchmark` 的延迟。失效的池化连接会通过零超时轮询 (一种非阻塞检查，不会增加往返) 检测出来，并通过重新连接恢复。[#110068](https://github.com/ClickHouse/ClickHouse/pull/110068) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在分布式索引分析中，将较大的数据片段 (part) 列表作为标量发送 (避免因 max\_ast\_elements/max\_query\_size 限制而可能导致的失败，并消除 AST 解析开销) 。[#110419](https://github.com/ClickHouse/ClickHouse/pull/110419) ([azat](https://github.com/azat))。
* 现在在 Playground 中点击云朵图标会在新标签页中打开 ClickHouse 网站，避免查询运行时丢失进度。[#110422](https://github.com/ClickHouse/ClickHouse/pull/110422) ([williamhatcher](https://github.com/williamhatcher))。
* 将 `auto_statistics_types` 的默认值从 `basic, uniq` 更改为 `basic, uniq_v2`。[#110878](https://github.com/ClickHouse/ClickHouse/pull/110878) ([hanfei1991](https://github.com/hanfei1991))。
* 当 `RWLockImpl::getLock()` 的重入断言触发时 (`RWLock is already locked in exclusive mode` / `Cannot acquire exclusive lock while RWLock is already locked`) ，错误消息现在会列出当前持有该锁的其他 `query_id`，以及发起请求的 `query_id` 已持有的锁数量，便于诊断此类锁顺序错误。[#110971](https://github.com/ClickHouse/ClickHouse/pull/110971) ([groeneai](https://github.com/groeneai))。
* `randomHadamardTransform` 现在可以对最大奇因子不超过 64 的任意向量长度 (例如嵌入模型中常见的 `3584 = 512 * 7`) 计算精确且保持长度的变换，在此前支持的 `2^N`、`2^k * {12, 20}` 和 `2^k * 9` 系列基础上进一步扩展。对于无法精确表示的长度，完整变换现在会抛出异常，而不再静默地零填充为更长的向量；如需计算任意长度的截断投影，请传入 `output_dims`。[#111006](https://github.com/ClickHouse/ClickHouse/pull/111006) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 通过 HTTP 接口发生 `ACCESS_DENIED` 异常时，现在返回 HTTP 状态码 `403 Forbidden` (而非 `500 Internal Server Error`) 。[#111043](https://github.com/ClickHouse/ClickHouse/pull/111043) ([Schum-io](https://github.com/Schum-io))。
* `UTMToGeo` 的第四个参数现在除整数半球标志外，还可接受 `geoToUTM` 返回的 MGRS 纬度带字母，因此 `geoToUTM` 的结果可直接传给 `UTMToGeo` 进行无损往返转换。[#111521](https://github.com/ClickHouse/ClickHouse/pull/111521) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `MaterializedPostgreSQL` 现在在更新时会保留未更改的 PostgreSQL `TOAST` 值，而不再将其替换为默认值。[#111552](https://github.com/ClickHouse/ClickHouse/pull/111552) ([OrpheusAgent](https://github.com/OrpheusAgent))。
* 新增 `text_index_max_processed_tokens_before_flush` 和 `text_index_max_memory_usage_before_flush` 设置，用于控制文本索引构建器何时刷写临时分段。[#111573](https://github.com/ClickHouse/ClickHouse/pull/111573) ([rorylshanks](https://github.com/rorylshanks))。
* 新增 STREAM UNORDERED 修饰符：跳过每个快照内按提交顺序进行的排序 [#111794](https://github.com/ClickHouse/ClickHouse/pull/111794) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni))。
* 现在设置 `make_distributed_plan=1` 时会禁用尚不支持的功能。[#112463](https://github.com/ClickHouse/ClickHouse/pull/112463) ([alesapin](https://github.com/alesapin))。
* 当 stdout 为 tty 时，不再向 INTO OUTFILE 写入 ANSI 转义序列 [#113252](https://github.com/ClickHouse/ClickHouse/pull/113252) ([azat](https://github.com/azat))。
* 将 `allow_experimental_delta_kernel_rs` 重命名为 `allow_delta_kernel_rs`，旧名称作为别名保留。[#113476](https://github.com/ClickHouse/ClickHouse/pull/113476) ([kssenii](https://github.com/kssenii))。
* 新增设置 `enable_alp_codec`、`enable_sz3_codec`、`enable_zxc_codec` 和 `enable_quantized_codec`，可分别单独启用各个实验性压缩编解码器。[#113824](https://github.com/ClickHouse/ClickHouse/pull/113824) ([rienath](https://github.com/rienath))。
* 发生栈溢出时会报告错误，而不再静默崩溃：致命信号处理程序现在运行在备用信号栈上，因此即使出错线程的栈空间已耗尽，`SIGSEGV`、`SIGABRT`、`SIGILL`、`SIGBUS`、`SIGSYS`、`SIGFPE` 和 `SIGTRAP` 也能生成堆栈跟踪。[#113927](https://github.com/ClickHouse/ClickHouse/pull/113927) ([groeneai](https://github.com/groeneai))。
* 即时查询和范围查询现已支持 Prometheus HTTP API 的 lookback\_delta 参数。[#113971](https://github.com/ClickHouse/ClickHouse/pull/113971) ([fallintoplace](https://github.com/fallintoplace))。
* QueryRunner 表现在会按需启动工作线程，并在空闲后释放，不再在表的整个生命周期内一直占用线程。[#114522](https://github.com/ClickHouse/ClickHouse/pull/114522) ([mstetsyuk](https://github.com/mstetsyuk))。
* 使用 WHATIF 索引时，由投影提供的基线现在会针对每个候选项报告 `not_applicable`，而不会导致语句执行失败。[#114846](https://github.com/ClickHouse/ClickHouse/pull/114846) ([yariks5s](https://github.com/yariks5s))。
* 优化针对同一表达式包含多个比较条件的 AND 链：检测相互矛盾的条件 (例如 `a < 3 AND a > 5` → `false`) ，并裁剪冗余条件 (例如 `a = 3 AND a < 5` → `a = 3`) 。[#99736](https://github.com/ClickHouse/ClickHouse/pull/99736) ([wudidapaopao](https://github.com/wudidapaopao))。

<h2 id="bug-fixes">
  缺陷修复
</h2>

<h3 id="mergetree-replication-and-storage-fixes">
  MergeTree、复制与存储相关修复
</h3>

* 修复了 `MergeTree` 中 `ALTER TABLE ... RENAME COLUMN` 与并发执行的 `OPTIMIZE TABLE ... FINAL` (或任意后台合并) 之间的竞态问题，该问题可能导致被重命名列的数据在无任何提示的情况下被替换为默认值。现在，在发布新的内存元数据以及在 `current_mutations_by_version` 中注册重命名变更这两个操作期间，会始终持有 `currently_processing_in_background_mutex`，从而消除了二者之间的竞态窗口。[#104822](https://github.com/ClickHouse/ClickHouse/pull/104822) ([groeneai](https://github.com/groeneai))。
* 修复了在投影中同时使用 GROUP BY、ORDER BY 和 `arrayJoin` 时查询结果不正确的问题。[#101775](https://github.com/ClickHouse/ClickHouse/pull/101775) ([Onyx2406](https://github.com/Onyx2406))。
* 无效的 Azure 上传大小设置 (例如 `azure_min_upload_part_size = 0` 或 `azure_max_blocks_in_multipart_upload = 0`) 现在会被提前拒绝，并给出明确的错误信息，而不会再在写入路径深处触发内部异常 (`second_size > 0`) 。此改动同时适用于查询设置和 Azure 磁盘配置。[#103394](https://github.com/ClickHouse/ClickHouse/pull/103394) ([statxc](https://github.com/statxc))。
* 在两个粒度设置不兼容 (一个为自适应，一个为非自适应) 的 `MergeTree` 表之间运行 `ALTER TABLE ... MOVE/REPLACE/ATTACH PARTITION` 时，现在会抛出 `BAD_ARGUMENTS`，而不是 `LOGICAL_ERROR`。[#103881](https://github.com/ClickHouse/ClickHouse/pull/103881) ([groeneai](https://github.com/groeneai))。
* 修复了 `KILL QUERY` / `KILL MUTATION` / `KILL PART_MOVE_TO_SHARD` / `KILL TRANSACTION` 抛出 `LOGICAL_ERROR` "Expected one block from input stream" 的问题。该问题出现在其 `WHERE` 子句包含逐行子查询，或 `max_block_size` 过小、导致针对相关 `system.*` 表的内部 `SELECT` 输出多个块的情况下。[#104927](https://github.com/ClickHouse/ClickHouse/pull/104927) ([groeneai](https://github.com/groeneai))。
* 修复了可刷新materialized view (`MATERIALIZED VIEW ... REFRESH ...`) 中的泄漏问题：刷新任务通过 `EXCHANGE TABLES` 轮换出的临时内部表，若大小超过服务器的 `max_table_size_to_drop`，便无法被删除。此后每次刷新都会再创建一个新的临时内部表，而之前的表仍无法清理，导致视图的数据目录持续膨胀，直至磁盘耗尽。现在，刷新任务内部执行的删除操作会绕过 `max_table_size_to_drop` 和 `max_partition_size_to_drop`；对于用户针对视图本身发起的 `DROP TABLE`，这些安全限制依然有效。[#105106](https://github.com/ClickHouse/ClickHouse/pull/105106) ([groeneai](https://github.com/groeneai))。
* 修复了以下问题：对于 sorting key 中包含 `SimpleAggregateFunction` (或其他仅在 `allow_suspicious_primary_key = 1` 时才允许的类型) 的 `MergeTree` 表，执行不会更改 sorting key 的 `ALTER` 查询 (如修改设置、注释、编解码器，添加非键列等) 时，会意外报出 `DATA_TYPE_CANNOT_BE_USED_IN_KEY` 错误。[#105111](https://github.com/ClickHouse/ClickHouse/pull/105111) ([groeneai](https://github.com/groeneai))。
* `OPTIMIZE ... DRY RUN` 因查询超时 (`max_execution_time` 配合 `timeout_overflow_mode = 'break'`) 而中断时，现在会返回 `TIMEOUT_EXCEEDED`，而不再返回与 `rows_sources` 相关的逻辑错误 (该错误在 debug 和 sanitizer 构建中会导致服务器中止) 。[#107114](https://github.com/ClickHouse/ClickHouse/pull/107114) ([groeneai](https://github.com/groeneai))。
* 修复了在启用 `use_hive_partitioning=1` 读取 Hive 分区文件时，若 `WHERE`/`PREWHERE` 子句过滤的是真实 (非虚拟) 列，且同时选择了 Hive 分区列，会报出 `NOT_FOUND_COLUMN_IN_BLOCK` 的问题。[#107505](https://github.com/ClickHouse/ClickHouse/pull/107505) ([groeneai](https://github.com/groeneai))。
* 修复了当 `toStartOfDay`、`toStartOfISOYear`、`toDaysSinceYearZero`、`toRelativeSecondNum`、`toRelativeMinuteNum`、`toRelativeHourNum`、`toRelativeWeekNum`、`toRelativeDayNum`、`toMonthNumSinceEpoch` 或 `toYearNumSinceEpoch` 作用于 `Date32` 键列，且该列包含超出函数可表示范围的日期 (尤其是 `1970-01-01` 之前的日期) 时，主键和分区裁剪出错进而导致查询结果错误的问题。这些函数会向主索引声明自身具有单调性，但此前遇到此类参数时会发生回绕，导致索引可能裁剪掉实际包含匹配行的 granule。现在，这些函数会在结果类型的边界处饱和，并在整个 `Date32` 范围内保持单调，从而确保裁剪正确。[#108018](https://github.com/ClickHouse/ClickHouse/pull/108018) ([nihalzp](https://github.com/nihalzp))。
* 修复了 `CREATE TABLE dst AS src SETTINGS ...` (以及带有 `ORDER BY`/`PARTITION BY` 但未显式指定 `ENGINE` 的类似写法) 会静默丢弃源表的引擎、存储子句 (例如表 `TTL` 和各类键) 以及设置的问题。现在，引擎以及未被覆盖的存储子句会从源表继承，所指定的设置则会在源表设置的基础上进行合并。[#108085](https://github.com/ClickHouse/ClickHouse/pull/108085) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在基于 Windows 的文件系统 (WSL、CIFS/SMB、Docker Desktop 绑定挂载) 上向 `MergeTree` 表执行 `INSERT` 时报错 `filesystem error: in rename: Permission denied` 的问题。该问题的原因是分片写入器在重命名分片目录时仍未关闭文件描述符。[#108089](https://github.com/ClickHouse/ClickHouse/pull/108089) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了附加时带有旧版 `hypothesis` 跳数索引 (一种已移除的索引类型，仅为兼容 `ATTACH` 而保留) 的 MergeTree 表陷入卡死的问题。此前，在此类表上执行轻量级 `DELETE`、`OPTIMIZE`、普通 `INSERT` 或带过滤条件的 `SELECT` 时会报错 `ILLEGAL_INDEX` ("Index of type 'hypothesis' is no longer supported") ，且 `DELETE` 变更会无限重试。现在，该失效索引将被视为惰性对象：在合并/变更期间原样保留，在插入和查询规划时被跳过，并且仍可通过 `ALTER TABLE ... DROP INDEX` 删除。[#108217](https://github.com/ClickHouse/ClickHouse/pull/108217) ([groeneai](https://github.com/groeneai))。
* 修复了在启用并行副本时从 `MergeTree` 表查询虚拟列 (包括在 `asterisk_include_virtual_columns = 1` 时通过 `SELECT *` 查询) 出现 `NOT_FOUND_COLUMN_IN_BLOCK` 错误 (例如 `Column _part not found`) 的问题。[#108451](https://github.com/ClickHouse/ClickHouse/pull/108451) ([groeneai](https://github.com/groeneai))。
* 修复了 `ATTACH PARTITION ... FROM` 会拒绝主键等价但声明方式不同 (一个显式声明 `PRIMARY KEY`，另一个由 `ORDER BY` 隐式推导) 的表的问题。[#108590](https://github.com/ClickHouse/ClickHouse/pull/108590) ([jordiori](https://github.com/jordiori))。
* 现在，所有受支持的基于哈希的连接路径 (包括会自动溢写到磁盘的连接) 都会遵循 `join_any_take_last_row` 设置。[#108936](https://github.com/ClickHouse/ClickHouse/pull/108936) ([antaljanosbenjamin](https://github.com/antaljanosbenjamin))。
* 修复了在启用 `query_plan_optimize_lazy_final` 且 `WHERE` 过滤条件被部分下推到 `PREWHERE` (通过 `optimize_move_to_prewhere_if_final`) 时出现 `NOT_FOUND_COLUMN_IN_BLOCK` 错误的问题。惰性 FINAL 优化不再从存储层请求由 prewhere 计算得出的谓词列。[#109073](https://github.com/ClickHouse/ClickHouse/pull/109073) ([groeneai](https://github.com/groeneai))。
* 修复了在会话设置 `optimize_respect_aliases = 0` 时，基于表级 `ALIAS` 列执行 `ALTER TABLE ... ADD PROJECTION` 会导致表无法使用的问题 (后续 `INSERT` 会失败并报 `UNKNOWN_IDENTIFIER`、"Missing columns" 错误) 。[#109091](https://github.com/ClickHouse/ClickHouse/pull/109091) ([groeneai](https://github.com/groeneai))。
* 修复了在旧版 analyzer (`allow_experimental_analyzer = 0`) 下，对与其他表 JOIN 的 `Merge` 引擎表执行 `ORDER BY ALL` (或 `GROUP BY ALL`) 时触发空指针断言的问题 (`TreeRewriter::analyzeSelect` 中的 `px != 0`，在 debug 和 sanitizer 构建中会导致服务器中止) 。[#109139](https://github.com/ClickHouse/ClickHouse/pull/109139) ([groeneai](https://github.com/groeneai))。
* 修复了当关联条件仅出现在子查询投影中、且同时存在非关联的 `WHERE` 子句时，关联 `EXISTS` 子查询和标量子查询返回错误结果的问题 (子查询可能对每一行都求值为 false / `NULL`) 。修复 [https://github.com/ClickHouse/ClickHouse/issues/105760。\[#109186](https://github.com/ClickHouse/ClickHouse/issues/105760。\[#109186)]\([https://github.com/ClickHouse/ClickHouse/pull/109186](https://github.com/ClickHouse/ClickHouse/pull/109186)) ([novikd](https://github.com/novikd))。
* 修复了在启用 `enable_block_number_column` 或 `enable_block_offset_column` 设置时，合并带有 projection 的 `MergeTree` 表会生成包含多余 `_block_number`/`_block_offset` 列的 projection parts 的问题。合并后的 projection part 与 projection 定义及插入生成的 projection parts 不再一致，导致 `CHECK TABLE` 和 `OPTIMIZE ... DRY RUN` 将其报告为已损坏 (`CORRUPTED_DATA`) 。[#109284](https://github.com/ClickHouse/ClickHouse/pull/109284) ([groeneai](https://github.com/groeneai))。
* 修复了当 MergeTree 表在持久虚拟列 `_block_number` 或 `_block_offset` 上存在隐式 min-max 索引 (由 `add_minmax_index_for_block_number_column` / `add_minmax_index_for_block_offset_column` 启用) 时，执行 `ALTER TABLE ... RENAME/ADD/MODIFY COLUMN` 报 `UNKNOWN_IDENTIFIER` 错误的问题。[#109428](https://github.com/ClickHouse/ClickHouse/pull/109428) ([groeneai](https://github.com/groeneai))。
* 修复了在 `Wide` part 上执行需重写整个 part 的变更 (例如对 `MATERIALIZED` 列执行 `ALTER TABLE ... DROP COLUMN`) 后，跳数索引从数据 part 中丢失 (或 `CHECK TABLE` 失败并报 `UNEXPECTED_FILE_IN_DATA_PART`) 的问题。[#109616](https://github.com/ClickHouse/ClickHouse/pull/109616) ([groeneai](https://github.com/groeneai))。
* 修复了使用 `ALTER TABLE ... APPLY PATCHES` 物化轻量级更新后，跳数索引 (`text`、`bloom_filter` 等) 和 projection 未同步更新的问题。此前，依赖于补丁所更新列的索引和 projection 文件不会随之更新，因此使用它们的查询可能返回错误结果 (例如 `hasToken` 漏掉已更新的行，或在已应用的补丁 part 被移除后，projection 返回过时的聚合结果) 。[#109709](https://github.com/ClickHouse/ClickHouse/pull/109709) ([groeneai](https://github.com/groeneai))。
* 修复了引用 `_sample_factor` 虚拟列的变更在执行中途失败并报 `Unexpected const virtual column: _sample_factor`、导致变更卡住的问题。现在变更会将其读取为 `1`，与不带 `SAMPLE` 的查询返回的值一致。[#109813](https://github.com/ClickHouse/ClickHouse/pull/109813) ([groeneai](https://github.com/groeneai))。
* 修复了带有 `GROUP BY GROUPING SETS` 的查询 (或包含它的标量子查询或变更子查询) 在 `force_aggregation_in_order = 1` 下运行时引发的两个错误：旧版 analyzer (`enable_analyzer = 0`) 下的 `Trying to get name of not a column: ExpressionList`，以及在 analyzer 下、设置了 `enable_memory_bound_merging_of_aggregation_results = 1` 的分布式查询中出现的 `Memory bound merging of aggregated results is not supported for grouping sets.`。[#109862](https://github.com/ClickHouse/ClickHouse/pull/109862) ([groeneai](https://github.com/groeneai))。
* 修复了 `use_constant_folding_in_index_analysis` 的三个问题：当表设置了 `part_minmax_index_columns = 'with_block_number_offset'` 时，使用普通投影的 `SELECT` 可能因逻辑错误 `Invalid partition key size` 而中止；对取模分区键 (如 `PARTITION BY id % 200`) 进行过滤时返回错误结果 (静默丢弃行) ；以及在 `max_threads > 1` 的情况下，使用 `LIKE` 谓词跨多个分区查询带有 `sparseGrams` 分词器的 `text` 索引时发生崩溃 (数据竞争) 。[#109896](https://github.com/ClickHouse/ClickHouse/pull/109896) ([groeneai](https://github.com/groeneai))。
* 修复了在 `LowCardinality(Nullable(...))` 列上构建 `minmax` 跳数索引时返回错误结果的问题：此前，下推到存储层的 `WHERE`/`PREWHERE`/`HAVING ... IS NULL` 谓词会裁剪掉所有 granule，导致即使该列包含 NULL 也返回 0 行。[#110061](https://github.com/ClickHouse/ClickHouse/pull/110061) ([groeneai](https://github.com/groeneai))。
* 修复了当 `prefer_localhost_replica` 选中本地副本时，`Distributed` 表上的 `ORDER BY ... LIMIT` 查询执行缓慢的问题。[#110136](https://github.com/ClickHouse/ClickHouse/pull/110136) ([EmeraldShift](https://github.com/EmeraldShift))。
* 修复了 `DELETE` 或 `ALTER UPDATE` 变更在 `WHERE` 条件的子查询中或 `UPDATE` 赋值中使用集合运算 (`UNION`/`UNION ALL`/`UNION DISTINCT`/`EXCEPT`/`INTERSECT`) 时抛出异常 (`UNION mode UNION_DEFAULT must be normalized`) 的问题。[#110196](https://github.com/ClickHouse/ClickHouse/pull/110196) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了带有 `x IN (subquery)` 的变更在主键分析期间构建子查询集合时，服务器关闭缓慢以及 `KILL MUTATION` 无响应的问题；现在集合构建会被及时取消。[#110198](https://github.com/ClickHouse/ClickHouse/pull/110198) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `KILL TRANSACTION` 与在事务内执行的 `ALTER TABLE ... UPDATE/DELETE` 之间的竞态问题：如果回滚恰好发生在变更注册到事务之后、注册到表之前，就会遗留孤立的变更条目，进而在后台任务中引发逻辑错误 (`Cannot find transaction ... that has started mutation ...`) ，并阻塞受影响 parts 的所有后续变更，直至服务器重启。[#110226](https://github.com/ClickHouse/ClickHouse/pull/110226) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了当 `DataLakeCatalog` (Iceberg/Glue) 数据库中某个表的元数据无法解析时，查询 `system.tables` 会导致整个查询中止或静默丢失表的问题。现在无论 `database_datalake_require_metadata_access` 如何设置，此类表仍会按名称列出，需要打开存储对象才能获取的列 (`engine`、`total_rows` 等) 则返回默认值/NULL。直接访问损坏的表时仍会报错。[#110242](https://github.com/ClickHouse/ClickHouse/pull/110242) ([groeneai](https://github.com/groeneai))。
* 连接顺序的基数估算现在基于经分区/主键裁剪后保留下来的 parts 汇总列统计信息，而非基于所有活跃 parts。此前，被裁剪到小分区的查询仍依据全表统计信息进行规划 (曾观察到行数被高估 2500 倍，导致哈希连接的构建端选反) ，而禁用统计信息反而能生成更优的计划。此外还修复了：JOIN 下的 MergeTree 关系中 lazy FINAL 被静默禁用的问题，原因是连接顺序优化器缓存的索引分析结果被误判为已应用的投影。[#110283](https://github.com/ClickHouse/ClickHouse/pull/110283) ([skuznetsov-clickhouse](https://github.com/skuznetsov-clickhouse))。
* 在粒度不兼容 (一个为自适应、一个为非自适应) 的两个 MergeTree 表之间执行 `ALTER TABLE ... MOVE/REPLACE PARTITION` 时，现在会抛出 `BAD_ARGUMENTS` 而非 `LOGICAL_ERROR`。这种情况可由用户触发，因此不应作为内部错误抛出 (在 debug/sanitizer 构建版本中，内部错误会导致服务器中止) 。[#110535](https://github.com/ClickHouse/ClickHouse/pull/110535) ([groeneai](https://github.com/groeneai))。
* 修复了 `TTL ... DELETE WHERE <cond>` 的一个问题：若对 `WHERE` 中引用的列执行 `ALTER TABLE ... UPDATE` 后，某些行开始满足 `<cond>`，这些行将永远不会被删除。现在该变更操作会重新计算行的生存时间 (TTL)，新满足条件的过期行会被正常删除，而不再被静默保留。[#110648](https://github.com/ClickHouse/ClickHouse/pull/110648) ([groeneai](https://github.com/groeneai))。
* 修复了 `LOGICAL_ERROR` "Invalid partition key size: 0" 错误：在启用 `non_replicated_deduplication_window` 的情况下，若某个异步插入批次仅被部分去重 (部分 `insert_deduplication_token` 重复，部分为新值) ，该错误可能导致向分区 `MergeTree` 表执行的 `INSERT` 中止。[#110651](https://github.com/ClickHouse/ClickHouse/pull/110651) ([groeneai](https://github.com/groeneai))。
* 修复了新分析器下常量折叠会静默改变常量 `Geometry` 值类型的问题。`Geometry` 是一个具名 `Variant`，其部分备选类型共享相同的存储布局 (`LineString`/`Ring`、`MultiLineString`/`Polygon` 以及空值) ，因此仅备选类型不同的两个折叠常量会被合并为一个，例如常量 `MULTIPOLYGON EMPTY` 会变成 `LINESTRING()`。[#110709](https://github.com/ClickHouse/ClickHouse/pull/110709) ([groeneai](https://github.com/groeneai))。
* 修复了按序读取查询返回错误结果 (合并顺序错误) 的问题：当 `distinct-in-order` 或 `aggregation-in-order` 将读取范围扩展到更长的排序键前缀，超出 `ORDER BY` 为按序读取虚拟行所设置的前缀时，就会出现该问题。虚拟行中多出的排序列被填充为默认值，可能导致 `MergingSortedTransform` 顺序错乱 (在 debug/sanitizer 构建中还会因 `LOGICAL_ERROR` 而中止) 。[#110725](https://github.com/ClickHouse/ClickHouse/pull/110725) ([groeneai](https://github.com/groeneai))。
* 在使用服务器间密钥的集群上执行并行副本读取和 Distributed 读取时，现在会将查询的已启用角色 (SET ROLE / role=) 传递到远程节点；此前远程节点会回退为使用用户的默认角色，导致行策略的评估结果与发起服务器不一致。[#110867](https://github.com/ClickHouse/ClickHouse/pull/110867) ([evillique](https://github.com/evillique))。
* 修复了一个罕见的竞态问题：对 `ReplicatedMergeTree` 表执行仅修改注释或仅修改设置的 `ALTER` 时，可能会静默丢弃由并发 `ALTER ... ADD COLUMN` 添加的列，导致某个副本停留在过时的表结构上。[#111029](https://github.com/ClickHouse/ClickHouse/pull/111029) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了在封装 `Distributed` 表的 `Merge` 表上执行带聚合的 `GROUP BY` 时出现的 `NUMBER_OF_COLUMNS_DOESNT_MATCH` 错误。该问题出现在分组键为某列的函数、且聚合函数读取同一列的情况下 (例如 `SELECT toString(g), min(g) FROM merge_over_distributed GROUP BY toString(g)`) 。[#111334](https://github.com/ClickHouse/ClickHouse/pull/111334) ([groeneai](https://github.com/groeneai))。
* 修复了在 `Join` 引擎表 (`StorageJoin`) 上使用 `USING` 执行 `FULL JOIN` 时结果错误的问题：当左侧键为 `Nullable` 而存储键不是时，键为 `NULL` 的未匹配左侧行会返回 `0` 而非 `NULL`。[#111371](https://github.com/ClickHouse/ClickHouse/pull/111371) ([groeneai](https://github.com/groeneai))。
* 当表的 `fsync_part_directory` 设置启用时，`ALTER TABLE ... DETACH PARTITION/PART` 现在会对其在 `detached/` 下创建的克隆执行 fsync (包括数据分片子树以及直至磁盘根目录的整条目录链) ，Full (目录) 和 Packed 两种数据分片存储格式均适用。此前，用于将这些行从活动集合中移除的空覆盖数据分片会被 fsync，而克隆却从未被 fsync，因此若在确认后立即断电，btrfs 上已分离的数据可能会丢失 (未同步的克隆目录项会回滚，导致 `detached/` 为空，没有可供 `ATTACH` 的内容) 。该行为由现有的 `fsync_part_directory` 设置控制，默认行为保持不变。[#111426](https://github.com/ClickHouse/ClickHouse/pull/111426) ([groeneai](https://github.com/groeneai))。
* 当表结构从存储推断时 (例如基于执行 `SELECT NULL` 的视图创建的无列 `remote()`/`Remote`/`Distributed` 表) ，现在会在 `CREATE TABLE` 阶段直接拒绝 `Nullable(Nothing)` (或任何其他不允许在表中使用的类型) 列，而不再持久化一份在下次服务器重启时无法加载、还会阻塞其他无关表加载的元数据。[#111487](https://github.com/ClickHouse/ClickHouse/pull/111487) ([groeneai](https://github.com/groeneai))。
* 修复了使用并行副本读取时，若查询在发起端完全由投影优化 (精确计数、minmax 计数，或未选中任何范围的已存储聚合/普通投影) 给出结果，可能导致服务器中止的 `LOGICAL_ERROR` (`Got read request from replica N for unknown stream ...`) 。[#111689](https://github.com/ClickHouse/ClickHouse/pull/111689) ([groeneai](https://github.com/groeneai))。
* 修复了 DeltaLake 分区 `INSERT` (`allow_experimental_delta_lake_writes=1`) 会损坏包含路径字符的分区值、且拒绝 `NULL` 的问题。此前，`a/b` 这样的值会被静默提交为 `a`，`%` 会生成无法读回的数据文件，而 `NULL` 分区值会报 `NOT_IMPLEMENTED` 错误。现在，分区值会经百分号编码为单个路径段，真实值存储在 `partitionValues` 中，不再从路径中反向解析；`NULL` (或空字符串) 分区值则写为 `__HIVE_DEFAULT_PARTITION__`，对应的 `partitionValues` 条目为 null。[#111793](https://github.com/ClickHouse/ClickHouse/pull/111793) ([groeneai](https://github.com/groeneai))。
* 修复了在启用 `enable_parallel_blocks_marshalling` (默认启用) 的分片上执行分布式查询时出现的 `Expected UInt64 column for __grouping_set, got BLOB` 和 `ColumnBLOB should be converted to a regular column before usage` 逻辑错误，例如在包含本地副本的集群上执行 `GROUP BY GROUPING SETS`，或读取同时涵盖本地表和分布式表的 `Merge` 表时。如果查询计划产生的块在同一进程内消费，则不再为其添加 `BlocksMarshallingStep`。[#111997](https://github.com/ClickHouse/ClickHouse/pull/111997) ([groeneai](https://github.com/groeneai))。
* 修复了 `MergeTree` 表执行变更时出现的 `LOGICAL_ERROR` (`Type mismatch when building statistics for column`) ，该问题发生在某列带有统计信息、且其类型已通过仅修改元数据的 `ALTER MODIFY COLUMN` 更改 (例如 `Enum8` 改为 `Int8`，或 `DateTime` 改为 `UInt32`) 的情况下。现在，变更只会重新计算其实际重写的列的统计信息，其余统计信息原样保留；对于由 `MATERIALIZE COLUMN`、由对某个 `MATERIALIZED` 列所依赖列执行的 `UPDATE`，或由 `CLEAR COLUMN` 重写的列，现在会重新计算其统计信息，而不再保留过时的内容。[#112009](https://github.com/ClickHouse/ClickHouse/pull/112009) ([groeneai](https://github.com/groeneai))。
* 修复了当查询按 `intDiv(constant, key)` 或 `divide(constant, key)` 过滤时会静默遗漏行的问题。对于常量除以键列的情况，主键和分区分析给出了错误的单调性方向，导致本应匹配的粒度被剪枝，查询在没有任何报错的情况下返回了更少的行。同时修复了无符号常量被除数最高位为 1 时 `intDiv` 的问题；当 `Decimal` 操作数导致除法以该 decimal 的原生位宽计算时，不再声明单调性；此外，对于将 `IPv4`/`IPv6` 常量除以键列的合法查询，键分析不再抛出 `Cannot compare DB::IPv4 with long`。[#112156](https://github.com/ClickHouse/ClickHouse/pull/112156) ([groeneai](https://github.com/groeneai))。
* 修复了参数化视图在 `SELECT` 主体中使用 `INTERSECT`/`EXCEPT`，或使用混合了 `UNION DISTINCT` 与 `UNION ALL` 的 `UNION` 链时，被错误归类为普通视图的问题。此类视图可以成功创建，但其元数据无法读回：加载时会抛出 `Invalid storage definition in metadata file`，导致该视图永远无法加载，并使 debug 或 sanitizer 构建的服务器在启动时中止。此外，`system.tables.parameterized_view_parameters` 也不会为这些视图报告任何参数。[#112211](https://github.com/ClickHouse/ClickHouse/pull/112211) ([groeneai](https://github.com/groeneai))。
* 修复了查询在计算 `geohashesInBox` 时 `max_execution_time` 和 `KILL QUERY` 被忽略的问题。此类查询会先展开数据块中的每一行才能被中断，因此取消操作要数分钟后才生效；现在该函数会在遍历行的过程中检查查询的时间限制。在持久化的表表达式 (例如排序键、跳数索引或 `PARTITION BY`) 中进行的计算不在本次修复范围内，将另行跟进。[#112273](https://github.com/ClickHouse/ClickHouse/pull/112273) ([groeneai](https://github.com/groeneai))。
* 修复了在 Merge 表上使用 PREWHERE 时出现的逻辑错误，该 Merge 表的底层为另一个 Merge 表或列类型不同的 materialized view。同时修复了在从远程服务器读取数据的表 (Distributed 表，或封装了 Distributed 表的表) 上行策略被静默忽略的问题，该问题可能导致本应被策略隐藏的行暴露出来；此类查询现在会以 ILLEGAL\_PREWHERE 错误被拒绝。请改为在每台远程服务器的底层本地表上定义这些策略；注意，对于通过 `serialize_query_plan = 1` 下发的读取，此类策略仍不会生效，这是一个独立的、早已存在的 bug。[#112326](https://github.com/ClickHouse/ClickHouse/pull/112326) ([PedroTadim](https://github.com/PedroTadim))。
* 修复了 `ALTER TABLE ... MODIFY COLUMN` 修改类型后，若对应的变更从未执行 (例如被 `KILL MUTATION` 移除) ，会读取到过期二级 (跳数) 索引的问题：磁盘上的粒度按旧类型写入，却按新类型解码，从而引发 `LOGICAL_ERROR`、申请高达数 EB 的内存分配，或静默返回错误结果。同时修复了基于表达式的索引在表达式语义改变而存储字节完全不变 (因而根本不会创建变更) 时返回错误结果的问题，例如仅修改 `DateTime` 时区，或仅修改自定义类型名称 (如将 `UInt8` 改为 `Bool`) 的 `MODIFY COLUMN`。现在对于受影响的数据分片，此类索引会被跳过。[#112484](https://github.com/ClickHouse/ClickHouse/pull/112484) ([groeneai](https://github.com/groeneai))。
* 修复了在集群上执行聚合的查询在启用 `serialize_query_plan = 1` 和基于计划的并行副本时出现的 `LOGICAL_ERROR` (`Cannot add transform Resize to Pipes because it has no outputs`) ，其原因是合并步骤将管道调整为零个流。[#112506](https://github.com/ClickHouse/ClickHouse/pull/112506) ([groeneai](https://github.com/groeneai))。
* 修复了 `ReplicatedMergeTree` 副本在应用自身待处理的 `ALTER ... ADD COLUMN` 之前，对从其他副本拉取的数据分片执行变更时出现的 `LOGICAL_ERROR` ("Part ... contains column ... that is absent in table ...") 。现在此类变更会推迟到元数据变更应用之后再执行。[#112510](https://github.com/ClickHouse/ClickHouse/pull/112510) ([groeneai](https://github.com/groeneai))。
* 修复了当查询的 `ORDER BY` 落盘时，读取计数器 (`read_rows`、`read_bytes`、`ProfileEvents['SelectedRows']`、`ProfileEvents['SelectedBytes']`) 以及 `READ_ROWS` 和 `READ_BYTES` 配额被多计的问题。从外部排序临时 File 中重新读取的行会再次被计为源端读取，导致发生落盘的查询多报读取量，即使并未超出配额，也可能因 `QUOTA_EXCEEDED` 而被拒绝。[#112645](https://github.com/ClickHouse/ClickHouse/pull/112645) ([groeneai](https://github.com/groeneai))。
* 修复了 `ProfileEvents['JoinResultRowCount']` 少报落盘 `JOIN` 结果大小的问题。从延迟桶中输出的行仅计入了 `JoinDelayedJoinedTransformRowCount`，而未计入总数。查询结果始终正确，仅该 profile 事件有误。[#112673](https://github.com/ClickHouse/ClickHouse/pull/112673) ([groeneai](https://github.com/groeneai))。
* 修复了分布式查询在与副本建立连接期间，`max_execution_time` 和 `KILL QUERY` 静默失效的问题。此类查询现在会在下一次尝试连接时停止，而不会再逐一尝试所有剩余副本并重试。[#112689](https://github.com/ClickHouse/ClickHouse/pull/112689) ([groeneai](https://github.com/groeneai))。
* 修复了在未完成的 `RENAME COLUMN` alter 变更仍在进行时，`MergeTree` 表上的 `ALTER` 仍会被应用的问题。该问题可能导致存储元数据被以不兼容的方式更新，并使后续变更被完全阻塞。[#112783](https://github.com/ClickHouse/ClickHouse/pull/112783) ([Michicosun](https://github.com/Michicosun))。
* 修复了从基于 `Distributed` 表的 `Merge` 表读取时 `ORDER BY` 结果错误的问题：返回的行可能顺序错乱，并且在使用 `LIMIT` 时，本应出现在结果中的行可能缺失。[#112931](https://github.com/ClickHouse/ClickHouse/pull/112931) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在启用 `share_nested_offsets` (默认启用) 的表上，当启用文件系统读取预取，且 `Nested` 列与某个曾被删除后又重新添加的子列一同读取时结果错误的问题。此类查询可能会为某个物理上存在、且从未被 `ALTER` 改动过的列返回默认值。在对象存储上，由于 `remote_filesystem_read_prefetch` 默认为 `1`，无需任何非默认设置即可触发该问题；在本地磁盘上则需设置 `local_filesystem_read_prefetch = 1`。另有一个与预取无关的独立缺陷，在读取范围跨越多个块时仍会导致此类读取结果损坏，该问题不在本次修复范围内。[#112997](https://github.com/ClickHouse/ClickHouse/pull/112997) ([groeneai](https://github.com/groeneai))。
* 修复了按分区分发数据的查询 (例如带 `PARTITION BY` 的窗口函数，或使用 `join_algorithm = 'parallel_full_sorting_merge'` 的连接) 中，当某个分片的下游已结束、而某个块仅分发了一部分时出现的 `Pipeline stuck` 逻辑错误。[#113190](https://github.com/ClickHouse/ClickHouse/pull/113190) ([groeneai](https://github.com/groeneai))。
* 修复了在 `ReplicatedMergeTree` 上以 `alter_sync = 2` 执行 `ALTER`、`OPTIMIZE`、`TRUNCATE` 及分区操作语句时，如果表在语句等待其他副本期间开始关闭 (例如因并发执行 `DROP DATABASE ... SYNC`) ，语句会挂起的问题。此类语句现在会以 `UNFINISHED` 报错失败，并且同样遵循 `max_execution_time` 和 `KILL QUERY`。[#113228](https://github.com/ClickHouse/ClickHouse/pull/113228) ([groeneai](https://github.com/groeneai))。
* 修复了在启用 `read_in_order_use_virtual_row` 时，若 `MergeTree` 按序读取查询同时使用 `WITH FILL ... INTERPOLATE` 和 `IN` 或 `has` 过滤条件，会出现 `Cannot insert element into Set` (`NOT_IMPLEMENTED`) 错误的问题。[#113264](https://github.com/ClickHouse/ClickHouse/pull/113264) ([groeneai](https://github.com/groeneai))。
* 修复了在启用设置 `inject_random_order_for_select_without_order_by` 且聚合查询从包含 `Distributed` 子表的 `Merge` 表读取数据时出现的逻辑错误 (异常) `Chunk info was not set for chunk in MergingAggregatedTransform`：对于仅规划到中间阶段的查询，不再注入随机的 `ORDER BY rand()` 包装。[#113266](https://github.com/ClickHouse/ClickHouse/pull/113266) ([alexey-milovidov](https://github.com/alexey-milovidov)).
* 修复了当 `MergeTree` 表包含两条或更多时间表达式完全相同、仅 `WHERE` 条件不同的 `TTL ... DELETE WHERE` 规则时，行永远不会被删除的问题。执行一次 TTL 删除合并后，该数据分片的 `rows_where_ttl_info` 会被重置为零，导致此后再也不会为其调度 TTL 合并，过期行因此被无限期保留，且不会产生任何错误或日志信息。[#113384](https://github.com/ClickHouse/ClickHouse/pull/113384) ([groeneai](https://github.com/groeneai)).
* 修复了当查询在表元数据中存储的表达式 (例如 sorting key、跳过索引或 `PARTITION BY` 键) 内计算 `geohashesInBox`、`arrayFold`、`sleep`、`base58Decode`、`h3PolygonToCells` 或 `h3PolygonToCellsWithContainment` 时，`max_execution_time` 和 `KILL QUERY` 不生效的问题。[#113456](https://github.com/ClickHouse/ClickHouse/pull/113456) ([groeneai](https://github.com/groeneai)).
* 修复了当包含多个子表的 `Merge` 表读取外层查询所引用的 materialized CTE 时抛出的 `LOGICAL_ERROR` (`Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan`) 。[#113558](https://github.com/ClickHouse/ClickHouse/pull/113558) ([alexey-milovidov](https://github.com/alexey-milovidov)).
* 修复了对包含多个子表、带有纯列 `PREWHERE` 以及单独 `WHERE` 的 `Merge` 表执行 `EXPLAIN ANALYZE` 时出现的 `Logical error: 'Required output position N is out of range for pass-through inputs'`。[#113725](https://github.com/ClickHouse/ClickHouse/pull/113725) ([groeneai](https://github.com/groeneai)).
* 修复了当视图的列类型与底层存储不同 (例如基于 `system.tables` 的 `information_schema.tables`，前者的 `engine` 为 `Nullable(String)`，后者为 `String`) 时，将该视图上的过滤条件下推到存储所引发的逻辑错误 (`Unexpected return type`) 。[#113984](https://github.com/ClickHouse/ClickHouse/pull/113984) ([alexey-milovidov](https://github.com/alexey-milovidov)).
* 修复了谓词包含 `IN (subquery)` 的变更在子查询的集合仍在构建时被取消 (例如通过 `KILL MUTATION` 或 `DETACH DATABASE`) 所出现的 `Not-ready Set is passed as the second argument for function 'in'` 错误。[#114463](https://github.com/ClickHouse/ClickHouse/pull/114463) ([groeneai](https://github.com/groeneai)).
* 对用于排序键、主键或分区键的列执行 `ALTER TABLE ... DROP COLUMN` 时，现在会与 `ALTER TABLE ... CLEAR COLUMN` 一样，以 `ALTER_OF_COLUMN_IS_FORBIDDEN` 报错并给出说明。此前，该操作会在重新计算键表达式时报出令人困惑的 `UNKNOWN_IDENTIFIER: Missing columns` 错误。当 `Nested` 组中的某列被用于键时，按公共前缀删除或清空整个组同样适用此规则；此前这种操作可能会静默破坏该组的数据，或留下一个永远无法完成的变更。删除仅在 `TTL` 表达式中使用的列时，现在也会报告该操作会破坏哪个 TTL 表达式 [#114468](https://github.com/ClickHouse/ClickHouse/pull/114468) ([m7kss1](https://github.com/m7kss1)).
* 修复了在同一个 `ALTER` 中被重命名、删除后又重新添加的列，在变更尚未完成时返回已删除列的值、而非其自身默认值的问题。[#114601](https://github.com/ClickHouse/ClickHouse/pull/114601) ([tiandiwonder](https://github.com/tiandiwonder)).
* 修复了当底层表将父列声明为 `ALIAS` 时，通过 `Merge` 表读取子列 (`.size0`、`.null`、元组元素、`String.size`) 的问题。此前此类读取会返回该类型的默认值；若同一查询中还选择了父列，则可能返回某个无关列的值。[#114673](https://github.com/ClickHouse/ClickHouse/pull/114673) ([groeneai](https://github.com/groeneai))。
* 修复了当多边形参数为无效的常量字面量且 `validate_polygons = 0` 时，基于 MergeTree 主键使用 `pointInPolygon` 过滤的 `SELECT` 结果中缺失行的问题。此前主键分析会基于一个从未校验过的多边形进行粒度剪枝，从而误删包含匹配行的粒度。[#114710](https://github.com/ClickHouse/ClickHouse/pull/114710) ([groeneai](https://github.com/groeneai))。
* 修复了 `ALTER TABLE ... MATERIALIZE INDEX`、`MATERIALIZE STATISTICS` 和 `MATERIALIZE PROJECTION` 的格式化问题：格式化时会丢失 `IF EXISTS` 子句，导致格式化后的查询与原先解析的查询不一致。此外，现在会拒绝四种 `ALTER ... STATISTICS` AST JSON 负载，这些负载无法由 SQL 解析器生成，且格式化后会变成另一条命令。[#115099](https://github.com/ClickHouse/ClickHouse/pull/115099) ([groeneai](https://github.com/groeneai))。
* 修复了对 `LowCardinality(String)` 键进行聚合或 JOIN 时，若其字典在聚合过程中不断增长，会越界读取缓存的字典哈希的问题，该问题可通过 `TTL ... GROUP BY` 触发。此问题可能导致哈希值错误，并在 sanitizer 构建中报告 heap-buffer-overflow。[#115604](https://github.com/ClickHouse/ClickHouse/pull/115604) ([groeneai](https://github.com/groeneai))。
* `CREATE TABLE` 和 `ALTER TABLE` 现在禁止在分区键所用的列上使用有损编解码器 (如 `SZ3`) 。[#115626](https://github.com/ClickHouse/ClickHouse/pull/115626) ([groeneai](https://github.com/groeneai))。
* 通过 `Merge` 表读取时，若匹配到的 `Alias` 表指向参数化视图，将不再抛出 `LOGICAL_ERROR: Table has no columns.` (该错误在 debug 和 sanitizer 构建中会导致服务器中止) 。此类表现在会报告 `STORAGE_REQUIRES_PARAMETER`，与参数化视图自身报告的错误一致。其他任何无法提供列的匹配表现在会报告 `UNSUPPORTED_METHOD`，而非内部错误。[#115896](https://github.com/ClickHouse/ClickHouse/pull/115896) ([groeneai](https://github.com/groeneai))。
* 修复了表达式引用 `_sample_factor` 的待处理变更在即时预览时的问题。在 `apply_mutations_on_fly = 1` 且带有 `SAMPLE` 子句时，该表达式此前会使用读取查询的样本系数求值，而非后台物化时持久化的值，导致预览的行与最终物化结果不一致；此外，一个待处理的 `ALTER TABLE t DELETE WHERE _sample_factor > 1` 可能导致 `SAMPLE` 读取不返回任何行。查询自身的 `_sample_factor` 列不受影响。[#115906](https://github.com/ClickHouse/ClickHouse/pull/115906) ([groeneai](https://github.com/groeneai))。
* 格式版本为 `V3` 的统计信息文件现在可以正常读取，不再因 `ILLEGAL_STATISTICS` 被拒绝。此类文件仅由某一短暂时间段内的 `master` 构建生成，但包含这些文件的数据分片将完全无法读取，而在只读磁盘上也无法通过 `ALTER TABLE ... MATERIALIZE STATISTICS` 重新生成。[#116030](https://github.com/ClickHouse/ClickHouse/pull/116030) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `SELECT ... FROM t STREAM ... ORDER BY ... LIMIT n` 查询读取带有 `PROJECTION` 的表时报错 `Invalid number of columns in chunk pushed to OutputPort` (`LOGICAL_ERROR`) 的问题。`STREAM` 读取不再应用延迟物化。[#116187](https://github.com/ClickHouse/ClickHouse/pull/116187) ([groeneai](https://github.com/groeneai))。
* 对于 Replicated 数据库，不再复制 `ALTER TABLE ATTACH PARTITION FROM`。[#94835](https://github.com/ClickHouse/ClickHouse/pull/94835) ([MikhailBurdukov](https://github.com/MikhailBurdukov))。
* 修复了当已回滚的事务性 MergeTree 数据分片与已提交的数据分片相交时，表启动期间出现服务器中止 (在 sanitizer 构建版本中) 以及静默数据丢失的问题。`PartLoadingTree::add` 现在能够正确识别两个相交数据分片中哪一个已被回滚，将其移除，并按正确顺序把其遗留的子分片重新挂到已提交的数据分片下。[#100992](https://github.com/ClickHouse/ClickHouse/pull/100992) ([tuanpach](https://github.com/tuanpach))。
* 修复了 `indexOfAssumeSorted` 在 MergeTree 表中处理 `Array(LowCardinality(String))` 列时返回错误结果的问题。[#101771](https://github.com/ClickHouse/ClickHouse/pull/101771) ([Onyx2406](https://github.com/Onyx2406))。
* 修复了读取 `Iceberg` 或 `DeltaLake` 数据湖表时出现的 `LOGICAL_ERROR` 异常。该问题发生在读取路径未固定 `datalake_table_state` 即进入读取管道的情况下，例如并发的 `Iceberg` 元数据更新，或对 `DeltaLake` 表执行的 `merge` 读取。[#102033](https://github.com/ClickHouse/ClickHouse/pull/102033) ([groeneai](https://github.com/groeneai))。
* 修复了在分区键为 `Time` 类型的表上，`OPTIMIZE TABLE ... PARTITION ...` (以及其他通过 `convertFieldToTypeImpl` 解析分区值的查询) 抛出 `Logical error: Parsed partition value: ... doesn't match partition value for an existing part with the same partition ID: ...` 的问题。[#106202](https://github.com/ClickHouse/ClickHouse/pull/106202) ([groeneai](https://github.com/groeneai))。
* 修复了轻量级删除后未留下投影分片时，数据分片被错误标记为投影已损坏的问题。这种情况可能发生在投影重建后输出行数为零，或投影被删除时 (`lightweight_mutation_projection_mode = 'rebuild'`/`'drop'`) 。此前，该损坏状态会导致针对该数据分片的查询无法使用投影优化。[#106273](https://github.com/ClickHouse/ClickHouse/pull/106273) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了 `system.warnings` 中的内存/CPU/变更过载警告比异步指标滞后一个周期 (且在首个周期中缺失) 的问题。[#108035](https://github.com/ClickHouse/ClickHouse/pull/108035) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在启用实验性设置 `make_distributed_plan = 1` 时，查询基于 `Distributed` 表或视图的 `Merge` 表会出现 `LOGICAL_ERROR` 异常 (`ScatterExchangeStep should have one source shard, got 8`) 以及重复行的问题。[#108401](https://github.com/ClickHouse/ClickHouse/pull/108401) ([groeneai](https://github.com/groeneai))。
* 修复了当 `Nullable(Tuple(...))` 列中的非 Nullable `LowCardinality` 元素被用作子列 (例如用作排序键) 时，合并期间服务器中止 (`Sort order of blocks violated`) 以及读取结果错误的问题。[#108679](https://github.com/ClickHouse/ClickHouse/pull/108679) ([groeneai](https://github.com/groeneai))。
* 修复了当账户密钥不是有效的 Base64 时，经由 `azureBlobStorage()` (以及相关的 Azure 表函数/存储) 调用内置 Azure SDK 的 `Base64Decode` 导致崩溃的问题。`>= 0x80` 的字节会导致解码表越界读取，而任何无效字节都会导致对负值执行未定义的左移操作 (在 sanitizer 下会中止) 。现在无效密钥会被正常拒绝。[#108716](https://github.com/ClickHouse/ClickHouse/pull/108716) ([groeneai](https://github.com/groeneai))。
* 修复了一个 `LOGICAL_ERROR` ("New empty part is about to materialize but the directory already exist") ：如果 MergeTree 表上的前一次 `DROP`/`DETACH`/`MOVE`/`REPLACE PARTITION` 操作被中断 (例如事务回滚或崩溃) ，并遗留了过期的 `tmp_empty_<part>` 目录，那么再次执行此类操作时，可能会导致调试和 sanitizer 构建版本中的服务器中止。现在会直接回收该过期目录，不再报错。[#108879](https://github.com/ClickHouse/ClickHouse/pull/108879) ([groeneai](https://github.com/groeneai))。
* 修复了 wide part 中列的 `TTL` 过期后，projection 返回该列类型的默认值 (例如 `0`) ，而非其 DDL 中定义的 `DEFAULT` 值 (例如 `-1`) 的问题。[#109013](https://github.com/ClickHouse/ClickHouse/pull/109013) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了使用自定义 `disk` 设置 (`SETTINGS disk = disk(...)`) 创建的 `MergeTree` 表执行 `ALTER` 查询失败的问题。[#109199](https://github.com/ClickHouse/ClickHouse/pull/109199) ([Michicosun](https://github.com/Michicosun))。
* 修复了通过 `Merge` 表读取 `MaterializedPostgreSQL` 数据库中的表时，会读到过期行和已删除行的问题。[#109339](https://github.com/ClickHouse/ClickHouse/pull/109339) ([vdimir](https://github.com/vdimir))。
* 修复了读取按 `BIGINT` 列分区、且分区值超出 `Int32` 范围的 Paimon 表时出错的问题。此前此类分区值会被截断 (例如 `9223372036854775807` 变为 `-1`) ，导致生成错误的分区路径，并因文件系统错误而失败。[#109510](https://github.com/ClickHouse/ClickHouse/pull/109510) ([groeneai](https://github.com/groeneai))。
* 修复了从 `Merge` 表读取数据时，若其子表的行策略过滤器仅为一个已存在的列 (例如 `CREATE ROW POLICY ... USING flag`) ，会出现逻辑错误 ("Cannot determine row level filter; 0 columns deleted, 0 columns added") 的问题。[#109843](https://github.com/ClickHouse/ClickHouse/pull/109843) ([groeneai](https://github.com/groeneai))。
* 修复了 IcebergLocal 错误地将存储类型报告为 Azure 的问题。[#109872](https://github.com/ClickHouse/ClickHouse/pull/109872) ([PedroTadim](https://github.com/PedroTadim))。
* 对于元数据加载失败的 projection part，`CHECK TABLE` 现在会报告实际的损坏情况，而不再报告具有误导性的 `Columns doesn't match ... Expected: 0 columns` 错误。[#110262](https://github.com/ClickHouse/ClickHouse/pull/110262) ([Algunenano](https://github.com/Algunenano))。
* 修复了对象存储磁盘上的 `MergeTree` 表在残留的 `txn_version.txt.tmp` 文件磁盘级元数据损坏时，导致服务器启动失败的问题。[#110519](https://github.com/ClickHouse/ClickHouse/pull/110519) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了带有 `_part_offset` 或提交顺序 projection 的 MergeTree 表，在禁用 `allow_part_offset_column_in_projections` 或 `allow_commit_order_projection` 后，一旦表被分离或服务器重启，便永久无法重新附加的问题。这两个设置仅在 CREATE 时进行校验，因此 ATTACH 时不再重新检查。[#110570](https://github.com/ClickHouse/ClickHouse/pull/110570) ([groeneai](https://github.com/groeneai))。
* 修复了一个罕见的 `LOGICAL_ERROR` ("Unexpected number of parts to remove from parts\_queue") ：在 `ReplicatedMergeTree` 上，当两个分区操作 (例如两个 `MOVE PARTITION` / `REPLACE PARTITION` 查询，或其中一个与后台 `DROP_RANGE` 发生竞争) 同时取消重叠范围内的后台 part 检查时，可能导致服务器异常终止。[#110738](https://github.com/ClickHouse/ClickHouse/pull/110738) ([groeneai](https://github.com/groeneai))。
* 修复了使用 `Quantized(...)` 编解码器的列嵌套在可池化的序列化中时，可能出现的 `Hash is not set for serialization` 逻辑错误。典型场景如：基于多个源表创建的 `Merge` 表中，同名列类型不同 (被合并为 `Variant`) 。[#110776](https://github.com/ClickHouse/ClickHouse/pull/110776) ([groeneai](https://github.com/groeneai))。
* 修复了当 `max_streams_for_merge_tree_reading` 取极端值 (接近 `UInt64` 最大值) 且同时设置 `allow_asynchronous_read_from_io_pool_for_merge_tree = 1` 时，读取 MergeTree 表出现 `std::length_error` (`LOGICAL_ERROR`) 的问题。现在该设置的上限会被限制为与 `max_threads` 相同。[#110936](https://github.com/ClickHouse/ClickHouse/pull/110936) ([groeneai](https://github.com/groeneai))。
* 修复了对单列 `MergeTree` 表执行合并时出现的逻辑错误 `Cannot calculate columns sizes when columns or checksums are not initialized`。该问题出现在表中唯一的列带有会完全过期的列级 `TTL` (且 `min_bytes_for_wide_part = 1`) 时。[#111169](https://github.com/ClickHouse/ClickHouse/pull/111169) ([groeneai](https://github.com/groeneai))。
* 当设置了 `min_rows_to_fsync_after_merge` / `min_compressed_bytes_to_fsync_after_merge` / `fsync_part_directory` 时，现在会对合并或物化后 part 中的文本索引文件执行 fsync。此前，这些文件是 part 中唯一未同步的文件，因此合并后若立即断电，可能会留下一个已提交但已损坏的 part，进而导致数据丢失。[#111335](https://github.com/ClickHouse/ClickHouse/pull/111335) ([groeneai](https://github.com/groeneai))。
* 修复了当清单中的分区 Tuple 与其分区规范不匹配时，`Iceberg` 表上 `OPTIMIZE TABLE ... MANIFEST` 出错的问题 [#111368](https://github.com/ClickHouse/ClickHouse/pull/111368) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni))。
* 修复了以下问题：当“直接从文本索引读取”优化在具有多个 `text` 索引的 `MergeTree` 表的读取头中遗留未使用的索引虚拟列时，延迟物化优化会出现越界读取 (发行版) / 逻辑错误 (debug 构建版本) ，同时 `Merge` 表的 `Pipe::unitePipes` 中也会出现逻辑错误。[#111467](https://github.com/ClickHouse/ClickHouse/pull/111467) ([groeneai](https://github.com/groeneai))。
* 修复了在调低 `part_minmax_index_columns` (例如从 `with_block_number_offset` 改回 `partition_key_only`) 后，debug/sanitizer 构建中可能导致后台合并中止的 `LOGICAL_ERROR` ("Part level Min-Max index was constructed from unexpected columns set") 。[#111511](https://github.com/ClickHouse/ClickHouse/pull/111511) ([groeneai](https://github.com/groeneai))。
* 修复了对包含多个分区且定义了行策略的表执行 `STREAM` 读取 (`enable_streaming_queries = 1`) 时发生的崩溃。在 debug 和 sanitizer 构建中，会因逻辑错误 `Filter column ... not found in DAG outputs` 而失败；在发行版构建中则可能发生段错误。[#111572](https://github.com/ClickHouse/ClickHouse/pull/111572) ([groeneai](https://github.com/groeneai))。
* 修复了 `MergeTree` 表在当前设置禁用多态 parts (非自适应粒度) 的情况下加载已有 `Compact` part 时抛出的 `LOGICAL_ERROR` (`Cannot create part with type Compact and storage type Full because table does not support polymorphic parts`) 。例如，当只读表与另一个表共享磁盘路径，并通过 `SYSTEM RESTART DISK` 或在服务器启动时重新加载其 parts 时，就可能出现这种情况。在 debug 和 sanitizer 构建中，该异常会导致服务器中止。[#111626](https://github.com/ClickHouse/ClickHouse/pull/111626) ([groeneai](https://github.com/groeneai))。
* 当 `fsync_part_directory = 1` 时，将 part 目录从临时名称重命名为最终名称的操作现在也会通过对父目录执行 fsync 来保证持久性 (对于跨父目录的移动，还会同步源父目录) 。此前只会对被移动的目录执行 fsync，因此若在 part 提交后立即断电，即使其文件已写入，磁盘上也可能缺失该 part，导致在启用该设置的情况下仍然丢失行。[#111861](https://github.com/ClickHouse/ClickHouse/pull/111861) ([groeneai](https://github.com/groeneai))。
* 修复了从 `MergeTree` 表中同时选择 `Nullable(Tuple(...))` 列及其某个携带空值的元素子列 (`Variant`、`Dynamic` 或 `LowCardinality`) 时出现的错误结果和 `LOGICAL_ERROR`。读取该子列时，会将父 tuple 中为 `NULL` 的行，在一个已通过子流缓存共享的列中标记为 `NULL`，导致读取整列时得到错位的值。[#111949](https://github.com/ClickHouse/ClickHouse/pull/111949) ([groeneai](https://github.com/groeneai))。
* 修复了在配置了自动溢写到磁盘阈值时 (自 26.5 起为默认配置) ，哈希连接会丢失构建后优化 (转换为固定哈希表、共享运行时过滤器、右表范围重排) 的问题。[#111972](https://github.com/ClickHouse/ClickHouse/pull/111972) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在未使用 `simdcomp` 的构建 (除 x86\_64 Linux 之外的所有目标平台，例如 aarch64) 上，当 `text_index_posting_list_apply_mode = 'lazy'` 时，`hasAllTokens` 及其他多标记 `text` 索引搜索返回错误结果 (静默丢失行) 的问题。可移植的位打包解码器在块的位宽为零时不会写入解码后的零值，导致位于单条倒排记录段中的倒排记录被丢弃。磁盘格式保持不变，修复后现有数据可正常读取。[#112178](https://github.com/ClickHouse/ClickHouse/pull/112178) ([groeneai](https://github.com/groeneai))。
* 加载损坏的 MergeTree 统计信息时，相关操作现在会直接失败，而不再忽略该错误。[#112201](https://github.com/ClickHouse/ClickHouse/pull/112201) ([skuznetsov-clickhouse](https://github.com/skuznetsov-clickhouse))。
* 修复了 HDFS 上已确认的 Iceberg 写入被静默丢失的问题：Iceberg 提交会通过条件写入来发布每个新的元数据文件，但 `HDFSObjectStorage` 忽略了该条件，直接执行普通覆盖写入，导致所有并发写入方都收到了确认，而其中一个写入方的快照却变得不可访问。现在 HDFS 会拒绝条件写入，因此 HDFS 上由存储管理的 Iceberg 写入 (包括带有显式列列表的 `CREATE TABLE ... ENGINE = IcebergHDFS(...)`) 将会失败。读取不受影响。[#112437](https://github.com/ClickHouse/ClickHouse/pull/112437) ([groeneai](https://github.com/groeneai))。
* 修复了对 `KeeperMap` 表执行 `DELETE` 时仅删除前 `max_block_size` 条匹配行，却将该变更报告为成功完成的问题。同时修复了在 `keeper_map_strict_mode = 1` 时 `DELETE` 不具备原子性的问题：它可能回退为无版本删除，从而误删被并发更新的行；而且它会逐块应用匹配的行，一旦发生冲突，删除操作可能只被部分应用。[#112777](https://github.com/ClickHouse/ClickHouse/pull/112777) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了读取或合并路径上的瞬时 Azure Blob 存储错误 (RBAC 权限传播导致的 `403 Forbidden`、凭据身份验证失败，或以 `408` 形式出现的连接超时) 被误判为不可重试并报告为 `POTENTIALLY_BROKEN_DATA_PART` (Code 740) ，从而针对健康的数据分区触发严重告警误报的问题。这些瞬时故障现在会被视为可重试；而真正持续存在的故障会以普通 Azure 错误的形式报告，不再被误报为损坏的数据分区。[#112871](https://github.com/ClickHouse/ClickHouse/pull/112871) ([arsenmuk](https://github.com/arsenmuk))。
* 修复了在带前缀端点的 Azure Blob 存储磁盘上，`listObjects` 从第二页起每页都返回错误 blob 名称的问题，原因是分页绕过了负责去除端点前缀的客户端包装器。现在分页会通过续传令牌重新进入该包装器，确保每一页的 blob 名称均正确。[#112872](https://github.com/ClickHouse/ClickHouse/pull/112872) ([arsenmuk](https://github.com/arsenmuk))。
* 修复了当数据分区由不重写整个分区的变更生成时，基于 `_block_number` 和 `_block_offset` 的分区级 minmax 索引会在表重新加载后丢失的问题。[#112878](https://github.com/ClickHouse/ClickHouse/pull/112878) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了当变更谓词使用 `merge` 表函数且未显式指定数据库名称时引发异常的问题 (在发布构建中表现为导致服务器无法启动的错误) 。现在会使用被变更表所在的数据库，与表名的处理方式一致。[#113185](https://github.com/ClickHouse/ClickHouse/pull/113185) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在启用 `share_nested_offsets = 1` 的 `MergeTree` 表上，将删除后又重新添加的 `Nested` 成员的子列与同组中现存成员一同读取时，返回错误结果并触发 `LOGICAL_ERROR` 的问题。只要读取跨越多个块，现存成员就会返回来自后续块的值。[#113225](https://github.com/ClickHouse/ClickHouse/pull/113225) ([groeneai](https://github.com/groeneai))。
* 修复了在 debug 和 sanitizer 构建中，当 `max_streams_to_max_threads_ratio` 设置得非常大时读取 `Merge` 表出现的算术异常：流的数量被截断为 32 位，导致 `2^32` 的倍数变为零。此外，当 `Merge` 表的流数量相乘结果超出 `size_t` 时，现在会抛出 `PARAMETER_OUT_OF_BOUND`，而不再引发未定义行为；按数据量限制 `MergeTree` 流数量时不再发生溢出；聚合源数量超过 65536 的 `Merge` 表读取请求将被拒绝。[#113382](https://github.com/ClickHouse/ClickHouse/pull/113382) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了向 `hdfs` 磁盘写入失败的问题：写入会报错 `Parent directory doesn't exist`，原因是生成的对象键包含嵌套的目录前缀，而 HDFS 与 blob 存储不同，具有真实的目录，且在创建文件时不会自动创建缺失的父目录。[#113396](https://github.com/ClickHouse/ClickHouse/pull/113396) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了向 `remote`/`remoteSecure` 表函数或 `Remote`/`RemoteSecure` 表引擎传入不存在的命名集合并同时附带 `key = value` 覆盖参数时报错信息不正确的问题。此类调用会被静默地重新解析为位置参数调用，导致覆盖参数被当作数据表达式分析，报告的错误也与实际问题毫不相干 (例如对于 `remote(collection, database = merge(...))` 会报告 Function with name `merge` does not exist) 。现在会正确报告命名集合不存在。[#113510](https://github.com/ClickHouse/ClickHouse/pull/113510) ([groeneai](https://github.com/groeneai))。
* 修复了当 `merge_max_block_size_bytes` 设置得小于空列的 `byteSize()` 时，后台合并和 `OPTIMIZE` 陷入无限循环的问题。空的 `LowCardinality` 列仍带有字典，因此可能在合并任何一行之前就已达到字节上限；此后合并会无休止地生成空块，持续占满一个 CPU 核心，且始终不释放其后台池槽位。[#113585](https://github.com/ClickHouse/ClickHouse/pull/113585) ([groeneai](https://github.com/groeneai))。
* 修复了当表使用 `serialization_info_version = 'basic'` 时，对 Compact part 执行变更的结果会因该 part 的序列化信息仍在内存中还是已从 `serialization.json` 重新加载而有所不同的问题。在 `ReplicatedMergeTree` 上，这会导致持有字节完全相同的源 part 的两个副本写出不同的变更后 part，进而使变更因 `CHECKSUM_DOESNT_MATCH` 而失败。[#113588](https://github.com/ClickHouse/ClickHouse/pull/113588) ([groeneai](https://github.com/groeneai))。
* 当目标存储无法读取 .lock 文件时，备份现在会报告底层的锁文件访问错误，而不再误报存在并发备份。[#113637](https://github.com/ClickHouse/ClickHouse/pull/113637) ([kirillshokhin](https://github.com/kirillshokhin))。
* 修复了 `MergeTree` 表的后台任务 (统计信息刷新、parts 刷新、过期/意外 parts 加载) 与表销毁之间的数据竞争。[#113722](https://github.com/ClickHouse/ClickHouse/pull/113722) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了当被更新表所在的数据库与会话的数据库不同时，`UPDATE` 和轻量级删除读取错误表的问题。现在，变更的表达式会基于被更新表所在的数据库进行规范化，既包括隐式使用当前数据库的 `merge` 表函数，也包括未限定的表标识符。此前，这些名称会基于会话的数据库解析，导致语句在无任何提示的情况下更新或删除了从另一张表中选出的行。[#113748](https://github.com/ClickHouse/ClickHouse/pull/113748) ([groeneai](https://github.com/groeneai))。
* 修复了按主键范围 layer 读取 `MergeTree` 表时，若某个 layer 产生空 pipe 会抛出异常的问题。[#114177](https://github.com/ClickHouse/ClickHouse/pull/114177) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* `BACKUP`、`RESTORE` 和 `ENGINE = Backup` 现在会依据用户的 `SOURCES` 授权对备份位置进行鉴权，与 `s3()`、`file()` 和 `azureBlobStorage()` 的做法一致。此前，拥有 `BACKUP` 权限但没有 `SOURCES` 权限的用户可以向服务器可访问的任意位置写入备份，也可以从任意此类位置读取备份。现在，写入备份需要对目标端对应的数据源拥有 `WRITE` 权限 (`WRITE ON S3`、`WRITE ON AZURE`、`WRITE ON FILE`) ，读取备份则需要 `READ` 权限；`Disk(...)` 目标端仍仅受 `backups.allowed_disk` 限制。[#114405](https://github.com/ClickHouse/ClickHouse/pull/114405) ([groeneai](https://github.com/groeneai))。
* 修复了在变更执行期间读取表时的问题：`MATERIALIZED` 列可能返回过期的值，且与已更新的列一同查询时可能报错。[#114561](https://github.com/ClickHouse/ClickHouse/pull/114561) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了启用 `make_distributed_plan` 时，读取子表包含内部集合运算的 `Merge` 表会出现逻辑错误 (`Block structure mismatch`) 的问题。[#114753](https://github.com/ClickHouse/ClickHouse/pull/114753) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对于引擎未实现合并整理的对象存储表，`OPTIMIZE TABLE` 此前实际未执行任何操作，却报告成功。现在会抛出错误，与其他不支持该语句的引擎行为一致。此变更影响 `DeltaLake`、`Paimon`、`Hudi` 以及普通对象存储引擎 (`S3`、`GCS`、`COSN`、`OSS`、`AzureBlobStorage`、`HDFS` 以及基于对象存储的 `URL`) ；已实现合并整理的 `Iceberg` 不受影响。[#114805](https://github.com/ClickHouse/ClickHouse/pull/114805) ([groeneai](https://github.com/groeneai))。
* 修复了在启用 `allow_deprecated_syntax_for_merge_tree` 时，使用已弃用的位置参数语法创建的 `ReplicatedMergeTree` 表出现 `BAD_DATA_PART_NAME` ("Trying to get part name in new format for old format version") 的问题。此前，变更可能在尚未应用它的副本上被报告为已完成，且表在重启后可能一直处于只读状态。[#114980](https://github.com/ClickHouse/ClickHouse/pull/114980) ([groeneai](https://github.com/groeneai))。
* 修复了使用轻量级更新的表上出现 `Found patch part ... that intersects mutation with version ...` (`LOGICAL_ERROR`) 的问题。合并补丁分区片段时，可能生成一个数据版本范围跨越某个现有分区片段数据版本的补丁；该补丁既无法应用也无法跳过，导致该分区上后续所有操作均失败，复制队列也随之停滞。现在不会再分配此类合并任务。[#115064](https://github.com/ClickHouse/ClickHouse/pull/115064) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `Backup` 数据库引擎引用的备份变得不可用时 (例如其文件已被删除或底层存储无法访问) ，服务器无法启动的问题。现在该数据库会以不含任何表的形式加载，而不会导致整个服务器无法启动。[#83188](https://github.com/ClickHouse/ClickHouse/pull/83188) ([orloffv](https://github.com/orloffv))。
* 修复了磁盘写满错误后日志无法恢复的问题。此前，日志磁盘写满时，ClickHouse 会进入失败状态，并持续向 syslog 刷屏写入错误消息 (可能高达每小时 100 GB 以上) ，即使磁盘空间释放后也无法恢复。现在，一旦磁盘空间可用，日志系统即会自动恢复，无需重启服务器。[#93127](https://github.com/ClickHouse/ClickHouse/pull/93127) ([jaehanbyun](https://github.com/jaehanbyun))。
* 修复了 DeltaLake 存储中 schema visitor 导致崩溃的问题。[#97112](https://github.com/ClickHouse/ClickHouse/pull/97112) ([kssenii](https://github.com/kssenii))。

<h3 id="data-lake-and-external-storage-fixes">
  数据湖与外部存储相关修复
</h3>

* 修复了 S3 分段上传 (例如 `INSERT INTO ... hits_s3`) 时偶发的 `Code: 499 ... InvalidPart` (`S3_ERROR`) 失败问题。MinIO 在执行 `CompleteMultipartUpload` 时，可能会短暂地将刚上传的分片报告为缺失；现在该错误会与已处理的 `NoSuchKey` 一样进行重试，重试次数上限由 `s3_max_unexpected_write_error_retries` 控制。[#109364](https://github.com/ClickHouse/ClickHouse/pull/109364) ([groeneai](https://github.com/groeneai))。
* 对于数据文件格式不是 `Parquet` 的 Iceberg 表，`ALTER TABLE ... DELETE` 和 `ALTER TABLE ... UPDATE` 现在会直接被拒绝并返回明确的 `NOT_IMPLEMENTED` 错误，而不再导致服务器崩溃或静默损坏表。[#105893](https://github.com/ClickHouse/ClickHouse/pull/105893) ([groeneai](https://github.com/groeneai))。
* 修复了从 `file`、`s3` 或 `input` 等表函数执行 `INSERT SELECT` 时，若多次选择同一源列，会报错 `Cannot add column ...: column with this name already exists` 的问题。[#105982](https://github.com/ClickHouse/ClickHouse/pull/105982) ([crakjie](https://github.com/crakjie))。
* 通过 HTTP 查询字符串参数传递的敏感值 (例如 `param_secret_key`/`param_aws_secret_access_key` 等 `param_*` 查询参数绑定、`password` 参数或 S3 风格的 `signature` 参数) 不再以明文形式写入 `system.text_log` 或 OpenTelemetry span。`Request URI` 日志行现在会对名称疑似敏感的参数值进行脱敏，将其替换为 `[HIDDEN]`。[#108475](https://github.com/ClickHouse/ClickHouse/pull/108475) ([groeneai](https://github.com/groeneai))。
* 修复了 `S3Queue` 和 `AzureQueue` 表引擎的 `_etag` 虚拟列问题：该列虽已声明，但从未被填充，导致 `SELECT _etag` 始终返回空字符串。现在它会返回对象的 ETag，行为与 `S3` 引擎和 `s3()` 表函数一致。[#108625](https://github.com/ClickHouse/ClickHouse/pull/108625) ([groeneai](https://github.com/groeneai))。
* 读写 S3 的查询如果在 S3 请求尚未完成时被取消 (例如通过 `KILL QUERY`) ，现在会正确报告为已取消，而不再报告具有误导性的网络/S3 错误。具体而言，向 S3 执行的备份或恢复操作被取消时，`system.backups` 中现在会显示 `BACKUP_CANCELLED`/`RESTORE_CANCELLED`。[#108673](https://github.com/ClickHouse/ClickHouse/pull/108673) ([jkartseva](https://github.com/jkartseva))。
* 修复了 `S3Queue` 表引擎的 `_tags` 虚拟列问题：该列虽已声明，但从未被填充，导致 `SELECT _tags` 始终返回空 map。现在它会返回对象标签，行为与 `S3` 引擎和 `s3()` 表函数一致。[#108676](https://github.com/ClickHouse/ClickHouse/pull/108676) ([groeneai](https://github.com/groeneai))。
* 修复了在数据湖目录数据库中，SHOW TABLES 与 SELECT ... FROM system.tables 返回结果不一致的问题：ClickHouse 无法读取的表现在会在两者中统一隐藏。[#109273](https://github.com/ClickHouse/ClickHouse/pull/109273) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni))。
* 修复了向 Delta Lake 表 (`DeltaLakeLocal` / `deltaLake`) 执行 `INSERT` 时，如果在 sink 已开始写入后发生失败 (例如源查询在插入过程中抛出异常，或查询被取消) ，会导致服务器中止 (在发布构建中则会导致数据文件被静默地遗留为未完成状态) 的问题。[#109328](https://github.com/ClickHouse/ClickHouse/pull/109328) ([groeneai](https://github.com/groeneai))。
* 修复了在 `optimize_functions_to_subcolumns=1` (默认值) 时，对经过 schema 演进、在旧数据文件写入之后才新增的 Iceberg 列执行 `WHERE col IS NULL` / `IS NOT NULL`，会报错 `Not found column or subcolumn c.null in block` (在 debug/sanitizer 构建中则报错 `Bad cast from ColumnConst to ColumnNullable`) 的问题。[#109515](https://github.com/ClickHouse/ClickHouse/pull/109515) ([groeneai](https://github.com/groeneai))。
* 修复在 `CREATE TABLE ... AS SELECT` 查询中，将标量子查询用作 `s3` 表函数的 URL 参数 (或任何其他表函数的参数) 时出现的 `Host is empty in S3 URI` 错误：表函数参数中的标量子查询现在会在查询分析阶段求值。[#110254](https://github.com/ClickHouse/ClickHouse/pull/110254) ([CheSema](https://github.com/CheSema))。
* 修复在 Iceberg 表上执行多命令 `ALTER` (例如 `UPDATE ..., DELETE ...`) 时出现的逻辑错误 (在 debug/sanitizer 构建中会导致服务器中止) 。此类变更现在会被拒绝，并返回明确的 `NOT_IMPLEMENTED` 错误。[#110347](https://github.com/ClickHouse/ClickHouse/pull/110347) ([groeneai](https://github.com/groeneai))。
* 修复当初始 schema 包含嵌套字段 (`Tuple`/`Array`/`Map`) 时，Iceberg 表在执行 `ALTER TABLE ... ADD COLUMN` 后产生重复字段 ID 的问题。`last-column-id` 现在会记录包括嵌套子字段在内的最大已分配字段 ID，因此后续添加的列不会再复用嵌套字段的 ID，读取时也不会再因 `ICEBERG_SPECIFICATION_VIOLATION` (`Duplicate field id`) 而失败。[#110884](https://github.com/ClickHouse/ClickHouse/pull/110884) ([groeneai](https://github.com/groeneai))。
* 修复当 Iceberg 表同时包含在 `ALTER TABLE ... ADD COLUMN` 之前和之后写入的数据文件，且启用了 `optimize_move_to_prewhere` 时，对该表执行 `DELETE`/`UPDATE` 会静默删除错误的行 (或抛出 `NOT_FOUND_COLUMN_IN_BLOCK`) 的问题。[#111693](https://github.com/ClickHouse/ClickHouse/pull/111693) ([groeneai](https://github.com/groeneai))。
* 修复在 Iceberg 表上执行 `ALTER TABLE ... EXECUTE expire_snapshots` 后，`system.iceberg_history` 中被保留快照的 `made_current_at` 变为 `1970-01-01` 的问题。同时修复当表的元数据中没有 `snapshot-log` 时，`system.iceberg_history` 不返回任何行的问题。[#111781](https://github.com/ClickHouse/ClickHouse/pull/111781) ([groeneai](https://github.com/groeneai))。
* 修复通过 `MATERIALIZED VIEW` 向 Iceberg 表插入数据时出现的数据损坏问题。此前数据文件是按照目标表在 `CREATE` 时的列类型写入的，而非其当前实际的 Iceberg schema，导致 `DateTime` 值被存储为裸 Avro `int`，读回时又被解释为微秒；若使用 `DateTime64(0)` 或 `DateTime64(9)`，文件则完全无法读回。因此，当目标表的 Iceberg schema 比视图声明的列更宽时，`INSERT INTO <materialized view>` 现在会抛出 `TYPE_MISMATCH`，而不会写入损坏的行。[#112359](https://github.com/ClickHouse/ClickHouse/pull/112359) ([groeneai](https://github.com/groeneai))。
* 修复写入 schema 中包含嵌套元组 (元组内嵌元组) 的 Iceberg 表时出现的问题。此前发布的表元数据会将内层元组的字段名替换为位置名称 `1`、`2`……，导致使用默认的 `Parquet` 格式时 `INSERT` 因 `INCORRECT_DATA` 而失败，使用 `Avro` 时则无法读回该列。[#112480](https://github.com/ClickHouse/ClickHouse/pull/112480) ([groeneai](https://github.com/groeneai))。
* 修复两个查询同时解析同一表名时，导致 `Filesystem` 或 `HDFS` 数据库永久卡死的死锁问题。此前该数据库上的所有后续查询都会无限期阻塞且无法中断，只能重启服务器才能恢复。[#112495](https://github.com/ClickHouse/ClickHouse/pull/112495) ([groeneai](https://github.com/groeneai))。
* 修复当 `WHERE` 谓词中 `NOT` 之下含有 delta-kernel 谓词转换器无法处理的子表达式时，`DeltaLake` 表返回行数过少的问题。此类子表达式现在会作为显式的未知谓词报告给 delta-kernel，而不再被当作子迭代器的结束，此前后者会导致外层合取式被静默截断。[#112652](https://github.com/ClickHouse/ClickHouse/pull/112652) ([groeneai](https://github.com/groeneai))。
* 修复了 `ALTER TABLE ... EXECUTE remove_orphan_files` 会删除 Iceberg 表中仍在使用的 `metadata/version-hint.text` 的问题。该文件的可达集合条目是通过字符串拼接构建的，拼接时假定某个值以斜杠结尾，但该值实际上从不带斜杠，因此真正的 hint 文件始终不会被识别为可达文件，一旦早于 `older_than` 阈值就会被删除。若设置了 `iceberg_use_version_hint = 1`，该表随后将完全无法读取。[#113548](https://github.com/ClickHouse/ClickHouse/pull/113548) ([groeneai](https://github.com/groeneai))。
* 修复了对经 `ALTER TABLE ... MODIFY COLUMN` 变为 `Nullable` 的 Iceberg 列进行筛选时出现 `LOGICAL_ERROR` 的问题。[#114521](https://github.com/ClickHouse/ClickHouse/pull/114521) ([groeneai](https://github.com/groeneai))。
* 修复了带有 `ENGINE = URL(...)` 定义的 `ATTACH TABLE` 未检查 URL 协议所分派到的引擎的 `TABLE ENGINE` 授权的问题。此前，仅持有 `TABLE ENGINE ON URL` 权限的用户可以附加并读取基于 `File`、`S3`、`AzureBlobStorage` 或 `HDFS` 的表，而 `CREATE TABLE` 会正确拒绝此类操作。[#115914](https://github.com/ClickHouse/ClickHouse/pull/115914) ([groeneai](https://github.com/groeneai))。
* 修复了在同时公布 IPv4 和 IPv6 地址、但仅有一种地址族可路由的主机上，出站 HTTP 请求 (例如 \`aiGenerate\`、\`url\` 表函数、S3) 因 \`No route to host\` 而失败的问题。现在，当第一个解析地址因网络错误失败时，HTTP 连接池会回退到下一个解析地址，而不是在首次请求时就直接抛出错误。[#103786](https://github.com/ClickHouse/ClickHouse/pull/103786) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 支持将由双字段 `{key, value}` 记录组成的 Avro `array` 读取到 ClickHouse 的 `Map` 列中。Iceberg 和 Spark 对键为非字符串类型的 `MAP<K, V>` 正是采用这种编码 (Avro 原生 map 仅支持字符串键) 。此前此类文件只能按 `Array(Tuple(key, value))` 读取，按 `Map(K, V)` 读取则会报错 `Type Map(...) is not compatible with Avro array`。[#109289](https://github.com/ClickHouse/ClickHouse/pull/109289) ([groeneai](https://github.com/groeneai))。
* 修复了当元数据文件的版本号全为数字但超出 32 位整数范围 (例如 `v99999999999999999999.metadata.json`) 时读取 Iceberg 表出错的问题。此前此类文件名会引发含义不明的 `std::out_of_range` (`STD_EXCEPTION`) ，而不是清晰的 `BAD_ARGUMENTS` 错误。[#109619](https://github.com/ClickHouse/ClickHouse/pull/109619) ([groeneai](https://github.com/groeneai))。
* 修复了经 gzip 压缩的 Iceberg 元数据文件的文件名问题。ClickHouse 此前将其写为 `v{N}.gzip.metadata.json` (沿用了 HTTP `Content-Encoding` 标记) ，而 Iceberg 规范要求使用 `gz` 扩展名，即 `v{N}.gz.metadata.json`。这导致 Spark 及其他 Hadoop-catalog 读取器无法找到 ClickHouse 写入的元数据。现在 ClickHouse 会写入 `v{N}.gz.metadata.json`，同时为保持向后兼容，仍支持读取旧的 `gzip` 文件名。[#109812](https://github.com/ClickHouse/ClickHouse/pull/109812) ([groeneai](https://github.com/groeneai))。
* 修复了写入格式为 `Avro` 的 Iceberg 表会将声明为 `"required": false` 且类型为 `list`、`map` 或 `struct` 的字段序列化为必需字段 (不带 `["null", T]` union) 的问题。该问题导致数据文件自身的 schema 与表元数据不一致，其他 Iceberg 读取器会将其视为必需字段。现在此类字段会按照 Iceberg 规范中可选字段所用的 `["null", T]` union 形式写入。[#112648](https://github.com/ClickHouse/ClickHouse/pull/112648) ([groeneai](https://github.com/groeneai))。
* 修复了当 Iceberg `snapshot-log` 中同一 `snapshot-id` 出现多次时 (回滚后会出现这种情况) ，`system.iceberg_history` 中的 `made_current_at` 报告的是快照最早成为当前快照的时间、而非最近一次时间的问题。[#113598](https://github.com/ClickHouse/ClickHouse/pull/113598) ([groeneai](https://github.com/groeneai))。
* 修复了当命名集合设置 `http_client = 'gcp_oauth'`，且 Google OAuth2 令牌端点接受连接但始终不响应时，`BACKUP`/`RESTORE ... TO S3`、GCS 磁盘以及 `s3` 表函数可能挂起长达一小时的问题。Bearer 令牌请求不再沿用调用方的数据传输请求超时设置，其响应等待时间上限为 10 秒，与 STS `AssumeRole` 请求的上限保持一致。[#115531](https://github.com/ClickHouse/ClickHouse/pull/115531) ([groeneai](https://github.com/groeneai))。
* 修复了文件系统缓存中的一个逻辑错误 (`Expected file ... not to exist`) ：当后台缓存下载因非 `ErrnoException` 的异常而失败时 (例如对 Iceberg 表执行 `OPTIMIZE` 期间) ，会遗留一个空的孤立缓存文件，进而触发该错误。[#110549](https://github.com/ClickHouse/ClickHouse/pull/110549) ([groeneai](https://github.com/groeneai))。
* 修复了按最大条目数配置的缓存 (`SLRU` 策略) 在达到该数量的条目均被访问至少两次后，会静默停止接纳新条目的问题。受影响的缓存包括 Iceberg 和 Paimon 元数据文件缓存、Parquet 元数据缓存、文本索引缓存、向量相似度索引缓存、已编译表达式缓存以及 ObjectStorageQueue 文件状态缓存。[#115517](https://github.com/ClickHouse/ClickHouse/pull/115517) ([groeneai](https://github.com/groeneai))。
* 修复了可变的 `snapshot/LATEST` 提示被并发替换时，读取 Paimon 表可能失败的问题。现在，无效或过期的提示会安全地回退为列出快照。[#112010](https://github.com/ClickHouse/ClickHouse/pull/112010) ([JiaQiTang98](https://github.com/JiaQiTang98))。
* 当输入缓冲区 (例如设置了 `restricted_seek = true` 的 S3 读取缓冲区) 拒绝 minizip 请求的寻道或读取操作、导致 zip 归档无法解包时，现在会显示真实的底层异常。此前，实际错误会被笼统的 `Couldn't unpack zip archive: Code = -100` / `Couldn't open zip archive` 消息所掩盖。[#105103](https://github.com/ClickHouse/ClickHouse/pull/105103) ([groeneai](https://github.com/groeneai))。
* 修复了元数据不含 refs 时的 Iceberg 写入问题 [#106896](https://github.com/ClickHouse/ClickHouse/pull/106896) ([AVMusorin](https://github.com/AVMusorin))。
* 修复了向 Iceberg 表插入数据时抛出异常的问题：该表的元数据由 external engine 创建，且省略了可选的 `snapshots`、`metadata-log` 或 `snapshot-log` 数组。现在此类插入可以成功执行，不再失败。[#107473](https://github.com/ClickHouse/ClickHouse/pull/107473) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了向 S3 上传数据 (例如备份) 时，若因瞬时读取错误而重试，可能出现 `ReadBuffer is canceled. Can't read from it.` 错误的问题。[#108573](https://github.com/ClickHouse/ClickHouse/pull/108573) ([groeneai](https://github.com/groeneai))。
* 修复了调度最终的异步 S3/Azure 分段上传完成任务失败时 (例如线程池耗尽) ，可能出现 `std::future_error` ("The associated promise has been destructed prior to the associated state becoming ready") ，并在 debug/sanitizer 构建中导致服务器中止的问题。现在会报告真实的调度错误。[#108730](https://github.com/ClickHouse/ClickHouse/pull/108730) ([groeneai](https://github.com/groeneai))。
* 修复了将约 2262 年之后的 ORC 时间戳读取到标度小于 9 的 `DateTime64` 列时出错的问题。原生 ORC 读取器以前会先将所有时间戳统一转换为固定的 `DateTime64(9)` 中间类型，而在纳秒标度下这会导致 `Int64` 溢出，并以 `VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE` 拒绝此类值，即便所请求的 `DateTime64` 标度 (例如 Iceberg 生成的 `DateTime64(6)`) 完全能够表示该值。现在时间戳会直接按所请求的标度读取；若目标标度仍无法容纳该值，则遵循 `date_time_overflow_behavior` 设置。[#109302](https://github.com/ClickHouse/ClickHouse/pull/109302) ([groeneai](https://github.com/groeneai))。
* 读取 schema 中包含不受支持的嵌套类型 (例如 `ROW` 字段) 的 Paimon 表时，现在会报告明确的 `BAD_ARGUMENTS` 错误并指明具体的不受支持类型，而不再返回错误码为 0 且不带任何消息的 `DB::Exception. (OK)`。[#109762](https://github.com/ClickHouse/ClickHouse/pull/109762) ([groeneai](https://github.com/groeneai))。
* 修复了无法读取基于同一源列多次分区的 Iceberg 表 (例如 `PARTITIONED BY (hours(ts), ts)`) 的问题。此前读取此类表会报错 `Cannot add column ...: column with this name already exists (ILLEGAL_COLUMN)`。[#109895](https://github.com/ClickHouse/ClickHouse/pull/109895) ([groeneai](https://github.com/groeneai))。
* ClickHouse 写入 Iceberg 表的 Avro 和 ORC 格式数据文件现在会嵌入 Iceberg 字段 ID (Avro 使用 `field-id`，ORC 使用 `iceberg.id`/`iceberg.required` 类型属性) ，且 ORC 的 `String` 列会以 ORC `string` 而非 binary 类型写入。此前只有 Parquet 会嵌入字段 ID，因此符合规范的读取器 (例如 Spark/iceberg-java) 在列重命名后读取 ClickHouse 写入的 Avro 行时会静默返回 NULL，而 ClickHouse 写入的 ORC 文件则根本无法读取。[#109994](https://github.com/ClickHouse/ClickHouse/pull/109994) ([groeneai](https://github.com/groeneai))。
* 修复了当 Iceberg 表中存在比所有位置删除文件都新的非 Parquet 格式 (例如 `ORC`) 数据文件时，对其执行 `OPTIMIZE TABLE` 会出现逻辑错误 `ChunkInfoRowNumbers does not exist` 的问题。[#110107](https://github.com/ClickHouse/ClickHouse/pull/110107) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了通过 `s3` 和 `file` 从未压缩的 `STORED` zip 条目中读取大型 `Parquet` 文件时出错的问题。[#110495](https://github.com/ClickHouse/ClickHouse/pull/110495) ([Gudauu](https://github.com/Gudauu))。
* 后台调度池 (例如全局线程池耗尽时的 `iceberg` 池) 启动失败不再导致服务器中止，该错误现在会作为可恢复的异常抛出。此外，读取 `system.background_schedule_pool` 时也不会再顺带创建这些池。[#111209](https://github.com/ClickHouse/ClickHouse/pull/111209) ([groeneai](https://github.com/groeneai))。
* 修复了 Paimon REST 目录中的 DLF 身份验证问题：请求签名仅计算一次并被反复复用，导致首个请求之后的所有目录请求均因 HTTP 401 失败，SHOW TABLES 也只返回空列表。同时修复了表存在性检查中的 HTTP 404 检测问题。[#112015](https://github.com/ClickHouse/ClickHouse/pull/112015) ([JiaQiTang98](https://github.com/JiaQiTang98))。
* 修复了对因位置删除而被清空的 `Iceberg` 数据块进行分区时出现 `LOGICAL_ERROR` (`partitions_count > 0`) 的问题，例如在压缩包含已被完全删除数据文件的分区 `Iceberg` 表时。[#112432](https://github.com/ClickHouse/ClickHouse/pull/112432) ([PedroTadim](https://github.com/PedroTadim))。
* 修复了 Azure 批量删除对象时，若批次请求本身失败，`system.blob_storage_log` 中不会记录任何 Delete 事件，导致整个批次都没有日志的问题。现在发生批次级失败时，会为每个对象各记录一条 Delete 事件。[#112873](https://github.com/ClickHouse/ClickHouse/pull/112873) ([arsenmuk](https://github.com/arsenmuk))。
* 修复了读取按 precision 高于毫秒的 `TIMESTAMP` 列分区的 `Paimon` 表时失败并报错 `scale 6 is not supported, only support scale <= 3` 的问题。[#113401](https://github.com/ClickHouse/ClickHouse/pull/113401) ([JiaQiTang98](https://github.com/JiaQiTang98))。
* 修复了读取数据湖表时，若其 schema 中声明了名称为空的列则会导致崩溃的问题。格式错误的 Iceberg 元数据会被拒绝并报错 `ICEBERG_SPECIFICATION_VIOLATION`；由 catalog、Delta Lake 或 Paimon 提供的 schema 会被拒绝并报错 `AMBIGUOUS_COLUMN_NAME`。该检查无条件执行，因此即使某个 Iceberg 表只是保留了一个未使用且包含空字段名的历史 schema，该表也会变为不可读，而不是在读取到该 schema 时中止。[#114394](https://github.com/ClickHouse/ClickHouse/pull/114394) ([groeneai](https://github.com/groeneai))。
* 读取 Iceberg 表时，若其元数据描述了 Iceberg 规范所禁止的 schema 演进，不再导致服务器中止。`IcebergSchemaProcessor` 中的四种违反规范的情况此前会被报告为 `LOGICAL_ERROR` (被视为断言失败) ，或在未经检查的情况下触发致命断言；现在会抛出 `ICEBERG_SPECIFICATION_VIOLATION`。[#114518](https://github.com/ClickHouse/ClickHouse/pull/114518) ([groeneai](https://github.com/groeneai))。
* 修复了在基于 musl 的构建中，`url`/`urlCluster` 表函数的 `_time` 虚拟列始终为 `NULL` 的问题，其原因是对 HTTP `Last-Modified` 头的解析方式不可移植。[#111619](https://github.com/ClickHouse/ClickHouse/pull/111619) ([thevar1able](https://github.com/thevar1able))。
* 修复了在启用 `allow_experimental_url_wildcard_from_index_pages` 的情况下使用 `CREATE TABLE ... AS url('http://host/**/', ...)` 创建表后，服务器无法启动的问题。加载此类表的元数据时会重新执行实验性功能检查，并因 `SUPPORT_IS_DISABLED` 失败，导致启动中止。[#115095](https://github.com/ClickHouse/ClickHouse/pull/115095) ([groeneai](https://github.com/groeneai))。
* `URL` 数据库引擎的表不再向没有读取源授权的用户泄露本地文件是否存在：仅需 `SHOW TABLES` 特权的 `EXISTS TABLE` 以及表的解析过程，都不再在授权确认之前探测文件系统。[#113029](https://github.com/ClickHouse/ClickHouse/pull/113029) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 将 `query_masking_rules` 应用于通过 `Exception::addMessage` 追加的消息，确保在配置了脱敏规则时，`jdbc()`/`odbc()` 错误信息中 `(in file/uri ...)` 后缀里经过 URL 编码的凭证不会泄露。[#106916](https://github.com/ClickHouse/ClickHouse/pull/106916) ([gaurav0107](https://github.com/gaurav0107))。

<h3 id="formats-and-ingestion-fixes">
  格式与摄取相关修复
</h3>

* 对 Arrow `time32`/`time64` 进行无 schema 读取 (例如 `SELECT * FROM file(..., 'Arrow')`) 时，现在会推断为 `Time64`，而不再是此前的 `DateTime64`。任何依赖旧推断类型的下游逻辑在升级后都将失效。此外，还新增了将 `Time`/`Time64` 导出到 Arrow 的支持，并会根据精度选择相应的 Apache Arrow 时间类型。[#104316](https://github.com/ClickHouse/ClickHouse/pull/104316) ([Maoyao233](https://github.com/Maoyao233))。
* 修复了在启用延迟列复制 (`enable_lazy_columns_replication`) 时，若 `INSERT` 因批处理中途出错而回滚 (例如在 `Buffer` 表、异步插入或 `Kafka`/`RabbitMQ`/`FileLog` 引擎中) ，可能导致结果错误或越界读取的问题。[#108935](https://github.com/ClickHouse/ClickHouse/pull/108935) ([groeneai](https://github.com/groeneai))。
* 修复了一个解析器不一致问题：`INSERT` 列列表可以接受以 `t.* LIKE '<pattern>'` / `t.* ILIKE '<pattern>'` 形式编写的限定列匹配器，却拒绝其规范形式 `t.COLUMNS('<regexp>')`，导致查询格式化无法往返一致 (在 debug/sanitizer 构建中还会导致服务器中止) 。[#109176](https://github.com/ClickHouse/ClickHouse/pull/109176) ([groeneai](https://github.com/groeneai))。
* 修复了向 Microsoft Fabric / OneLake `DataLakeCatalog` 表执行 `INSERT` 时报 `IncorrectEndpointError` (HTTP 400) 错误的问题：现在 ADLS Gen2 (DFS) 写入会路由到 `.dfs` 端点主机，而不是 `.blob` 主机。注意：使用 `remote_url_allow_hosts` 时，必须将 `.blob` (读取) 和 `.dfs` (写入) 两个 Fabric 主机都加入允许列表，才能执行 `INSERT`。[#110290](https://github.com/ClickHouse/ClickHouse/pull/110290) ([zlareb1](https://github.com/zlareb1))。
* 修复了通过数据湖表函数写入 (例如 `INSERT INTO FUNCTION icebergS3(...)`) 时，生成的 Parquet 文件中字符串列丢失 `String` 类型注解，导致 Spark 等外部读取器无法读取写入数据的问题。此类写入现在与通过表引擎写入时使用相同的格式设置。[#110465](https://github.com/ClickHouse/ClickHouse/pull/110465) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了通过 Arrow Flight 登录后 `system.session_log` 无法读取的问题：`interface` 列为 `Enum8` 类型，但其枚举定义中缺少 `ArrowFlight` 值，因此通过 Arrow Flight 协议登录时会写入原始值 `10`，任何读取此类行的 `SELECT` 都会抛出异常 `Unexpected value 10 in enum`。[#110758](https://github.com/ClickHouse/ClickHouse/pull/110758) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `TSV` 系列格式的 schema 推断问题：带前导零的小数值 (如 `0.0` 或 `0.5`) 会被推断为 `String`，而 `CSV` 能正确推断为 `Float64`。此外，若首行均为此类值，还会被 `TSV` 的表头自动检测误判为表头，从而在结果中丢失。同时修复了 `TSKV` 对使用转义序列书写的值 (如 `x=1\x2E5`) 推断出数值类型、随后却解析失败的问题。对于前导零属于整数填充的值 (如 `007`) ，仍会推断为 `String`，因为 `TSV` 值解析器无法将其读回。[#112226](https://github.com/ClickHouse/ClickHouse/pull/112226) ([groeneai](https://github.com/groeneai))。
* 修复了 schema 推断会为值解析器无法读回的文本值推断出数值类型的问题。此前推断会接受悬空的指数 (`1e+`) 、缺失的尾数 (`.`) 或重复的符号 (`++inf`) ，而 `readFloatTextPrecise` 在按推断出的 schema 读取时会以 `CANNOT_PARSE_NUMBER` 拒绝这些值；对于 `Dynamic` 列，则会在 INSERT 时报错。现在推断会使用读取器实际所用的解析器来校验数值。此修复还消除了推断类型受 `max_read_buffer_size` 影响的情况，并使 `0e5` 等有效的前导零指数形式在 TSV 中也能像在 CSV 中一样被推断为 `Float64`。同时还修复了格式错误的指数形式。[#112453](https://github.com/ClickHouse/ClickHouse/pull/112453) ([groeneai](https://github.com/groeneai))。
* 修复了基于行的输入格式在解析单个块时，`KILL QUERY` 和 `max_execution_time` 可能长达数分钟不生效的问题。现在基于行的输入格式每 8192 行检查一次查询是否已取消，因此被终止的插入操作 (尤其是后台异步插入刷新，每个块最多解析 `max_insert_block_size` 行) 会及时停止，而不会一直运行到块末尾。[#112646](https://github.com/ClickHouse/ClickHouse/pull/112646) ([groeneai](https://github.com/groeneai))。
* 修复了对于 schema 已缓存的数据源，推断出的列类型取决于先前查询顺序的问题。会影响推断类型的设置未纳入 schema 推断缓存键，导致首个查询的设置值决定了后续所有查询看到的类型：`input_format_try_infer_exponent_floats`、`max_parser_depth`、`input_format_json_infer_array_of_dynamic_from_array_of_different_types`，以及针对 `Parquet` 的 `input_format_parquet_local_time_as_utc`、`input_format_parquet_allow_geoparquet_parser`、`input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference` 和 `schema_inference_make_json_columns_nullable`。此外还为 `Form` 注册了缺失的缓存键获取器，并使 `Template` 的获取器使用其自身行格式的转义规则。[#113533](https://github.com/ClickHouse/ClickHouse/pull/113533) ([groeneai](https://github.com/groeneai))。
* 修复了当外层查询末尾带有 `SETTINGS` 子句时，`view` 和 `viewIfPermitted` 表函数的子查询参数格式化错误的问题。此类查询会被格式化为 `view((SELECT ...))`，而该形式无法被重新解析，导致查询无法通过内部的“格式化-解析-格式化”检查，并抛出 `Inconsistent AST formatting`。[#114658](https://github.com/ClickHouse/ClickHouse/pull/114658) ([groeneai](https://github.com/groeneai))。
* 修复了格式自动检测时 JSON 数据被误识别为 TSKV 的问题。[#106009](https://github.com/ClickHouse/ClickHouse/pull/106009) ([Avogar](https://github.com/Avogar))。
* 现在将超出一天内有效时间范围 (负值或 `>= 24h`) 的 `Time`/`Time64` 值导出为 `Arrow` 格式时，会直接报出明确的错误，而不再写入无效的 Arrow `time32`/`time64` 数据。[#107179](https://github.com/ClickHouse/ClickHouse/pull/107179) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了读取 `Arrow`、`ArrowStream` 以及基于 Arrow 的 `ORC` 文件时，若时间戳列的时区为固定数值 UTC 偏移 (例如 `+05:30`、`-08:00`、`00:00`) 或非 IANA 标记 `fixed`，会报 `Cannot load time zone ...` (`BAD_ARGUMENTS`) 错误而失败的问题。[#108633](https://github.com/ClickHouse/ClickHouse/pull/108633) ([groeneai](https://github.com/groeneai))。
* 现在 `Nullable(Tuple(...))` 列会序列化为单个 CSV 字段，而不再展开为多个独立的列。此前非空值会被写成多个 CSV 字段，而 `NULL` 只是单个 `\N`，导致列数因行而异，破坏了 `CSVWithNames`/`CSVWithNamesAndTypes` 的表头以及数据的往返读写。[#108959](https://github.com/ClickHouse/ClickHouse/pull/108959) ([groeneai](https://github.com/groeneai))。
* 修复了对 `MsgPack` 格式进行 schema 推断时内存分配过多的问题：对于已损坏或经模糊测试生成的输入，即使其 array/map/string/binary 头部声明了极大的元素数量，也不会再触发单次数 GB 的内存分配 (此类输入现在会作为格式错误的输入被拒绝) 。此修复解决了在 sanitizer 下出现的 `allocation-size-too-big` 中止问题，以及发布构建中的内存不足问题。[#109019](https://github.com/ClickHouse/ClickHouse/pull/109019) ([groeneai](https://github.com/groeneai))。
* 修复了在设置 `output_format_arrow_low_cardinality_as_dictionary = 1` 时，将 `LowCardinality(Time)` 列写入 `Arrow` 格式会触发 `LOGICAL_ERROR` 的问题。[#109730](https://github.com/ClickHouse/ClickHouse/pull/109730) ([groeneai](https://github.com/groeneai))。
* 修复了读取已损坏的 `Native` 格式数据流时的问题：当其中的 `Dynamic` 类型数量或 `JSON`/`Object` 路径数量接近 `SIZE_MAX` 时，此类格式错误的输入现在会被拒绝并报出明确的 `INCORRECT_DATA` 错误，而不再抛出未捕获的 `std::length_error`。[#110590](https://github.com/ClickHouse/ClickHouse/pull/110590) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了合并以旧版 (版本 0) 状态格式序列化、且包含 `Bool` 值的 `sumMap`/`sumMapWithOverflow`/`sumMapFiltered` 聚合状态时出现 `LOGICAL_ERROR: Cannot sum Bools` (在 debug/sanitizer 构建中会导致服务器中止) 的问题。此修复还纠正了版本 0 `Bool` 状态下两种静默返回错误结果的情况：`Bool` 类型的 map 键未在各状态之间去重，以及零值压缩时删除了错误的条目。[#110922](https://github.com/ClickHouse/ClickHouse/pull/110922) ([groeneai](https://github.com/groeneai))。
* 修复了当输入数据解析结果为零行时 (例如空 JSON，或不含任何要素的 GeoJSON `FeatureCollection`) ，`format` 表函数抛出 `NOT_FOUND_COLUMN_IN_BLOCK` 的问题。现在会返回列结构正确的空结果。[#111428](https://github.com/ClickHouse/ClickHouse/pull/111428) ([groeneai](https://github.com/groeneai))。
* 现在可以读取这样的 GeoParquet、Arrow 和 ArrowStream 文件：其 WKT 编码的几何列使用了非大写的类型关键字 (`point(1 2)`) 或空容器 (`LINESTRING EMPTY`、`POLYGON()`、`POLYGON(())`) 。此前，尽管相同的字符串可以用 `readWKT` 函数正常解析，此类文件在导入时仍会因 `BAD_ARGUMENTS` 或 `CANNOT_PARSE_NUMBER` 而失败。此修复还解决了无法回读存储空几何对象 `wkt` 输出 (即 `LINESTRING()`) 的文件的问题。[#112020](https://github.com/ClickHouse/ClickHouse/pull/112020) ([groeneai](https://github.com/groeneai))。
* 修复了 `auto` 和 `none` 压缩提示在非全小写书写时抛出 `Unknown compression method` 的问题，例如 `file('data.csv.gz', 'CSV', 'x String', 'AUTO')`。`GZIP` 等编解码器名称此前就已支持不区分大小写；现在这两个特殊提示也与之保持一致。[#113631](https://github.com/ClickHouse/ClickHouse/pull/113631) ([groeneai](https://github.com/groeneai))。
* 修复了在 `CustomSeparated`、`Regexp` 和 `Template` 格式中使用 `CSV` 转义规则时，读取第一个元素为 `NULL` 的 `Tuple` 列出错的问题。在这些格式中，裸 `Tuple` 的每个元素各占一个字段，因此开头的 `\N` 字段对应的是该元素，而非整列。此前它会被当作整列读取，导致其余元素字段错位到后续列中，使 `CustomSeparated` 无法回读自身的输出。[#114471](https://github.com/ClickHouse/ClickHouse/pull/114471) ([groeneai](https://github.com/groeneai))。
* 修复了 `Regexp` 输入格式会静默丢弃匹配字段中未解析的剩余部分的问题，该问题会导致存储被截断或凭空生成的值，而不是报告错误：在 `JSON` 规则下，将 `v=-1` 读入 `UInt64` 会得到 `0`，将 `v=2020-01-01junk` 读入 `Date` 会得到 `1975-07-14`。现在，在 `Escaped`、`CSV` 和 `JSON` 规则下，格式错误的字段会被拒绝，与文档中这些规则所对应格式的行为保持一致。在 `Raw` 规则下，包含制表符的匹配字段现在会被完整读取，而不会在制表符处被截断。[#114520](https://github.com/ClickHouse/ClickHouse/pull/114520) ([groeneai](https://github.com/groeneai))。
* 修复了 `CREATE INDEX` / `CREATE HYPOTHETICAL INDEX` 表达式无法通过“格式化-解析-格式化”往返校验时触发的 `Inconsistent AST formatting` 逻辑错误 (在 debug 和 sanitizer 构建版本中会导致服务器中止) ，例如 `CREATE HYPOTHETICAL INDEX i0 ON t0 ((a())) TYPE a` 和 `CREATE INDEX i0 ON t0 ((a, b).1) TYPE minmax`。[#109175](https://github.com/ClickHouse/ClickHouse/pull/109175) ([groeneai](https://github.com/groeneai))。
* 修复了 Parquet v3 读取器中的一个逻辑错误 (`Logical error: 'KeyCondition uses PREWHERE output'`) ，该错误会在格式级键条件引用了未从 Parquet 文件中读取的列时出现。[#109267](https://github.com/ClickHouse/ClickHouse/pull/109267) ([groeneai](https://github.com/groeneai))。
* 修复了预定义 HTTP handler 在缺少请求头时抛出异常的问题 [#108324](https://github.com/ClickHouse/ClickHouse/pull/108324) ([vitlibar](https://github.com/vitlibar))。
* 修复了基于行的输入格式 (例如 `TSV`/`CSV`) 解析输入失败、且底层读取已被取消时 (例如 HTTP 分块格式错误或请求体被截断) 可能出现的 `Logical error: 'ReadBuffer is canceled. Can't read from it.'` 问题。现在生成详细的解析诊断信息时，不再从已取消的缓冲区中读取。[#109708](https://github.com/ClickHouse/ClickHouse/pull/109708) ([groeneai](https://github.com/groeneai))。
* 当流式解析成功回退到 SQL 表达式解析时，`Values` 格式不再在 `system.errors` 和 `system.error_log` 中记录解析错误。[#111141](https://github.com/ClickHouse/ClickHouse/pull/111141) ([pamarcos](https://github.com/pamarcos))。
* 修复了在已停止的 `RabbitMQ` 表上执行 `SYSTEM REFRESH` 时，有时无法消费积压消息的问题。一次 REFRESH 只允许执行一个额外的 (不按常规调度的) 流式处理周期，但由于 AMQP 投递循环才刚以异步方式启动，该周期可能立即返回零行，白白耗掉这唯一一次机会，导致消息直到下一次 `SYSTEM START` 前都无法被消费。[#111480](https://github.com/ClickHouse/ClickHouse/pull/111480) ([groeneai](https://github.com/groeneai))。
* 修复了设置了 `nats_stream` 的 `NATS` 表在 NATS 服务器重启后静默停止消费消息的问题。现在 `JetStream` 订阅会自动重新建立，无需再执行 `DETACH TABLE` 和 `ATTACH TABLE`。[#112828](https://github.com/ClickHouse/ClickHouse/pull/112828) ([groeneai](https://github.com/groeneai))。
* 对于过大的 `kafka_num_consumers` 值，现在会直接拒绝并给出明确的错误信息，而不是在 `Kafka` 表引擎内部出现内存分配失败。此前，在启用 `kafka_disable_num_consumers_limit` 时，此类值会引发 `std::length_error` 异常。[#114764](https://github.com/ClickHouse/ClickHouse/pull/114764) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* Arrow Flight server：现在接受不带填充的 Base64 编码 `Basic` 身份验证凭证 (基于 Go 的 Flight 客户端，例如 ADBC Flight SQL 驱动程序，会发送此类凭证) ；当 `authorization` 请求头格式错误时，会返回正确的身份验证错误，而不是笼统的 `Unexpected error in RPC handling`。[#115085](https://github.com/ClickHouse/ClickHouse/pull/115085) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* Arrow Flight 服务器：拒绝缺少用户名/密码分隔符的格式错误的 Basic 身份验证凭证。[#115347](https://github.com/ClickHouse/ClickHouse/pull/115347) ([alexey-milovidov](https://github.com/alexey-milovidov))。

<h3 id="data-type-function-and-serialization-fixes">
  数据类型、函数与序列化相关修复
</h3>

* 修复了逻辑错误 `Stream <col>.variant_discr ... is not found` (在 debug 和 sanitizer 构建中会导致服务器中止) ：在包含 Wide parts 的表上，当 `ALTER TABLE ... MODIFY COLUMN` 将某列更改为带有动态子列的类型 (例如将 `Variant` 改为 `Dynamic`) ，且随后读取或合并该 part 时，会出现此问题。[#110204](https://github.com/ClickHouse/ClickHouse/pull/110204) ([groeneai](https://github.com/groeneai))。
* 修复了读取 `Nullable(Tuple(...))` 列的子列时的问题：当该列的元素为非 Nullable 的 `LowCardinality(T)`，且同一查询还读取了其父级子列时会触发该问题。在 Compact part 上，父级子列会返回错误的值，或查询失败并报错 `Unexpected return type from assumeNotNull`，或服务器因 `string_view` 加固断言而被终止。原因在于提取出的子列被反序列化到 `LowCardinality(Nullable(T))` 缓冲区中，而该缓冲区的子流随后又被父级子列的读取所共享。[#112232](https://github.com/ClickHouse/ClickHouse/pull/112232) ([groeneai](https://github.com/groeneai))。
* 修复了 `LOGICAL_ERROR` "Not-ready Set is passed as the second argument for function `globalNullIn`" 以及查询真实错误信息丢失的问题：当基于统计信息的 part 裁剪在索引分析期间推测性地执行 `IN`/`GLOBAL IN` 子查询，而该子查询执行失败时，可能会出现此问题。[#114121](https://github.com/ClickHouse/ClickHouse/pull/114121) ([groeneai](https://github.com/groeneai))。
* 修复了读取使用 `Quantized('product', ...)` 编解码器的列的 `product_quantization_codebook` 子列时出现 `Cannot read all data of type FixedString` 的问题。每个 part 的码本写在所有粒度的数据之后，因此不以标记划分边界；若读取的标记范围在该 part 的最后一个标记之前结束，码本可能读取不完整。[#112818](https://github.com/ClickHouse/ClickHouse/pull/112818) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对于 `Dynamic` 列中的 `Map` 值，不再写入 `Map` 布局与自身元数据不一致的 part。此前，仅 `map_serialization_version` 不同的表会共享同一个缓存的序列化对象，导致某个 part 可能采用 `basic` Map 布局，而其元数据却声明为 `with_buckets`，之后读取时便会失败并报错 `LOGICAL_ERROR: Stream ...buckets_info ... is not found`。早期版本已按此方式写入的 part 仍无法读取，只能将其删除。[#113514](https://github.com/ClickHouse/ClickHouse/pull/113514) ([groeneai](https://github.com/groeneai))。
* 修复了 `ALP`、`FPC` 和 `GCD` 计算编解码器哈希时遗漏由类型推导出的参数的问题。在 Compact part 中，写入器会让编解码器哈希相同的列共享同一个压缩流，因此使用同一编解码器但值宽度不同的两列会发生冲突，共用一个宽度错误的编解码器对象。宽度不一致时，合法的插入会因 `CANNOT_COMPRESS` 被拒绝；即使未报错，其中一列的压缩效果也会比预期更差。[#114189](https://github.com/ClickHouse/ClickHouse/pull/114189) ([groeneai](https://github.com/groeneai))。
* 修复了错误的索引裁剪问题：当表的 sorting key 用 `toDateTime` 包装 `Date` 列 (例如 `ORDER BY toDateTime(date_column)`) ，且查询以类似 `WHERE date_column >= '...'` 的比较条件对原始列进行过滤时会出现该问题。对于超出 `DateTime` 范围 (`2106-02-07` 之后) 的 `Date` 值，`toDateTime(Date)` 会溢出，因此存储的键并非单调；由于对这种键/谓词组合使用主键裁剪可能会丢弃包含匹配行的粒度，ClickHouse 将不再对其使用主键裁剪。[#101814](https://github.com/ClickHouse/ClickHouse/pull/101814) ([nihalzp](https://github.com/nihalzp))。
* 修复了将带有 `DEFAULT` 的 `Nullable` 列转换为其他类型 (例如 `Nullable(UInt8)` → `String`、`LowCardinality(String)` 或 `Array(UInt8)`) 时 `ALTER MODIFY COLUMN` 执行失败的问题。[#102156](https://github.com/ClickHouse/ClickHouse/pull/102156) ([il9ue](https://github.com/il9ue))。
* 修复了 `StorageSQLite` 和 `sqlite()` 表函数在将 `WHERE` 谓词下推到 SQLite 时 SQL 字面量转义不正确的问题：单引号和控制字符 (`\n`、`\r`、`\t`、`\`) 会被转义为反斜杠形式，而 SQLite 并不识别这种转义，从而导致语法错误或错误的查询结果。同时修复了下推到 PostgreSQL 的字符串字面量的转义问题：嵌套在 `IN` 列表中的字符串仍沿用 ClickHouse 的转义方式，且控制字符以反斜杠序列形式发送，而 PostgreSQL 会将其解析为不同的字节。[#104217](https://github.com/ClickHouse/ClickHouse/pull/104217) ([tiandiwonder](https://github.com/tiandiwonder)) 。
* 修复了在启用 `query_plan_convert_join_to_in` 且 SELECT 引用源数组列时，`INNER JOIN ... ON arrayJoin(...) = ...` 查询抛出 `NOT_FOUND_COLUMN_IN_BLOCK` 异常的问题。[#104809](https://github.com/ClickHouse/ClickHouse/pull/104809) ([tiandiwonder](https://github.com/tiandiwonder)) 。
* 修复了右侧操作数为非常量且引用当前行中列的 IN 和 NOT IN 表达式的问题，并使新 analyzer 对右侧 tuple 的处理与 ClickHouse 现有的 IN 语义保持一致。在旧 analyzer 下，作为右侧操作数的单独源列 (`x IN (arr)`) 仍会被解析为表名，且不在作用域内。[#104993](https://github.com/ClickHouse/ClickHouse/pull/104993) ([niyue](https://github.com/niyue)) 。
* 修复了在 `DirectKeyValueJoin` 使用 `String` 或 `Nullable(String)` 键时，对 `EmbeddedRocksDB`、`Redis` 和 `KeeperMap` 表执行 `JOIN` 可能静默返回零行的问题。[#105253](https://github.com/ClickHouse/ClickHouse/pull/105253) ([vdimir](https://github.com/vdimir)) 。
* 修复了当非等值 `JOIN ... ON` 谓词引用 `Nothing` 类型的列 (例如由 `ARRAY JOIN []` 生成的列) 时出现的 `LOGICAL_ERROR` ("Unexpected expression in JOIN ON section. Expected boolean (UInt8), got 'Nothing'") 。[#106981](https://github.com/ClickHouse/ClickHouse/pull/106981) ([groeneai](https://github.com/groeneai)) 。
* 修复了一个 `Inconsistent AST formatting` 逻辑错误：当带别名的 lambda 位于表达式列表的非首位，并被用作访问运算符 (`.N` tuple 元素或 `[]` 数组元素) 的操作数时，可能导致 debug 和 sanitizer 构建中的服务器异常终止，例如 `SELECT 1, ((p0, p1) -> p0 AS a7).4[3] FROM t`。[#107092](https://github.com/ClickHouse/ClickHouse/pull/107092) ([groeneai](https://github.com/groeneai)) 。
* 嵌套在另一个分布式查询中的 cluster 表函数 (`urlCluster`、`fileCluster`、`s3Cluster` 等) ，例如 `clusterAllReplicas(..., urlCluster(...))`，现在会直接以 `BAD_ARGUMENTS` 错误被拒绝，而不再因逻辑错误 (`Distributed task iterator is not initialized`) 而失败。[#107107](https://github.com/ClickHouse/ClickHouse/pull/107107) ([groeneai](https://github.com/groeneai)) 。
* 修复了 `values` 表函数在使用无法被窄浮点列精确表示的十进制字面量 (例如用于 `Float32` 列的 `0.1`) 时报 `ARGUMENT_OUT_OF_BOUND` 错误的问题，例如 `SELECT * FROM values('x Float32', 0.1)`。现在此类值会被接受并转换为最接近的可表示值，与 `CAST` 和 `INSERT ... VALUES` 的行为一致。[#108055](https://github.com/ClickHouse/ClickHouse/pull/108055) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 修复了 `mapFilter`、`mapSort` (及其变体) 和 `mapConcat` 会丢失 `Map` 键和值类型中 `LowCardinality` 的问题。此前，对 `Map(LowCardinality(String), String)` 列执行 `mapFilter` 会返回 `Map(String, String)`，这可能损坏通过 `CREATE TABLE ... AS SELECT` 创建的表的元数据，并导致 `CHECK TABLE` 失败。[#108057](https://github.com/ClickHouse/ClickHouse/pull/108057) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 修复了被取消或被 `KILL` 的 `INSERT` 在构建跳数索引 (例如在高基数列上的无上限 `set(0)` 索引) 时仍会长时间运行的问题。现在查询被取消后，索引构建会立即停止。[#108351](https://github.com/ClickHouse/ClickHouse/pull/108351) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了对 `primes` 表函数执行 `SELECT` 时无法响应取消操作的问题：当 `step` (或 `limit`) 较大时，查询在 `KILL QUERY` 或超时后仍可能长时间运行。现在查询会立即停止。[#108353](https://github.com/ClickHouse/ClickHouse/pull/108353) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了名称中包含子串 `INT` 的数据类型名称 (例如在数据类型位置使用的类函数名称 `quantileInterpolatedWeighted`) 的解析问题。此类名称会被误识别为 MySQL 整数类型，其第一组 `(...)` 参数会被悄无声息地当作显示宽度修饰符吞掉，从而可能导致查询格式化无法正确往返还原。[#108354](https://github.com/ClickHouse/ClickHouse/pull/108354) ([groeneai](https://github.com/groeneai))。
* 修复了一处不一致问题：格式错误的 `ARRAY JOIN` 后接逗号和带括号的表列表时，会被误解析为交叉连接，而不是直接报错拒绝。[#108365](https://github.com/ClickHouse/ClickHouse/pull/108365) ([Algunenano](https://github.com/Algunenano))。
* 修复了分布式查询在对结构相同的重复 `ALIAS` 列进行去重的同时，又引用了带有 `key = value` 命名集合参数的表函数 (例如 `oss(s3_conn, filename = '...')`) 时抛出的 `LOGICAL_ERROR` ("Invalid action query tree node ...") 异常。[#108435](https://github.com/ClickHouse/ClickHouse/pull/108435) ([groeneai](https://github.com/groeneai))。
* 修复了在分布式表上调用带有多个 `LowCardinality` 参数的函数时可能出现的逻辑错误 (在发布构建中表现为异常，在调试和 sanitizer 构建中会导致服务器中止) ，例如将 `concatAssumeInjective((SELECT toLowCardinality('p')), s)` 与 `remote()` 配合用作 `GROUP BY` 键。相应的错误消息为 `Default functions implementation for LowCardinality is supported only with a single LowCardinality argument` 或 `Expected the argument ... to have N rows, but it has M`。[#108871](https://github.com/ClickHouse/ClickHouse/pull/108871) ([groeneai](https://github.com/groeneai))。
* 修复了在服务器端解释的 `DateTime`/`DateTime64` 字符串字面量 (异步 `INSERT`、`SELECT` 字面量) 会忽略 `use_client_time_zone` 的问题。现在启用 `use_client_time_zone` 时，客户端会将本地时区作为 `session_timezone` 传递给服务器，使服务器端解析结果与同步 `INSERT` 路径保持一致。[#109051](https://github.com/ClickHouse/ClickHouse/pull/109051) ([groeneai](https://github.com/groeneai))。
* 修复了 `max_execution_time` (配合 `timeout_overflow_mode = 'throw'`) 有时始终无法取消查询的问题：当内部超时监视器正在等待一个截止时间较晚的查询时，随后注册的截止时间较早的查询可能被完全遗漏，导致其运行时间远远超出时间限制。[#109792](https://github.com/ClickHouse/ClickHouse/pull/109792) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了在启用分析器时，对 `Distributed` 表的查询同时使用 `ORDER BY` 和变为 `Nullable` 的 `_shard_num` (或 `shardNum()`)  (例如在 `join_use_nulls = 1` 的 `FULL JOIN` 中) 时出现的 `NOT_FOUND_COLUMN_IN_BLOCK` 错误。[#109798](https://github.com/ClickHouse/ClickHouse/pull/109798) ([groeneai](https://github.com/groeneai))。
* 修复了启用 `enable_join_runtime_filters = 1` (自 26.2 起默认开启) 时，若构建端连接键为包含 NULL 的 `LowCardinality(Nullable(...))`，且运行时过滤器回退为布隆过滤器，连接可能抛出 `NOT_IMPLEMENTED` 错误 ("Method getDataAt is not supported for Nullable(String)") 的问题。[#109824](https://github.com/ClickHouse/ClickHouse/pull/109824) ([groeneai](https://github.com/groeneai))。
* 修复了在高阶函数需要具体值的位置传入 lambda 表达式时导致服务器崩溃的问题 (例如作为 `arrayFold` 的累加器，如 `arrayFold(lambda, arr, another_lambda)`) 。当 `enable_analyzer = 0` 时，此类查询现在会被拒绝并返回 `ILLEGAL_TYPE_OF_ARGUMENT`，而不再导致崩溃。[#109840](https://github.com/ClickHouse/ClickHouse/pull/109840) ([groeneai](https://github.com/groeneai))。
* 禁止在行策略过滤器中使用 `arrayJoin` 的别名 `unnest`，从而修补了此类策略可能在读取时引发 `column->size() == num_rows` 逻辑错误的漏洞。[#109973](https://github.com/ClickHouse/ClickHouse/pull/109973) ([Algunenano](https://github.com/Algunenano))。
* 修复了当同一查询中同时读取完整元组 (例如 `SELECT *`) 时，若通过 `tupleElement(t, 'name')`、`tupleElement(t, N)` 或 `t.N` 访问字段，定义在 `Tuple` 子列上的跳过索引不会生效的问题。现在这些访问形式都会与按名称访问子列 `t.name` 一样裁剪颗粒。[#110056](https://github.com/ClickHouse/ClickHouse/pull/110056) ([groeneai](https://github.com/groeneai))。
* 修复了当 `Array(String)` 列带有 `text`、`tokenbf_v1` 或 `ngrambf_v1` 跳过索引时，将该列与数组字面量进行比较 (`arr = ['x']`) 会出现 `BAD_GET` 错误的问题。现在索引会将此类比较视为全量扫描，而不会导致整个查询失败。[#110057](https://github.com/ClickHouse/ClickHouse/pull/110057) ([groeneai](https://github.com/groeneai))。
* 修复了在应用阶段列已存在时，`ALTER TABLE ... ADD COLUMN IF NOT EXISTS` 误报 `ILLEGAL_COLUMN` 错误的问题。该问题出现在同一语句中使用 `IF NOT EXISTS` 重复添加同一列，或在准备阶段与应用阶段之间有并发的 `ALTER` 添加了该列的情况下。[#110080](https://github.com/ClickHouse/ClickHouse/pull/110080) ([groeneai](https://github.com/groeneai))。
* 修复了当 `identity()` (或标量子查询结果) 包装了含嵌套 `LowCardinality` 的值，且查询使用 `WITH TOTALS`/`WITH ROLLUP` 时出现的 `LOGICAL_ERROR` (`Bad cast from type ColumnLowCardinality to ColumnString`) 。[#110138](https://github.com/ClickHouse/ClickHouse/pull/110138) ([groeneai](https://github.com/groeneai))。
* 修复了对元组表达式使用 `GROUP BY ALL` 并同时使用 `ORDER BY` 时出现的 `NOT_FOUND_COLUMN_IN_BLOCK` 错误。[#110206](https://github.com/ClickHouse/ClickHouse/pull/110206) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了当表的 `CHECK` 约束引用了子列 (例如 `Nullable` 列的 `x.null` 或 `Array` 的 `arr.size0`) 时，向该表执行 `INSERT` 出现 `NOT_FOUND_COLUMN_IN_BLOCK` 错误的问题。[#110208](https://github.com/ClickHouse/ClickHouse/pull/110208) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 optimize\_and\_compare\_chain 优化 (默认启用) 导致查询结果错误的问题：当比较链中混用了具有特定成对转换规则的类型 (例如 Enum 与 String、Decimal 与 Float64、不同宽度的 FixedString) 时，由 a \< b AND b \< c 通过传递性推导出的条件可能采用与原始条件不同的比较语义。现在仅在共享同一比较顺序的类型组内推导传递条件。[#110621](https://github.com/ClickHouse/ClickHouse/pull/110621) ([yariks5s](https://github.com/yariks5s))。
* 修复了 `optimize_injective_functions_in_group_by` 会改变 `GROUP BY GROUPING SETS` 和 `GROUP BY ... WITH TOTALS` 查询结果的问题。文档中说明该设置不会改变查询结果，但消除分组键上的单射函数后，对于聚合集合中不包含该键的行 (即该键不属于某个 `GROUPING SETS` 集合) 或 `WITH TOTALS` 行，会产生错误的值 (或丢失一行) 。该错误值可能恰好与某个真实的键值相同，导致同一结果集中的超聚合行与真实分组无法区分。[#110721](https://github.com/ClickHouse/ClickHouse/pull/110721) ([groeneai](https://github.com/groeneai)).
* 修复了将 `median`/`quantile` (基于 ReservoirSampler) 聚合函数状态与极大的整数常量相乘 (例如 `medianState(x) * 18446744073709551615`) 时服务器挂起的问题。此前该查询无法被取消，并可能无限期运行下去。[#110779](https://github.com/ClickHouse/ClickHouse/pull/110779) ([groeneai](https://github.com/groeneai)).
* 修复了对 `JSON` 参数调用 `getSubcolumn` 并传入内部类型提示子列名 (即以反引号类型标记开头的名称) 时发生崩溃 (查询分析期间空指针解引用) 的问题。[#110940](https://github.com/ClickHouse/ClickHouse/pull/110940) ([groeneai](https://github.com/groeneai)).
* 修复了 `map[key]` 返回靠后的重复键的值、而非第一个键的值的问题。当 `Map` 列包含重复键时，`map[key]` 的结果可能取决于同一块中位于其前面的行以及 `optimize_functions_to_subcolumns` 设置，导致针对同一行的 `SELECT` 与 `WHERE` 结果不一致。[#111246](https://github.com/ClickHouse/ClickHouse/pull/111246) ([groeneai](https://github.com/groeneai)).
* 修复了在 `use_variant_default_implementation_for_comparisons = 0` 时，若 `AND` 链将某列与非 `Nullable` 类型的 NULL 值常量 (例如值为 NULL 的 `Variant`) 进行比较，逻辑表达式优化器会抛出逻辑错误 `!rhs_literal->getValue().isNull()` 的问题。[#111292](https://github.com/ClickHouse/ClickHouse/pull/111292) ([groeneai](https://github.com/groeneai)).
* 修复了当查询使用 `set` 跳数索引，且谓词形如 `(x AND <null-value>) OR y`、其中 NULL 由函数产生 (例如 `toInt64OrNull('x')`、`nullIf(1, 1)`、`CAST(NULL AS Nullable(Int64))`) 时返回错误结果的问题。此类值会被 `__bitWrapperFunc` 包装并传播 `NULL`，而不是“未知”掩码，导致 set 索引可能裁剪掉实际匹配的颗粒，使查询返回的行数少于预期。[#111604](https://github.com/ClickHouse/ClickHouse/pull/111604) ([groeneai](https://github.com/groeneai)).
* 修复了启用 analyzer 时，`CREATE TABLE`/`ALTER TABLE` 会接受引用虚拟列 (如 `_table` 或 `_database`) 的列 `DEFAULT`/`MATERIALIZED` 表达式的问题。向此类表插入数据会失败并报 `NOT_FOUND_COLUMN_IN_BLOCK` 错误，而 `MATERIALIZED` 列 (无法显式提供值) 更会导致该表永远无法插入数据。现在这些表达式会在定义时即被拒绝，与未启用 analyzer 时的行为保持一致。基于虚拟列的 `ALIAS` 列 (读取时计算) 和 `EPHEMERAL` 列 (不存储的插入输入) 仍可正常使用。[#111776](https://github.com/ClickHouse/ClickHouse/pull/111776) ([groeneai](https://github.com/groeneai)).
* 修复了调用参数化视图时，若传入类型为 `Array`、`Tuple` 或 `LowCardinality` 的子查询参数 (例如 `SELECT * FROM v(param = (SELECT groupArray(x) FROM t))`) ，会报 `UNKNOWN_QUERY_PARAMETER` 错误的问题。[#111790](https://github.com/ClickHouse/ClickHouse/pull/111790) ([groeneai](https://github.com/groeneai)).
* 修复了 analyzer 中将比较链改写为 `IN`/`NOT IN` 的三个缺陷 (`x = c1 OR x = c2 OR ...`、`x != c1 AND x != c2 AND ...` 以及 `has(const_array, x)`) 。对于 `use_variant_default_implementation_for_comparisons = 0` 时的 `Variant` 表达式，该改写会将表达式的结果类型从 `UInt8` 变为 `Nullable(UInt8)`，导致在 debug 和 sanitizer 构建中由查询树校验检查抛出 `LOGICAL_ERROR`。对于具有动态结构的表达式 (`Dynamic`、`Array(Dynamic)`、`JSON`) ，该改写会使原本正常的查询失败，并报错 `Illegal type ... of argument of function in`，因为 `IN` 不接受此类参数。此外，当常量无法无损转换为表达式的类型时 (例如将带有具体时间的 `DateTime` 常量与 `Date` 列进行比较) ，两个方向的改写都会返回错误结果。[#111924](https://github.com/ClickHouse/ClickHouse/pull/111924) ([groeneai](https://github.com/groeneai))。
* 修复了当查询使用并行副本、分布式表或外部聚合，或者状态存储在表中 (包括存储在 `Dynamic` 值内部) 时，`quantileDeterministic`、`quantilesDeterministic` 和 `medianDeterministic` 对相同数据每次运行都返回不同结果的问题。此版本之前以无版本号类型写法写入的状态仍保持原有行为，因为其布局无法更改。[#112052](https://github.com/ClickHouse/ClickHouse/pull/112052) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了向量搜索查询污染查询条件缓存而导致结果错误的问题。对带有 `vector_similarity` 索引的表执行 `SELECT ... WHERE <condition> ORDER BY <distance function> LIMIT n` 查询时，可能会将某些 granule 错误地记录为不匹配 `<condition>`，导致之后在同一张表上执行普通的 `SELECT ... WHERE <condition>` 时静默返回较少的行。现在，向量搜索的读取操作不再写入查询条件缓存。[#112086](https://github.com/ClickHouse/ClickHouse/pull/112086) ([groeneai](https://github.com/groeneai))。
* 修复了 `serialize_string_in_memory_with_zero_byte` 在序列化的查询计划中丢失的问题。当 `serialize_query_plan = 1` 时，禁用该设置的集群可能会在发起节点与执行反序列化计划的节点之间出现内存中字符串表示形式不一致的情况。原因是该设置在反序列化时会被读取，但在序列化时从未被写入，因此在执行节点上始终取其默认值。[#112131](https://github.com/ClickHouse/ClickHouse/pull/112131) ([groeneai](https://github.com/groeneai))。
* 修复了 `ON` 表达式包含常量合取项的 `JOIN` 返回错误结果的问题，例如 `ON l.id = r.id AND CAST(NULL AS Nullable(UInt8))`。该常量会在查询计划优化过程中被静默丢弃，导致连接在执行时如同该常量不存在：对于永远不为真的条件，`INNER`、`LEFT SEMI` 和 `RIGHT SEMI` 连接本应不返回任何行，却返回了匹配的行；而 `RIGHT ANTI` 本应返回所有行，却未返回任何行。[#112155](https://github.com/ClickHouse/ClickHouse/pull/112155) ([vdimir](https://github.com/vdimir))。
* 修复了使用非 `parameter = value` 赋值形式的参数调用参数化视图时返回错误结果的问题。在 `enable_analyzer = 0` 时，以及在默认设置下执行 `EXPLAIN SYNTAX` 时，诸如 `pv(concat(name, '!'))`、`pv(name, 'a')`、`pv(name != 'a')` 和 `pv(tuple(name = 'a'))` 之类的调用会将视图参数静默绑定到不相关的表达式上，而不是像 analyzer 那样报告 `UNKNOWN_QUERY_PARAMETER`。现在，此类调用在两种执行路径上都会以相同方式被拒绝。[#112194](https://github.com/ClickHouse/ClickHouse/pull/112194) ([groeneai](https://github.com/groeneai))。
* 修复了以下问题：当 `CREATE VIEW` 或 `CREATE FUNCTION` 的定义以 `substring` 语法无法重新解析的形式调用 `substr`、`mid` 或 `byteSlice` 时，该语句会被接受，但 ClickHouse 为其写入的元数据并不是有效的 SQL。此后读取该定义会因 `SYNTAX_ERROR` 而失败；在服务器启动时，还会导致元数据加载中止，使服务器完全无法启动。现在此类定义可以正确地往返转换，形如 `substring(x, a, b, c)` 的现有元数据文件也恢复可读，因此受影响的服务器无需人工干预即可启动。[#112195](https://github.com/ClickHouse/ClickHouse/pull/112195) ([groeneai](https://github.com/groeneai))。
* 修复了当主键为 `Array` 或 `Tuple`，且查询对其应用 `plus`、`minus`、`multiply`、`divide` 或 `intDiv` 时，出现错误结果、`ORDER BY` 输出顺序错误以及 `BAD_TYPE_OF_FIELD` 异常的问题。复合值的算术运算是逐元素进行的，而复合值的比较则按字典序进行，因此主键分析不再将此类表达式视为单调。[#112339](https://github.com/ClickHouse/ClickHouse/pull/112339) ([groeneai](https://github.com/groeneai))。
* 修复了包含 `PASTE JOIN` 的查询被发送到其他服务器时 (例如左表为 `Distributed` 表或 `*Cluster` 表函数) ，远程服务器抛出 `Code: 62 ... You must not specify ANY or ALL for PASTE JOIN. (SYNTAX_ERROR)` 的问题。原因是格式化器会输出 `ALL PASTE JOIN`，而解析器不接受这种写法，导致接收方服务器无法解析收到的查询。[#112404](https://github.com/ClickHouse/ClickHouse/pull/112404) ([groeneai](https://github.com/groeneai))。
* 修复了 `(SELECT 1) AS t(x)` 或 `WITH t(x) AS (SELECT 1)` 等列别名列表在 `view` 表函数内部不可见的问题：此前引用 `t.x` 会因 `UNKNOWN_IDENTIFIER` 而失败，而同样的写法在 `view` 之外却能正常工作。[#112690](https://github.com/ClickHouse/ClickHouse/pull/112690) ([groeneai](https://github.com/groeneai))。
* 修复了 `ARRAY JOIN` 子句不含任何表达式时查询格式化出现的逻辑错误。现在此类子句会在解析阶段以 `SYNTAX_ERROR` 被拒绝 (与空 `USING` 的处理方式一致) ，而不会再被接受并格式化为无法重新解析的文本。[#112699](https://github.com/ClickHouse/ClickHouse/pull/112699) ([groeneai](https://github.com/groeneai))。
* 修复了为子查询准备的表达式动作在其构建上下文被释放后才执行时，`connectionId` 抛出 `Context has expired` 的问题。[#112870](https://github.com/ClickHouse/ClickHouse/pull/112870) ([clickgapai](https://github.com/clickgapai))。
* 修复了在连接过程中求值的非等值 `JOIN ON` 条件包含 `arrayJoin` 时出现的逻辑错误和错误结果。现在 `hash`、`parallel_hash` 或 `grace_hash` 连接会以 `INVALID_JOIN_ON_EXPRESSION` 拒绝此类条件。如果展开操作仅依赖于某一侧，请在连接之前将其移至子查询中的 `ARRAY JOIN`；如果 `arrayJoin` 的参数同时读取了两侧的列，则需要重写该条件。[#112889](https://github.com/ClickHouse/ClickHouse/pull/112889) ([groeneai](https://github.com/groeneai))。
* 修复了 `geohashesInBox` 在面积为零的区域 (例如 `geohashesInBox(0., 0., 180., 0., 12)`) 上耗时无上限的问题。此类查询虽然能返回正确的单个 geohash，但每行会白白执行约 5e8 次空循环，且无视 `max_execution_time` 和 `KILL QUERY`。[#112976](https://github.com/ClickHouse/ClickHouse/pull/112976) ([groeneai](https://github.com/groeneai))。
* 当被标记为“无值写入”的 `SETTINGS` 变更携带了 `true` 以外的值时，现在会拒绝该变更；并且在格式化查询时，不再省略此类变更的值。此前，精心构造的 AST JSON 负载可以用 `false` 执行某个 `Bool` 设置，而 `system.query_log` 和 `formatQueryFromJSON` 中显示的却是无值形式。[#113025](https://github.com/ClickHouse/ClickHouse/pull/113025) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了当 `VIEW` 声明的列类型与其内部查询产生的类型不一致时，从该视图查询会报 `UNKNOWN_IDENTIFIER` 的问题，例如 `SELECT sum(length(arr)) FROM v`，其中 `v` 基于一个 `String` 列声明了 `arr Array(UInt8)`。在默认设置 `optimize_functions_to_subcolumns = 1` 下，优化器会将 `length(arr)` 重写为读取 `arr.size0` 子列，并将该名称传递给内部查询，而内部查询中并不存在该子列。[#113057](https://github.com/ClickHouse/ClickHouse/pull/113057) ([groeneai](https://github.com/groeneai))。
* 修复了 `postgresql` 表函数及 PostgreSQL 引擎读取操作的取消问题。若在读取仍处于启动阶段时取消，可能会在事务指针上产生竞争，且取消操作可能完全丢失，导致查询一直运行到 PostgreSQL 执行完毕。若取消请求在 `COPY` 语句开始执行之前就到达 PostgreSQL，仍有可能被丢弃。[#113150](https://github.com/ClickHouse/ClickHouse/pull/113150) ([groeneai](https://github.com/groeneai))。
* 修复了基于集群表函数 (`s3Cluster`、`urlCluster`、`fileCluster`) 的 `SQL SECURITY DEFINER` 或 `SQL SECURITY NONE` 视图作为二级查询被读取时 (例如通过 `remote` 或 `clusterAllReplicas`) 出现的 `LOGICAL_ERROR` (`Next task callback is not set for query`) 。现在这种不受支持的嵌套会以普通查询错误的形式被拒绝，而不会在 debug 和 sanitizer 构建中导致服务器中止。[#113371](https://github.com/ClickHouse/ClickHouse/pull/113371) ([groeneai](https://github.com/groeneai))。
* 修复了在 `analyzer_compatibility_join_using_top_level_identifier = 1` 时，将带有 `view(...)` 参数的 remote 系列表函数用于 `JOIN ... USING` (其键为 `SELECT` 列表别名) 左侧时出现的逻辑错误 `IDENTIFIER is not a table expression`。[#113400](https://github.com/ClickHouse/ClickHouse/pull/113400) ([groeneai](https://github.com/groeneai))。
* 修复了查询在 `indexHint` 中使用子查询对 `system.databases` 的 `name` 列进行过滤时出现的 `Not-ready Set is passed as the second argument for function 'in'` 错误，例如 `SELECT count() FROM system.databases WHERE indexHint(name IN (SELECT 'foo'))`。此前，此类查询在 release 构建中会因 `LOGICAL_ERROR` 被拒绝，在 debug 和 sanitizer 构建中则会导致服务器中止。[#113556](https://github.com/ClickHouse/ClickHouse/pull/113556) ([groeneai](https://github.com/groeneai))。
* 修复了针对 `Variant` 列的查询会忽略 `max_execution_time` 和 `KILL QUERY` 的问题。调用带有多个 `Variant` 参数的函数时，会针对每个参数的每个备选类型分别解析一次函数，而执行这项工作的两个循环均未检查取消状态，因此此类查询在执行完毕之前无法被终止。[#113612](https://github.com/ClickHouse/ClickHouse/pull/113612) ([groeneai](https://github.com/groeneai))。
* 修复了当同一条语句既将 `ALIAS` 列转换为物理列 (`DEFAULT` 或 `MATERIALIZED`) 又指定 `CODEC` 时，`ALTER TABLE ... MODIFY COLUMN` 失败并报错 `Cannot specify codec for column type ALIAS` 的问题。[#113853](https://github.com/ClickHouse/ClickHouse/pull/113853) ([groeneai](https://github.com/groeneai))。
* 修复了使用常量 `ON` 表达式与包含 `ARRAY JOIN` 的右侧进行连接时导致服务器崩溃的问题。原因是读取延迟复制的右侧列时使用了已被释放的 `ColumnReplicated`。[#113901](https://github.com/ClickHouse/ClickHouse/pull/113901) ([groeneai](https://github.com/groeneai))。
* 修复了在 `optimize_aggregation_in_order = 1` 时，若表的 sorting key 是 `GROUP BY` 键的严格前缀，且使用了状态持有堆内存的聚合函数 (例如 `quantileDD`) ，会出现内存泄漏的问题。此前每执行一次此类查询，服务器内存都会持续增长，直到重启为止。[#114010](https://github.com/ClickHouse/ClickHouse/pull/114010) ([groeneai](https://github.com/groeneai))。
* 修复了 `isProbablePrime` 在处理 `UInt128`/`UInt256` 时忽略 `max_execution_time` 和 `KILL QUERY` 的问题。此前，一个宽数值数据块会在单次函数调用中一直运行到结束，中间没有任何取消检查点，导致查询在超过截止时间后仍可能持续运行数分钟。[#114032](https://github.com/ClickHouse/ClickHouse/pull/114032) ([groeneai](https://github.com/groeneai))。
* 修复了当 `PREWHERE` 子句包含 `IN (subquery)` 谓词，且设置了 `rewrite_in_to_join = 1` (或会强制启用该设置的 `make_distributed_plan = 1`) 时，抛出 `Code: 46. DB::Exception: Unknown function exists. (UNKNOWN_FUNCTION)` 的问题。而改用 `WHERE` 编写的相同查询此前即可正常运行。[#114067](https://github.com/ClickHouse/ClickHouse/pull/114067) ([RohithPariki](https://github.com/RohithPariki))。
* 修复了当参数为元素类型是 `Nothing` 的非空数组时，`arrayAutocorrelation` 出现 `LOGICAL_ERROR` 的问题，例如 `SELECT arrayAutocorrelation([arrayMax([])])`。现在此类参数会被拒绝，并报 `ILLEGAL_COLUMN` 错误。空数组字面量 `[]` 仍返回 `[]`。[#114249](https://github.com/ClickHouse/ClickHouse/pull/114249) ([groeneai](https://github.com/groeneai))。
* `CREATE TABLE` 和 `ALTER TABLE` 现在会拒绝在 sorting key 所用的列上使用 `SZ3` 等有损编解码器。[#114531](https://github.com/ClickHouse/ClickHouse/pull/114531) ([groeneai](https://github.com/groeneai))。
* 修复了当时间间隔参数以秒计的跨度为 2^32 的倍数时 (例如 `toIntervalDay(2147483648)`) ，函数 `hop` 和 `windowID` 陷入无限循环且无法取消的问题：回绕后的减法结果绕过了时间溢出检查；而当参数为常量时，该循环会在分析阶段执行，此时查询甚至无法被终止。同样的时间间隔还可能导致 `WINDOW VIEW` 的后台线程无休止地空转；现在此类 window view 会在创建时被拒绝。[#114607](https://github.com/ClickHouse/ClickHouse/pull/114607) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了包含从远程集群读取数据的 `IN` 子查询的查询报出逻辑错误 `Not-ready Set is passed as the second argument for function 'in'` 的问题：现在该查询会返回子查询的实际错误，例如连接失败。[#114983](https://github.com/ClickHouse/ClickHouse/pull/114983) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了向 `Log`、`TinyLog` 或 `StripeLog` 表执行 `INSERT` 时，在提交已记录的文件大小阶段失败的问题。此前，此类插入即使已报错，其行仍可能保留在表中，或导致数组列的各个数据文件彼此不一致。现在，若读取的 `Log` 或 `TinyLog` 表中某数组列不含任何元素，而其偏移量却表明存在元素，系统会抛出指明该列名称的错误，而不再越过元素末尾继续读取。对于部分写入的元素列，此前就已会予以拒绝。[#115027](https://github.com/ClickHouse/ClickHouse/pull/115027) ([groeneai](https://github.com/groeneai))。
* 修复了包含 `Array(Map(...))` 类型常量 (例如 `has([map('k', 'v')], m)`) 的查询在 `Distributed` 表上执行或启用并行副本执行时，出现 `TYPE_MISMATCH` ("CAST AS Array can only be performed between same-dimensional array types") 错误的问题。[#115883](https://github.com/ClickHouse/ClickHouse/pull/115883) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了与视图或 `view()` 进行连接时结果错误的问题：当其投影列与其自身某个内部关系的列同名时会触发该问题，例如 `SELECT expr(x.c0) AS c0 FROM a AS x, b AS y`。连接顺序优化器会将此类表达式合并到展平后的连接图中，随后又将其应用了两次，导致查询在无任何提示的情况下返回有偏差的值。若该表达式还改变了列类型，同一原因则会在生成计划时引发 `AMBIGUOUS_COLUMN_NAME` 错误。[#116152](https://github.com/ClickHouse/ClickHouse/pull/116152) ([groeneai](https://github.com/groeneai))。
* 修复了在使用 ROLLUP/CUBE 且启用 `group_by_use_nulls` 时，外部列变为 `Nullable` 导致关联子查询抛出异常的问题。[#100365](https://github.com/ClickHouse/ClickHouse/pull/100365) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 在 `Replicated` 数据库上拒绝 `max_replication_lag_to_enqueue = 0`。该值会使恢复后的未同步检查恒为真，并在 debug 和 sanitizer 构建中因 `LOGICAL_ERROR` 导致服务器中止。现在，无论来源为何 (`CREATE DATABASE ... SETTINGS`、`<database_replicated>` 服务器配置块、`ATTACH` 重放，以及升级时对现有元数据的重放) ，`0` 都会在解析阶段被拒绝并报告 `BAD_ARGUMENTS`。最小有效值为 `1`。[#106006](https://github.com/ClickHouse/ClickHouse/pull/106006) ([groeneai](https://github.com/groeneai))。
* 禁止在 JSON (Object) 列上创建 minmax 跳数索引，以避免插入混合类型数组时出现 NO\_COMMON\_TYPE 异常。请改用带类型的子列 (例如 `INDEX idx json.field TYPE minmax`) 。[#106094](https://github.com/ClickHouse/ClickHouse/pull/106094) ([linhaojie](https://github.com/linhaojie))。
* 修复了 `JSON_QUERY`/`JSON_VALUE`/`JSON_EXISTS` 在参数为 Dynamic 类型时返回 Dynamic 而非 String/UInt8 的问题。[#106877](https://github.com/ClickHouse/ClickHouse/pull/106877) ([Avogar](https://github.com/Avogar))。
* 修复了将等待超时类设置 (例如 `interactive_delay`) 设为极大值时发生的有符号整数溢出问题：此时等待可能立即超时，而非正常等待；在 Undefined Behavior Sanitizer 下，服务器还可能中止运行。[#106961](https://github.com/ClickHouse/ClickHouse/pull/106961) ([groeneai](https://github.com/groeneai))。
* 修复了 `geohashesInBox` 函数在坐标参数混用常量与非常量值，或坐标为 `BFloat16` 时出现的 `LOGICAL_ERROR` (“Unsupported argument types”) 。现在，常量/非常量混用的 `Float32` 参数可以正常工作，而 `BFloat16` 参数会被拒绝并给出明确的错误信息。[#107063](https://github.com/ClickHouse/ClickHouse/pull/107063) ([groeneai](https://github.com/groeneai))。
* 修复了启用 `output_format_csv_serialize_tuple_into_separate_columns` (默认启用) 时，`CSVWithNames` 和 `CSVWithNamesAndTypes` 的表头列数少于数据列数的问题。现在，表头 (以及类型行) 会将 `Tuple` 列展开为以点号命名的叶子字段 (例如 `t.a`、`t.b`) ，使表头列数与数据一致。新增设置 `output_format_csv_header_serialize_tuple_into_separate_columns` (默认值为 `1`) 用于控制该行为，将其设为 `0` 即可恢复此前的单一名称表头。[#107371](https://github.com/ClickHouse/ClickHouse/pull/107371) ([groeneai](https://github.com/groeneai))。
* 修复了内置 `mongo-c-driver` 中的内存泄漏问题：从 MongoDB 读取数据时 (例如通过 MongoDB 字典或 `mongodb` 表函数) ，若发生可重试的读取错误，且随后重试时的服务器选择失败，就可能出现该泄漏。[#107448](https://github.com/ClickHouse/ClickHouse/pull/107448) ([groeneai](https://github.com/groeneai))。
* 修复了当 `pointInPolygon` 使用 `Variant` 或 `Dynamic` 等包装类型的常量多边形参数调用时 (例如 `pointInPolygon((x, y), if(c, [(0, 0), ...], NULL))`) ，在主键分析期间出现的逻辑错误 (`WhichDataType(const_type).isArray()`) 及服务器中止问题。[#107589](https://github.com/ClickHouse/ClickHouse/pull/107589) ([groeneai](https://github.com/groeneai))。
* 修复了因嵌套在 `Variant` 和 `Dynamic` 列中的 `LowCardinality` 剥离不一致而导致的逻辑错误 (`Bad cast`) ，该问题会出现在 `concat`、`format` 以及主键分析等场景中。[#107773](https://github.com/ClickHouse/ClickHouse/pull/107773) ([Avogar](https://github.com/Avogar))。
* 修复了可执行用户自定义函数命令参数的解析问题，名称为空或无效的占位符将不再被视为有效参数。[#107983](https://github.com/ClickHouse/ClickHouse/pull/107983) ([goutamadwant](https://github.com/goutamadwant))。
* 修复了对元素为 `Dynamic`/`Variant` 的 `Tuple` 执行 `accurateCastOrNull` 时，源数据中真正的 `NULL` 被误判为转换失败的问题。对于 `Nullable` 目标元素，源 `NULL` 现在保留为元素级 `NULL` (与普通 `Tuple(Nullable(...))` 源的行为一致) ；对于非 `Nullable` 目标元素，源 `NULL` 现在会使整个元组变为 NULL (与非 `Dynamic` 参考实现的行为一致) ，而不再生成该元素的默认值。解析/溢出失败仍会使整个元组变为 NULL。[#108023](https://github.com/ClickHouse/ClickHouse/pull/108023) ([groeneai](https://github.com/groeneai))。
* `mongodb` 表函数现在支持以命名参数形式传入 `oid_columns` (例如 `oid_columns='_id'`) ，不再报 `BAD_ARGUMENTS` 错误。[#108039](https://github.com/ClickHouse/ClickHouse/pull/108039) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 现在可以对使用 `DateTime64`、`Decimal` 或浮点范围的 `range_hashed` 或 `complex_key_range_hashed` 字典，传入类型匹配的参数调用 `dictGet`/`dictHas` 进行查询。此前此类查询会报 `must be convertible to Int64` 错误，且 `Decimal`/`DateTime64` 范围的开放区间会错误地返回默认值。[#108052](https://github.com/ClickHouse/ClickHouse/pull/108052) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了使用 `accurateCastOrNull` 将 `Array(Dynamic)` 或 `Array(Variant)` 转换为 `QBit` 时导致的服务器中止问题 (`IColumn::insertFrom` 中的 `Logical error`) ，例如 `accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)')`。[#108288](https://github.com/ClickHouse/ClickHouse/pull/108288) ([groeneai](https://github.com/groeneai))。
* 修复了格式错误或不同步的原生 TCP 协议数据流可能引发的服务器崩溃 (`Received signal 4`，非法指令) 。现在会在解析 `ClientInfo` 的 `initial_address` 字段之前，先校验其是否为数字形式的 `host:port`，从而避免非数字端口被传入会触发陷阱的 libc 函数 `getservbyname`。[#108410](https://github.com/ClickHouse/ClickHouse/pull/108410) ([groeneai](https://github.com/groeneai))。
* 修复了反序列化 `mannWhitneyUTest`、`rankCorr`、`largestTriangleThreeBuckets`、`quantileGK`、`sequenceMatch`/`sequenceCount` 和 `groupArrayIntersect` 的恶意构造聚合函数状态时内存分配过多的问题。格式错误的状态可能声明一个极大的元素数量，导致服务器仅凭几个字节的输入就尝试分配数十 GB 内存；现在此类状态会被拒绝，并报 `TOO_LARGE_ARRAY_SIZE` 错误。[#108465](https://github.com/ClickHouse/ClickHouse/pull/108465) ([groeneai](https://github.com/groeneai))。
* 修复了在 `GROUPING SETS`/`ROLLUP`/`CUBE` 中将 `group_by_use_nulls` 与 `LowCardinality` 常量分组键配合使用时出现的逻辑错误 (`Bad cast from type DB::ColumnNullable to DB::ColumnString`) 以及可能返回错误结果的问题。[#108771](https://github.com/ClickHouse/ClickHouse/pull/108771) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了当 `Map` 值包含带有 `LowCardinality` 的嵌套 `Map` 时，`mapFilter`、`mapSort`、`mapReverseSort`、`mapPartialSort` 和 `mapConcat` 报 `TYPE_MISMATCH` 错误的问题，例如 `mapFilter((k, v) -> 1, map('a'::LowCardinality(String), map('x'::LowCardinality(String), 'y')))`。[#108798](https://github.com/ClickHouse/ClickHouse/pull/108798) ([groeneai](https://github.com/groeneai))。
* 修复了在格式化混合具名与匿名元素的 `Tuple` 数据类型 (例如 `Tuple(a UInt8, UInt16)`) 时出现的 `LOGICAL_ERROR` ("Inconsistent AST formatting") ，该错误会导致 debug 和 sanitizer 构建中的服务器异常中止。[#108915](https://github.com/ClickHouse/ClickHouse/pull/108915) ([groeneai](https://github.com/groeneai))。
* `JSONExtract` 在将字符串类型的 JSON 值转换为 `DateTime`/`DateTime64` 时，现在会遵循 `cast_string_to_date_time_mode` 设置，与 `CAST` 的行为保持一致。[#109252](https://github.com/ClickHouse/ClickHouse/pull/109252) ([Utkal059](https://github.com/Utkal059))。
* 修复了 `IN` 右侧参数为裸数组列时静默返回错误结果 (始终为 false) 或抛出异常的问题，现在 `x IN arr` 的行为与 `has(arr, x)` 一致。[#109416](https://github.com/ClickHouse/ClickHouse/pull/109416) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `arrayFold` 作用于非常量 `Array(LowCardinality(T))` 参数时出现的 `LOGICAL_ERROR` (例如 `arrayFold((acc, x) -> acc + x, materialize([1, 2, 3]::Array(LowCardinality(Int64))), toInt64(0))`) ，此前会报错 "Arguments of 'plus' have incorrect data types" (在 debug 和 sanitizer 构建中会导致服务器异常中止) 。[#109462](https://github.com/ClickHouse/ClickHouse/pull/109462) ([groeneai](https://github.com/groeneai))。
* 通过将 `FixedString` 参数正确转换为 `String`，修复了 `conv` 中的 `ILLEGAL_COLUMN` 异常。[#109771](https://github.com/ClickHouse/ClickHouse/pull/109771) ([hp77-creator](https://github.com/hp77-creator))。
* 修复了在 `serialize_query_plan = 1` 下使用 `FINAL` / `SAMPLE` 读取表函数时返回错误结果的问题，并修复了表函数的聚合哈希表统计缓存键 (此前所有表函数共用同一个预分配条目) 。[#109847](https://github.com/ClickHouse/ClickHouse/pull/109847) ([azat](https://github.com/azat))。
* 修复了在容器类型 (例如 `Array(Bool)`、`Tuple(Bool, ...)`) 中无法将数值 `1`/`0` 解析为 `Bool` 值的问题。此前 `[1,0]` 会报错 `CANNOT_READ_ARRAY_FROM_TEXT`，而 `[true,false]` 则可以正常解析。[#109976](https://github.com/ClickHouse/ClickHouse/pull/109976) ([groeneai](https://github.com/groeneai))。
* 修复了在 `Array(LowCardinality(Nullable(String)))` (包括以此方式存储的 `Nested` 字段) 上构建 `text` 索引、且被索引的数组包含 `NULL` 元素时出现的 `NOT_IMPLEMENTED` 错误 (`Method getDataAt is not supported for Nullable(String) in case if value is NULL`) 。现在构建索引时会跳过 `NULL` 数组元素，与 `Array(Nullable(String))` 的行为一致。[#110055](https://github.com/ClickHouse/ClickHouse/pull/110055) ([groeneai](https://github.com/groeneai))。
* 修复了 `subBitmap`、`bitmapSubsetInRange` 和 `bitmapSubsetLimit` 在 bitmap 仍处于小型表示时返回错误结果的问题，其中包括大于 `2^32` 的 `UInt64` 和 `Int64` 元素值被截断为 32 位的问题。bitmap 函数在有符号元素类型上的比较现在统一使用该元素类型的无符号值，因此在 `Int8` bitmap 中，元素 `-1` 会按 `255` 进行比较，而不是按符号扩展后的 `4294967295` 比较；这同时修复了 `bitmapMin`、`bitmapMax`、`bitmapContains` 和 `bitmapTransform` 在已超出小型表示的 bitmap 上的行为。传入符号扩展阈值的查询需要相应调整：对于 `Int8` bitmap，`bitmapSubsetInRange(bm, 4294967168, 4294967296)` 应改为 `bitmapSubsetInRange(bm, 128, 256)`。此外还修复了 `groupNumericIndexedVector` 在 `Int8` 和 `Int16` 索引列上返回的结果与更宽索引类型不一致的问题，以及 `numericIndexedVectorGetValue` 对负索引返回 `0` 的问题。更正了 bitmap 函数文档，包括子集函数被误称为使用从 1 开始的索引，以及有符号 `bitmapBuild` / `bitmapToArray` 的支持说明。[#110072](https://github.com/ClickHouse/ClickHouse/pull/110072) ([RamiDarwiche](https://github.com/RamiDarwiche))。
* 修复了时间间隔运算中存在未定义有符号溢出的代码路径，涉及时间间隔类型的 `WITH FILL STEP`，以及增量取极端值时的 `add*` / `subtract*` 日期/时间间隔函数，使极端时间间隔值的结果具有确定性，不再依赖有符号溢出。同时修复了时间间隔类型的 `WITH FILL` 在 `YEAR` 步长极大时卡住的问题，此前该问题会导致日历倒退。[#110158](https://github.com/ClickHouse/ClickHouse/pull/110158) ([groeneai](https://github.com/groeneai))。
* 修复了按序聚合在按多个键分组、且排序顺序仅为分组键前缀时，耗时呈二次方级增长 (且不响应 `max_execution_time`) 的问题。[#110159](https://github.com/ClickHouse/ClickHouse/pull/110159) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了操作数不存在最小共同超类型时，比较操作抛出 `ILLEGAL_TYPE_OF_ARGUMENT` 的问题。`Array(Int64)` 与 `Array(UInt64)`、`Array(Int256)` 与 `Array(UInt256)` 等数组现在可以使用 `=`、`!=`、`<`、`<=`、`>`、`>=`、`IS DISTINCT FROM` 和 `IS NOT DISTINCT FROM` 按字典序进行比较。`isDistinctFrom` / `isNotDistinctFrom` 等 NULL 安全比较现在也会对受支持的非数组数值或十进制类型对按值进行比较，而不再抛出异常。包含嵌套 `Tuple(Nullable(...))` 元素的数组现在也支持相等比较。[#110245](https://github.com/ClickHouse/ClickHouse/pull/110245) ([diegomestre2](https://github.com/diegomestre2))。
* 修复了在负偏移量时区中将极端 `DateTime64` 值 (例如 `INT64_MIN`) 转换为 `Time`/`Time64` 时出现的有符号整数溢出问题 (UBSan) 。[#110451](https://github.com/ClickHouse/ClickHouse/pull/110451) ([groeneai](https://github.com/groeneai))。
* 将超出范围的浮点数值 (`BFloat16`、`Float32`、`Float64`) 以及大于 `Int64::max()` 的 `UInt64` 值转换为 `DateTime` 和 `Time` 时，现在在所有架构上都会可靠地饱和到范围边界 (此前超出范围转换的结果取决于架构，在 x86-64 上可能发生回绕) ；非有限值 (`NaN`、`inf`) 现在会抛出异常，而不再产生任意结果。同样的修复也应用于 `toDate` 中浮点数到 `Date` 的转换路径，以及 `UInt64` 和宽整数 (`(U)Int128`、`(U)Int256`) 到 `Date` 和 `Date32` 的转换，这些转换此前可能返回纪元之前的日期，而非饱和到边界。将数字转换为 `Time` 时，现在对所有数值源类型都会饱和到该类型的范围 (此前来自窄无符号整数或宽整数的值在存储时未被限制在范围内，仅在打印时才进行钳制) ；精确转换为 `Time` 时不再拒绝 `Time` 所支持的负值，也不再对超出其范围的值静默饱和。将数字精确转换为 `Date32` (`accurateCast`、`accurateCastOrNull`) 时，不再对超出范围或非有限的值静默饱和，而是与 `Date` 和 `DateTime` 的现有行为一致，抛出异常或返回 `NULL`；对于此类输入，`OrDefault` 变体会返回 `Date32` 的默认值。将非整数浮点数精确转换为 `Date`、`Date32`、`DateTime` 或 `Time` 时，现在会直接拒绝，而不再静默截断。此外还修复了 `toDateTime32` 函数的文档，该文档此前错误地展示了 `toDateTime64` 的示例，并描述了 `DateTime64` 的取值范围。[#110459](https://github.com/ClickHouse/ClickHouse/pull/110459) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了读取 map 键采用字典编码的 ORC 文件时，schema 推断因 `Map cannot have a key of type LowCardinality(Nullable(String))` 而失败的问题，受影响的文件包括由 Spark 写入的 ORC 文件，以及 ClickHouse 自身在启用 `output_format_orc_dictionary_key_size_threshold` 时写入的文件。[#110492](https://github.com/ClickHouse/ClickHouse/pull/110492) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了启用 `optimize_or_like_chain` 时，若 `OR` 条件链中 `LIKE`/`ILIKE`/`match` 的左侧出现聚合函数或窗口函数，可能引发的逻辑错误 (`Function node with name '...' is not resolved as ordinary function`) 。[#110641](https://github.com/ClickHouse/ClickHouse/pull/110641) ([groeneai](https://github.com/groeneai))。
* 修复了对 `Date`/`Date32`/`DateTime64` 值使用极端的 `MONTH`、`WEEK` 或 `DAY` 时间间隔数调用 `toStartOfInterval` 时出现的有符号整数溢出问题。[#110688](https://github.com/ClickHouse/ClickHouse/pull/110688) ([groeneai](https://github.com/groeneai))。
* 修复了 `readWKT` 和 `readWKTPoint` 在处理 `POINT EMPTY` 时返回未初始化坐标 (标量版本) 或前一行残留坐标 (向量化版本) 的问题。现在 `POINT EMPTY` 会因 `CANNOT_PARSE_TEXT` 被拒绝，因为 ClickHouse 的 `Point` 是固定的 `Tuple(Float64, Float64)`，不存在空值表示。[#110692](https://github.com/ClickHouse/ClickHouse/pull/110692) ([groeneai](https://github.com/groeneai))。
* 修复了 `flipCoordinates` 丢失 `Geometry` 类型的问题：对于 `Geometry` 参数，结果类型现在恢复为 `Geometry`，而不是底层的 `Variant(...)`，因此可以直接传递给 `areaCartesian` 等函数。[#110694](https://github.com/ClickHouse/ClickHouse/pull/110694) ([groeneai](https://github.com/groeneai))。
* 修复了空多边形的 WKB 序列化结果不规范的问题：`wkb(POLYGON EMPTY)` 现在输出 `numRings = 0`，而不再输出一个多余的零点环，从而使标准空多边形经 WKB 往返转换后能够无损还原。[#110796](https://github.com/ClickHouse/ClickHouse/pull/110796) ([groeneai](https://github.com/groeneai))。
* JSON `Bool` 解析中的数值 `1`/`0` 现在会遵循 `allow_special_bool_values` 设置。此前，即使设置了 `allow_special_bool_values_inside_variant = 0`，针对 `Variant(Bool, UInt32)` 的 JSON 输入 (如 `{"v":1}`) 仍会被读取为 `Bool`，原因是 JSON `Bool` 解析器忽略了该设置，而 `Bool` 的 `Variant` 反序列化优先级又高于整数类型。[#110835](https://github.com/ClickHouse/ClickHouse/pull/110835) ([groeneai](https://github.com/groeneai))。
* 修复了当 `col` 为 `LowCardinality` 时，`throwIf(notLike(col, pattern))` (以及其他作用于函数结果的 `throwIf`) 会无条件抛出异常的问题。默认的 `LowCardinality` 实现会对整个字典执行 `throwIf`，而该字典始终包含一个保留的默认值，即使没有任何行引用它；因此，只要这个未使用槽位中的值非零，`throwIf` 就会在数据并不满足条件时抛出异常。[#110864](https://github.com/ClickHouse/ClickHouse/pull/110864) ([groeneai](https://github.com/groeneai))。
* 修复了带有 `-Tuple` 组合器的聚合函数与 `RESPECT NULLS` 一起使用并生成中间状态 (`-State`、分布式聚合、`WITH ROLLUP`/`WITH CUBE`) 时发生崩溃的问题。组合后的函数使用了错误的状态变体名称，导致其序列化后的 `AggregateFunction` 类型在往返转换时被重新解析为不兼容的内存布局。[#110930](https://github.com/ClickHouse/ClickHouse/pull/110930) ([groeneai](https://github.com/groeneai))。
* 修复了通过 `mysql` 表函数或 `MySQL` 表/数据库引擎读取可为空的 MySQL 空间列 (`LINESTRING`、`POLYGON`、`MULTILINESTRING`、`MULTIPOLYGON`、`MULTIPOINT` 或通用的 `GEOMETRY`) 时报错 `Nested type LineString cannot be inside Nullable type (ILLEGAL_TYPE_OF_ARGUMENT)` 的问题。此类列现在会回退为 `Nullable(String)`，按 MySQL 返回的原样保存值 (4 字节 SRID 前缀加上 WKB 负载) 。`POINT` 仍映射为 `Nullable(Point)`。[#110943](https://github.com/ClickHouse/ClickHouse/pull/110943) ([groeneai](https://github.com/groeneai))。
* 修复了与旧版本对端通信时，包含带版本聚合状态的 `SimpleAggregateFunction` 包装器的 `Native` 序列化问题。[#110997](https://github.com/ClickHouse/ClickHouse/pull/110997) ([groeneai](https://github.com/groeneai))。
* 修复了在分布式查询和使用并行副本的查询中，`Variant` 类型 (包括 `Geometry`) 的常量出现 `CANNOT_CONVERT_TYPE` 错误的问题。[#111136](https://github.com/ClickHouse/ClickHouse/pull/111136) ([fm4v](https://github.com/fm4v))。
* 修复了当高阶函数的 lambda 主体是条件为常量的 `if`/`multiIf`，且同时包含 `Bool` 字面量分支和 `UInt8` 比较分支时出现的 `LOGICAL_ERROR` ("Lambda resolved type ... is not equal to type from actions DAG ...") ，例如 `arrayFilter(p -> multiIf(false, true, p = 'ALL'), ['ALL'])`。[#111245](https://github.com/ClickHouse/ClickHouse/pull/111245) ([groeneai](https://github.com/groeneai))。
* 修复了 `toStartOfInterval` 使用亚秒级时间间隔时的有符号整数溢出问题：对于与 `Int64` 下界相差不足一个时间间隔的 `DateTime64` 值，舍入结果会静默回绕成一个无意义的正值；现在该函数会抛出 `DECIMAL_OVERFLOW` 异常。[#111370](https://github.com/ClickHouse/ClickHouse/pull/111370) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在分布式查询中，在嵌套组合器下将 `-Tuple` 组合器与 `RESPECT NULLS` / `IGNORE NULLS` 修饰符一起使用时抛出异常 (`CANNOT_CONVERT_TYPE` 或逻辑错误) 的问题，例如 `anyRespectNullsStateTuple(...) IGNORE NULLS`。[#111570](https://github.com/ClickHouse/ClickHouse/pull/111570) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `FixedString` 文本尝试解析在解析失败时会在列中残留部分已追加字节的问题。该问题可能导致在对 `Variant`/`Array`/`Nullable` 列进行序列化时出现 `Sizes of nested column and null map of Nullable column are not equal` 逻辑错误，或导致结果字节被静默错位。[#111908](https://github.com/ClickHouse/ClickHouse/pull/111908) ([groeneai](https://github.com/groeneai))。
* 修复了通过 `Buffer` 表读取动态子列 (`JSON` 或 `Dynamic` 列中的某个路径) 时抛出异常以及数据被静默跳过的问题。[#111948](https://github.com/ClickHouse/ClickHouse/pull/111948) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `countSubstringsCaseInsensitiveUTF8` 的二次复杂度问题：此前在处理几 MB 大小且匹配项众多的 haystack 时，该函数需要耗时数分钟。现在每个匹配项的字符偏移量以增量方式维护，不再从行首重新计数。[#112003](https://github.com/ClickHouse/ClickHouse/pull/112003) ([groeneai](https://github.com/groeneai))。
* 修复了 `toStartOfInterval` 三参数重载中的有符号整数溢出问题：当 `origin` 参数接近 `Int64` 下界时，函数会返回回绕后的值，而不是报错。[#112045](https://github.com/ClickHouse/ClickHouse/pull/112045) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 禁止在表函数参数中使用聚合状态，因为该用法完全不受支持。[#112087](https://github.com/ClickHouse/ClickHouse/pull/112087) ([PedroTadim](https://github.com/PedroTadim))。
* 修复了 `values` 表函数将插入到 `String`/文本列中的非字面量 `Bool` 常量 (例如 `CAST(true, 'Nullable(Bool)')`) 渲染为 `1`/`0` 而非 `true`/`false` 的问题。[#112308](https://github.com/ClickHouse/ClickHouse/pull/112308) ([yakov-olkhovskiy](https://github.com/yakov-olkhovskiy))。
* 修复了对某列应用 `finalizeAggregation` 时出现的逻辑错误 (在 debug 和 sanitizer 构建中会导致中止) ：当该列的聚合状态来自不同函数，且这些函数共享同一状态表示、但最终化后的类型不同时，就会触发该错误——例如通过 `UNION` 合并或经由 `arrayReduce` 生成的 `quantileState` 与 `quantilesState(0.9)`。此类查询现在会抛出普通错误，而不再崩溃。[#112662](https://github.com/ClickHouse/ClickHouse/pull/112662) ([zainulabidin302](https://github.com/zainulabidin302))。
* 修复了 `Poco::NumberParser` (用于读取 JSON 数字) 在解析超出目标类型范围的整数时的问题。此前此类数字不会被拒绝，而是被静默解析为错误的值 (例如 `18446744073709551617` 变为 `1`) ；此外，大于 `Int64` 最大值的 `UInt64` 数字在 AST JSON 往返转换后无法保持原值。[#112904](https://github.com/ClickHouse/ClickHouse/pull/112904) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `IN` 右侧的 `Bool` 常量在针对 `String` 类型的左侧进行转换时，被转换为 `'1'`/`'0'` 而非规范形式 `'true'`/`'false'` 的问题 (现已与 `CAST` 和 `values` 表函数保持一致) 。[#113051](https://github.com/ClickHouse/ClickHouse/pull/113051) ([yakov-olkhovskiy](https://github.com/yakov-olkhovskiy))。
* 修复了 `viewIfPermitted` 的 AST 格式化不一致问题：一是在表函数形式的 `ELSE` 分支中，通常以运算符形式书写的函数 (例如 `not`) 格式化不一致；二是表达式形式 `viewIfPermitted(...)` 被错误地格式化为带有 `ELSE`。[#113652](https://github.com/ClickHouse/ClickHouse/pull/113652) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复 `avg` 作用于 `Date`/`DateTime`/`DateTime64`/`Time`/`Time64` 时的未定义行为和错误结果：现在平均值在整数空间中精确计算，同时修复了 `Int64` 边界溢出问题 (未定义行为，在 x86 上会产生错误结果) 以及数值超过 2^53 时的 `Float64` 精度损失问题 (在纳秒尺度下可见) 。[#113912](https://github.com/ClickHouse/ClickHouse/pull/113912) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复 Experimental `SZ3` 压缩编解码器中的内存泄漏：在压缩难以压缩或已损坏的数据时，如果因异常而失败，临时缓冲区不会被释放。[#113916](https://github.com/ClickHouse/ClickHouse/pull/113916) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复使用 `FixedString` 常量查询 `bloom_filter` 索引时，`hasAny`、`hasAll`、`has`、`indexOf`、`mapContainsKey`、`mapContainsValue` 和 `mapContains` 返回行数过少或因 `TOO_LARGE_STRING_SIZE` 而失败的问题。原因是索引对常量填充后的形式进行哈希，而函数比较的是未填充的形式，导致本应匹配的 granule 被跳过。[#114089](https://github.com/ClickHouse/ClickHouse/pull/114089) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复聚合经过 JIT 编译且数据包含 1970 年之前的时间戳时，`DateTime64` 列上的 `min` 和 `max` 返回错误结果的问题。`DateTime64` 和 `Time64` 派生自 `Decimal64`，但 `is_signed` 未针对二者进行特化，导致生成的代码将 tick 计数按无符号整数比较，使 1970 年之前的时间戳在 `max` 中被误选、在 `min` 中被漏选。[#114168](https://github.com/ClickHouse/ClickHouse/pull/114168) ([groeneai](https://github.com/groeneai))。
* 修复数组元素与 needle 的字符串类型不同时 (例如用 `String` 类型的 needle 匹配 `Array(FixedString(N))` 的元素) ，`arrayExists(x -> x = needle, arr)` 返回错误结果或因 `TOO_LARGE_STRING_SIZE` 而失败的问题。默认启用的 `optimize_rewrite_array_exists_to_has` 优化会将此类调用改写为 `has`，而 `has` 不会像 `=` 那样按零填充方式进行比较。[#114496](https://github.com/ClickHouse/ClickHouse/pull/114496) ([groeneai](https://github.com/groeneai))。
* 修复作用于 Map 或 JSON 容器的 `LIKE/ILIKE` 运算符在文本索引求值时的问题。[#114544](https://github.com/ClickHouse/ClickHouse/pull/114544) ([ahmadov](https://github.com/ahmadov))。
* 修复 `quantile` 和 `quantiles` 在处理 `DateTime64` 和宽 `Decimal` 值时的未定义行为及边界结果错误。[#114919](https://github.com/ClickHouse/ClickHouse/pull/114919) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复 `Time` 分支与 `Time64`、`DateTime` 或 `DateTime64` 组合且表达式经过 JIT 编译时，`if` 和 `multiIf` 返回一个很大的正值而非负值的问题。[#115146](https://github.com/ClickHouse/ClickHouse/pull/115146) ([groeneai](https://github.com/groeneai))。
* 修复 `timezoneOffset` (别名 `timeZoneOffset`) 返回的偏移恰好相差一天的问题。该问题出现在当前 UTC 偏移与 1970-01-01 时的偏移相差整整一天的时区 (例如跨越国际日期变更线之后的 `Pacific/Kiritimati` 和 `Pacific/Apia`) ，以及大多数时区在 1970 年之前的时间。此修复同时修正了依赖该偏移的 `parseDateTime`、`parseDateTimeOrNull`、`parseDateTime64`、`parseDateTimeInJodaSyntax`、`EXTRACT(TIMEZONE_HOUR / TIMEZONE_MINUTE ...)`、`formatDateTime` 的 `%z`、`toUTCTimestamp` 和 `fromUTCTimestamp`。[#115332](https://github.com/ClickHouse/ClickHouse/pull/115332) ([groeneai](https://github.com/groeneai))。
* 修复了当 `has` 或 `notHas` 谓词包含 NULL 数组元素，且主键为 `String`、`Array(String)` 或 `Map(String, String)` 时报错 `Code: 349. Cannot convert NULL value to non-Nullable type` 的问题；同时修复了当该元素为值为 NULL 的 `Dynamic` 或 `Variant` 时返回错误结果的问题。现在，键分析过程中会将 NULL 从集合中剔除，与其他键类型的现有处理方式一致。[#115647](https://github.com/ClickHouse/ClickHouse/pull/115647) ([groeneai](https://github.com/groeneai))。
* 修复了当目标类型为 `LowCardinality` 时，`cast_keep_nullable` 未能保留可空性的问题。此前，将可为 NULL 的值转换为 `LowCardinality(T)` 时会抛出 `CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN` 错误，而非得到 `LowCardinality(Nullable(T))`。[#115851](https://github.com/ClickHouse/ClickHouse/pull/115851) ([groeneai](https://github.com/groeneai))。

<h3 id="index-and-query-cache-fixes">
  索引与查询缓存问题修复
</h3>

* 修复了读取子列时的问题：当某列具有 `DEFAULT` 表达式且在某个分片中尚未物化时 (例如在 `ALTER TABLE ADD COLUMN` 之后，或在 `ALTER TABLE MATERIALIZE COLUMN` 执行期间) ，其子列会被填充为类型默认值，而不是 `DEFAULT` 表达式的计算结果；此外，在此类 `QBit` 列上调用转置向量距离函数 (`cosineDistanceTransposed` 等) 会因 `SIZES_OF_ARRAYS_DONT_MATCH` 错误而失败。[#110636](https://github.com/ClickHouse/ClickHouse/pull/110636) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `Not-ready Set is passed as the second argument` 异常：如果在主键分析期间构建 `IN` 子查询集合时静默失败 (例如在 `overflow_mode = 'break'` 下子查询超时) ，该集合在查询管道中会一直处于未构建状态，进而引发此异常。[#107924](https://github.com/ClickHouse/ClickHouse/pull/107924) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在带有 `set` 数据跳过索引的表上，当行策略使用恒为真的条件并结合对非索引列的检查进行过滤时，`SELECT` 因 `NOT_FOUND_COLUMN_IN_BLOCK` 而失败的问题。[#107971](https://github.com/ClickHouse/ClickHouse/pull/107971) ([tiandiwonder](https://github.com/tiandiwonder))。
* `getClientHTTPHeader` 现在会被正确识别为非确定性函数，其结果不会再被查询结果缓存错误复用。[#108029](https://github.com/ClickHouse/ClickHouse/pull/108029) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了查询条件缓存 (`use_query_condition_cache = 1`) 将基于跳过索引得出的标记排除结果复用于运行了不同跳过索引集合的查询时，导致结果错误的问题，例如使用 `use_skip_indexes = 0`、`ignore_data_skipping_indices` 或不同的 `use_skip_indexes_for_disjunctions` 模式时。现在，基于跳过索引得出的缓存条目以实际运行的跳过索引集合作为键，而行级查询条件缓存条目在上述各种情况下仍可复用。[#108548](https://github.com/ClickHouse/ClickHouse/pull/108548) ([groeneai](https://github.com/groeneai))。
* 修复了一个挂起问题：通过文件系统缓存读取数据的查询在被 `KILL QUERY` 取消后，仍可能一直等待正在进行的下载；此外，如果可刷新materialized view 的刷新卡在此类等待中，删除该视图或对其执行 `SYSTEM STOP VIEW` 会被阻塞。[#109116](https://github.com/ClickHouse/ClickHouse/pull/109116) ([murphy-4o](https://github.com/murphy-4o))。
* 修复了对于带有反向 (`DESC`) 键列的表，当分片没有最终标记时 (非自适应粒度，`index_granularity_bytes = 0`) ，主键索引错误裁剪 granule 而导致查询结果错误的问题。[#109901](https://github.com/ClickHouse/ClickHouse/pull/109901) ([nihalzp](https://github.com/nihalzp))。
* 修复了 `IN (subquery)` 中子查询包含关联子查询、且集合在索引分析期间构建时出现的逻辑错误 `Expected CommonSubplanReferenceStep to reference CommonSubplanStep`、错误 `Subplan cannot be used to build pipeline` 以及逻辑错误 `Trying to extract chunk from ChunkBuffer before all inputs are finished`。[#110491](https://github.com/ClickHouse/ClickHouse/pull/110491) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了启用并行副本时，使用标量子查询或常量参考向量调用 `QBit` 列上的转置距离函数 (如 `cosineDistanceTransposed`) 会出现 `NOT_FOUND_COLUMN_IN_BLOCK` 错误的问题。[#110729](https://github.com/ClickHouse/ClickHouse/pull/110729) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了文本索引的表达式包含空字符串比较 (如 `arrayFilter(s -> s != '', ...)`) 时该索引未被使用的问题，原因在于设置 `optimize_empty_string_comparisons` 只在查询侧将该比较改写为 `notEmpty`。[#112115](https://github.com/ClickHouse/ClickHouse/pull/112115) ([Ergus](https://github.com/Ergus))。
* 当某列同时在 `PREWHERE` 和 `WHERE` 过滤条件中被引用时，即使该列被重写为文本索引虚拟列，也不再将其移除。[#114460](https://github.com/ClickHouse/ClickHouse/pull/114460) ([ahmadov](https://github.com/ahmadov))。
* 修复了在惰性 posting-list 应用模式下查询带有文本索引的表时，若查询在读取过程中被取消，会出现逻辑错误 `Multi-block postings must be compressed` 的问题。[#114636](https://github.com/ClickHouse/ClickHouse/pull/114636) ([CurtizJ](https://github.com/CurtizJ))。
* 修复了 `WHERE` 子句中 `NOT` 内含 `NULL` 表达式时返回错误结果的问题，例如 `SELECT count() FROM t WHERE NOT (id >= 20 AND NULL)`。索引分析会将此类条件判定为在整个范围内恒为真，从而跳过了过滤：`count()` 返回了本应被查询排除的行，而使用该条件的 `ALTER TABLE ... DELETE` 则删除了本应保留的行。[#115152](https://github.com/ClickHouse/ClickHouse/pull/115152) ([groeneai](https://github.com/groeneai))。
* 修复了在启用 `query_plan_join_shard_by_pk_ranges` 的 `full_sorting_merge` JOIN 中，当某一侧因主键、列统计信息或表为空而被裁剪至不剩任何数据部分时出现的 `LOGICAL_ERROR` (`Join is supported only for pipelines with one output port`) 。[#115352](https://github.com/ClickHouse/ClickHouse/pull/115352) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对基于 \_part\_starting\_offset 的过滤器禁用查询条件缓存 [#115358](https://github.com/ClickHouse/ClickHouse/pull/115358) ([azat](https://github.com/azat))。
* 修复了在带有隐式 minmax 索引 (`add_minmax_index_for_numeric_columns` 及相关设置) 的表上，单条 `ALTER TABLE` 语句同时包含 `RENAME COLUMN` 和其他命令 (如 `MODIFY SETTING`) 时出现的 `LOGICAL_ERROR: Index with name auto_minmax_index_<column> already exists`。此外，重命名普通列后，后续的 `DROP COLUMN` 不再因 `UNKNOWN_IDENTIFIER` 而失败，后续的 `ADD COLUMN` 也不会再缺失对应的隐式索引。[#116063](https://github.com/ClickHouse/ClickHouse/pull/116063) ([groeneai](https://github.com/groeneai))。
* 不含通配符 (`%`、`_`) 的 `LIKE`/`NOT LIKE` 模式现在会使用精确的主键范围，而非更宽的前缀范围，因此读取的粒度数量与等价的 `=`/`!=` 谓词相同。[#107077](https://github.com/ClickHouse/ClickHouse/pull/107077) ([groeneai](https://github.com/groeneai))。
* 修复了当主键上的 `IN`/`NOT IN` 条件用 `intDiv` 将键除以常量，且键为无符号整数、其取值跨越 `intDiv` 结果类型的有符号边界时 (例如 `intDiv(uint64_column, -9223372036854775807)`) ，出现的 `LOGICAL_ERROR` (`Invalid binary search result in MergeTreeSetIndex`) ，以及在发布构建版本中索引裁剪失效的问题。[#107586](https://github.com/ClickHouse/ClickHouse/pull/107586) ([groeneai](https://github.com/groeneai))。
* 修复了 `numericIndexedVectorPointwiseMultiply` 与 BSI 位配置不同的全 1 向量相乘时返回空结果的问题。[#108027](https://github.com/ClickHouse/ClickHouse/pull/108027) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在包含大量不同短词元的数据上以 `positions = 1` 构建文本索引时出现的堆缓冲区溢出 (heap-buffer-overflow) 问题。[#108659](https://github.com/ClickHouse/ClickHouse/pull/108659) ([groeneai](https://github.com/groeneai))。
* 允许文本索引的 `preprocessor` 和 `postprocessor` 表达式引用 `ALIAS` 列。[#110014](https://github.com/ClickHouse/ClickHouse/pull/110014) ([Ergus](https://github.com/Ergus))。
* 使用 `LIMIT ... WITH TIES` 时不再应用向量搜索优化，因为该优化会将 ANN 搜索限定为恰好 n 个候选结果，导致与第 n 行并列的行被丢弃。[#110453](https://github.com/ClickHouse/ClickHouse/pull/110453) ([tamish560](https://github.com/tamish560))。
* 修复了当文本索引定义在表达式而非单纯的列上时 (例如带有 `lower(...)` 预处理器的 `assumeNotNull(col)`) ，`ILIKE` 无法使用该文本索引的问题。此类查询现在会使用索引，不再读取全部粒度。[#110595](https://github.com/ClickHouse/ClickHouse/pull/110595) ([ahmadov](https://github.com/ahmadov))。
* 修复了在 `vector_search_with_rescoring = 1` 与延迟物化同时启用且存在多个距离并列时，向量搜索查询可能出现的 `LOGICAL_ERROR` (`LazyMaterializingTransform: Number of rows in lazy chunk N does not match number of offsets M`) 。[#111003](https://github.com/ClickHouse/ClickHouse/pull/111003) ([groeneai](https://github.com/groeneai))。
* 使用带 `i8` 量化的 `vector_similarity` 索引时，拒绝平方模长溢出为无穷大的向量 (此前此类向量会在 usearch 中触发未定义行为，并静默产生无效数据) 。[#111085](https://github.com/ClickHouse/ClickHouse/pull/111085) ([groeneai](https://github.com/groeneai))。
* 修复了启用页缓存时在 `plain_rewritable` 磁盘上读取到过期数据的问题。[#111105](https://github.com/ClickHouse/ClickHouse/pull/111105) ([Michicosun](https://github.com/Michicosun))。
* 修复了 `String` (或更窄的 `FixedString`) 键或 minmax 跳过索引与更宽的 `FixedString` 常量进行比较过滤时 (例如 `toFixedString('abc', 257) = string_col`) ，`count()` 结果错误且丢失行的问题。主键和 minmax 裁剪基于以 NUL 填充后的常量构建范围，因而错误地跳过了匹配的粒度。[#111106](https://github.com/ClickHouse/ClickHouse/pull/111106) ([groeneai](https://github.com/groeneai))。
* 修复了读取偏移量索引不从第 0 行开始的 Parquet 文件时出现的问题。此类文件可能导致原生 Parquet 读取器返回错误的行，或报告 `LOGICAL_ERROR` 而非 `INCORRECT_DATA`。现在读取偏移量索引时会对其进行校验。[#114530](https://github.com/ClickHouse/ClickHouse/pull/114530) ([groeneai](https://github.com/groeneai))。

<h3 id="security-access-backup-and-restore-fixes">
  安全、访问、备份与恢复相关修复
</h3>

* 当目标端表启用了 `fsync_after_insert` 时，`RESTORE` 现在会对恢复的分片文件执行 fsync，使恢复的分片在应对断电时具备与插入的分片同等的持久性。此前，恢复的文件仅被写入并关闭 (从不执行 fsync) ，因此如果在 `RESTORE` 返回 `RESTORED` 后立即断电，可能导致分片损坏、表中数据为空。[#111378](https://github.com/ClickHouse/ClickHouse/pull/111378) ([groeneai](https://github.com/groeneai))。
* 修复了一个安全问题：未经身份验证的 TCP 客户端可通过服务器间端口探测表是否存在及其复制状态。[#99854](https://github.com/ClickHouse/ClickHouse/pull/99854) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了 `DELETE FROM` (轻量级删除) 除 `ALTER DELETE` 外还额外要求 `ALTER UPDATE` 特权的问题。现在，仅被授予 `ALTER DELETE` 的用户即可按文档所述运行 `DELETE FROM`。[#107491](https://github.com/ClickHouse/ClickHouse/pull/107491) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了在 Atomic 数据库上执行 `CREATE TABLE ... AS SELECT` 时，若查询失败 (例如用户无权访问子查询中引用的表) ，会遗留一个空表的问题。此前重试时会报告表已存在，而非原始错误。现在该表会先以临时表的形式创建，待数据完全填充后才可见。[#108048](https://github.com/ClickHouse/ClickHouse/pull/108048) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了当用户仅被授予某个 `ALIAS` 列的 `SELECT` 访问权限时，在该表上执行 `SELECT count()` (或其他简单查询) 会报出 `LOGICAL_ERROR` (`No available columns`) 的问题。[#108056](https://github.com/ClickHouse/ClickHouse/pull/108056) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了未经身份验证的请求可能导致 ClickHouse 解析转发客户端地址请求头中所提供主机名的问题。ClickHouse 现在仅接受这些请求头中的数字 IP 地址。在按转发地址进行配额归属时，无效值会被直接忽略，不会进行 DNS 解析。启用 `auth_use_forwarded_address` 时，无效的转发地址会在身份验证阶段被拒绝。拒绝事件会以 debug 级别记录到日志中。[#111060](https://github.com/ClickHouse/ClickHouse/pull/111060) ([otselnik](https://github.com/otselnik))。
* 修复了在禁用 analyzer (`enable_analyzer = 0`) 时，参数化视图未遵循 `SQL SECURITY DEFINER` (及 `SQL SECURITY NONE`) 的问题。此前，不具备底层表特权的用户查询此类视图时会因 `ACCESS_DENIED` 而失败，而同一视图在启用 analyzer 时却能正常工作。[#111458](https://github.com/ClickHouse/ClickHouse/pull/111458) ([groeneai](https://github.com/groeneai))。
* 修复了 `MySQL` 集成中的一个缺陷：当命名集合以内容形式存储 TLS 凭证时，使用空的 `ssl_ca_pem`/`ssl_cert_pem`/`ssl_key_pem` 值覆盖该凭证会被接受，导致已配置的 CA 或客户端证书被静默丢弃，而不是拒绝此次覆盖。[#113947](https://github.com/ClickHouse/ClickHouse/pull/113947) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了对声明为 `SQL SECURITY DEFINER` 或 `SQL SECURITY NONE` 且主体包含 JOIN 的视图执行 `EXPLAIN ANALYZE` 时丢失连接统计信息的问题。在 debug 和 sanitizer 构建中，该查询会因逻辑错误 `JoinStep analyzed without the analyze mode` 而中止。[#115156](https://github.com/ClickHouse/ClickHouse/pull/115156) ([groeneai](https://github.com/groeneai))。
* 修复了 `RESTORE ... AS <new name>` 后，可刷新materialized view 的 `REFRESH ... DEPENDS ON` 列表仍指向原始数据库的问题。恢复后的视图会因一个它已不再读取的表而触发刷新，却忽略其自身父表的刷新，并在原始数据库被删除后彻底停止刷新。[#115689](https://github.com/ClickHouse/ClickHouse/pull/115689) ([groeneai](https://github.com/groeneai))。
* 修复了对正在被并发删除并重建的 `Replicated` 数据库进行备份时出现的 `LOGICAL_ERROR` 异常；此类备份现在会以 `CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT` 错误正常失败。[#100651](https://github.com/ClickHouse/ClickHouse/pull/100651) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 对同一角色执行 `GRANT role TO role` 时，现在会以 `BAD_ARGUMENTS` 错误拒绝执行，而不再静默地在 `system.role_grants` 中创建自引用条目。[#103315](https://github.com/ClickHouse/ClickHouse/pull/103315) ([zxuhan](https://github.com/zxuhan))。
* 对 `MaterializedPostgreSQL` 数据库执行 `BACKUP` 时，不再因 "Table ... were created or changed its definition during scanning" 而无限期卡住，并且现在会真正备份表数据 (交由底层的 `ReplacingMergeTree` 处理) ，备份数据可恢复为独立的 `ReplacingMergeTree` 表。[#107433](https://github.com/ClickHouse/ClickHouse/pull/107433) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 允许仅对字典拥有 `SHOW DICTIONARIES` 特权的用户执行 `EXISTS <dictionary>` (此前需要 `SHOW TABLES` 特权) 。[#108084](https://github.com/ClickHouse/ClickHouse/pull/108084) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `BACKUP ... TO Memory(...)` 在完成前失败时的清理问题：此前失败的备份会一直保持注册状态，导致其名称无法再次使用。[#109947](https://github.com/ClickHouse/ClickHouse/pull/109947) ([jkartseva](https://github.com/jkartseva))。
* 修复了 `ReadBuffer is canceled. Can't read from it.` 逻辑错误 (在 debug/sanitizer 构建中会导致服务器中止) ：如果此前对某个 zip 归档的读取在中途失败，之后再次读取该归档 (例如从 zip 备份执行 `RESTORE`) 时可能触发该错误。[#110197](https://github.com/ClickHouse/ClickHouse/pull/110197) ([groeneai](https://github.com/groeneai))。
* 修复了可能导致服务器在关闭时崩溃的堆损坏问题，其根源在于 `const` 方法 `AccessRights::getFilters` 修改了由多个并发查询共享的访问权限树。[#112692](https://github.com/ClickHouse/ClickHouse/pull/112692) ([groeneai](https://github.com/groeneai))。

<h3 id="distributed-execution-tables-views-and-dictionaries">
  分布式执行、表、视图和字典
</h3>

* 修复了 `ALTER TABLE ... MOVE PART ... TO SHARD '<path>'` 误报 `Inconsistent AST formatting` 错误的问题。查询格式化器会丢失 `SHARD` 关键字，导致格式化后的查询无法被重新解析，进而引发 `LOGICAL_ERROR` (在 release 构建中表现为已处理的异常，在 debug 和 sanitizer 构建中则会直接中止) 。[#109060](https://github.com/ClickHouse/ClickHouse/pull/109060) ([groeneai](https://github.com/groeneai))。
* 修复了以空远程数据库名定义的 `Distributed` 表在 `distributed_product_mode = 'local'` 下参与 JOIN 时出现逻辑错误 (`!part.empty()`) 的问题。[#110677](https://github.com/ClickHouse/ClickHouse/pull/110677) ([groeneai](https://github.com/groeneai))。
* 修复了当 DISTINCT 提前终止所用的 limit 提示无法限定结果头部范围时，带排序 `LIMIT`/`OFFSET` 的 `DISTINCT` 返回错误行的问题，涉及以下情况：负数 `LIMIT` (返回了头部而非尾部) 、小数 `LIMIT`/`OFFSET` (小数需在完整读取后才能确定) ，以及不带 `LIMIT` 的单独 `OFFSET` (偏移量之后的尾部数据被丢弃) 。例如，在包含多个 part 的表上执行 `SELECT DISTINCT intDiv(x, 100) FROM t ORDER BY intDiv(x, 100) LIMIT -1` 时，返回的是最小的去重值而非最大值。[#111326](https://github.com/ClickHouse/ClickHouse/pull/111326) ([groeneai](https://github.com/groeneai))。
* 修复了 DESCRIBE TABLE 中子查询后的别名无法被解析器识别并导致语法错误的问题。修复 [https://github.com/ClickHouse/ClickHouse/issues/100031。\[#100205](https://github.com/ClickHouse/ClickHouse/issues/100031。\[#100205)]\([https://github.com/ClickHouse/ClickHouse/pull/100205](https://github.com/ClickHouse/ClickHouse/pull/100205)) ([yariks5s](https://github.com/yariks5s))。
* 修复了在 `DETACH DATABASE` / `ATTACH DATABASE` 之后，对于设置了 `lazy_load_tables = 1` 的 `Atomic` 数据库，在 `ALTER RENAME COLUMN` 执行期间并发 `INSERT` 可能导致服务器中止 (`Logical error: 'Block structure mismatch'`) 的问题。[#104852](https://github.com/ClickHouse/ClickHouse/pull/104852) ([groeneai](https://github.com/groeneai))。
* 修复了设置 `inject_random_order_for_select_without_order_by` 导致的列名损坏和 `BAD_ARGUMENTS` 异常。启用该设置后，多列 SELECT 不会再失败，输出列名 (例如用于 `CREATE TABLE AS SELECT`、`CREATE VIEW AS SELECT`、`JSONEachRow` 时) 也会得到保留，而不会被替换为内部的 `__subquery_column_<UUID>` 别名。[#105896](https://github.com/ClickHouse/ClickHouse/pull/105896) ([groeneai](https://github.com/groeneai))。
* 修复了服务器重启 (或执行 `DETACH/ATTACH DATABASE`) 后出现令人困惑的 "Maybe you meant X?" 提示的问题：删除一个已被删除的表时，系统会把刚刚删除的表名作为候选建议。现在分离时会从 `DatabaseOrdinary::startup_table` 和 `load_table` 中清除异步加载任务。[#106238](https://github.com/ClickHouse/ClickHouse/pull/106238) ([groeneai](https://github.com/groeneai))。
* 修复了 `MaterializedPostgreSQL` 表引擎和数据库引擎，使其支持从非默认的 PostgreSQL schema (`materialized_postgresql_schema`) 复制单个表或数据库，包括同一数据库的多个 schema 中存在同名表的情况 (此前这些表会共用同一个 publication 和 replication slot，导致相互干扰) 。[#107425](https://github.com/ClickHouse/ClickHouse/pull/107425) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了以下问题：使用并行副本的查询读取以 `GLOBAL JOIN` 临时表形式传输的表中的 `ALIAS` 列时报 `NO_SUCH_COLUMN_IN_TABLE`；分布式 `JOIN` 两侧都声明了同名 `ALIAS` 列时报 `MULTIPLE_EXPRESSIONS_FOR_ALIAS`；以及 `Distributed` 表声明了基于另一个 `ALIAS` 列的 `ALIAS` 列 (包括将其用作 `JOIN USING` 键) 时报 `UNKNOWN_IDENTIFIER`。[#107700](https://github.com/ClickHouse/ClickHouse/pull/107700) ([yakov-olkhovskiy](https://github.com/yakov-olkhovskiy))。
* 修复了当 `refresh_retries` 设置为极大值 (接近 `Int64` 最大值) 时，可刷新materialized view重试失败的刷新会导致有符号整数溢出的问题。在启用未定义行为 sanitizer 的构建中，该溢出可能导致服务器中止。[#108005](https://github.com/ClickHouse/ClickHouse/pull/108005) ([groeneai](https://github.com/groeneai))。
* 修复了加载使用复合键的字典时出现的异常 (`CANNOT_PARSE_TEXT`) ：当键列不是字典定义中的前几列，且使用带显式查询的本地 `ClickHouse` source 时会触发该问题。现在源列按名称而非位置与字典结构进行匹配。[#108053](https://github.com/ClickHouse/ClickHouse/pull/108053) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在不带 `WHERE` 子句查询 `Hive` 表时 (例如 `SELECT * FROM hive_table`) 发生的崩溃 (空指针解引用) 。[#108094](https://github.com/ClickHouse/ClickHouse/pull/108094) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了当分布式查询将尚未物化的 `MATERIALIZED` CTE 作为外部表引用，且远程 source 为延迟创建 (delayed source) 时，可能发生的服务器崩溃 (段错误) 。该崩溃源于 `RemoteQueryExecutor::sendExternalTables()` 内部对空 `Logger` 的解引用。[#108547](https://github.com/ClickHouse/ClickHouse/pull/108547) ([groeneai](https://github.com/groeneai))。
* 修复了对 `STREAM` 读取执行 `DISTINCT` (`SELECT DISTINCT ... FROM table STREAM`) 时出现的逻辑错误 (`Equal values are not contiguous within the range assumed to be sorted`) 。由于 `STREAM` 读取按提交顺序而非排序键顺序输出行，按序读取优化将不再应用于此类读取。[#108568](https://github.com/ClickHouse/ClickHouse/pull/108568) ([groeneai](https://github.com/groeneai))。
* 修复了在 `optimize_skip_unused_shards = 1` 时，若 `Distributed` 表的分片键是会被分析器常量折叠的表达式 (例如 `if(1, toInt32(id), toInt32(id) + 1)`) ，会引发异常 (`Cannot find sharding key column`，在 debug/sanitizer 构建中则会导致服务器中止) 的问题。[#108737](https://github.com/ClickHouse/ClickHouse/pull/108737) ([groeneai](https://github.com/groeneai))。
* 修复了通过 `Alias` 表执行的 `INSERT ... SELECT` 在未抛出异常的情况下被取消时 (例如设置了 `timeout_overflow_mode = 'break'`) 导致服务器中止 (`LOGICAL_ERROR` / debug 和 sanitizer 构建中的断言失败) 的问题。[#108783](https://github.com/ClickHouse/ClickHouse/pull/108783) ([groeneai](https://github.com/groeneai))。
* 修复了向 `TimeSeries` 表执行的 `INSERT ... SELECT` 在未抛出异常的情况下被取消时 (例如设置了 `timeout_overflow_mode = 'break'`) 导致服务器中止 (`LOGICAL_ERROR` / debug 和 sanitizer 构建中的断言失败) 的问题。[#108796](https://github.com/ClickHouse/ClickHouse/pull/108796) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了分布式查询偶尔因 `UNEXPECTED_PACKET_FROM_SERVER` ("expected TablesStatusResponse, got ProfileInfo") 而失败的问题：当连接池复用了先前被取消的查询遗留下的、处于不同步状态的连接时，会触发该问题。[#108854](https://github.com/ClickHouse/ClickHouse/pull/108854) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在针对 `Distributed` 表的查询中，`MATERIALIZED` CTE 在连接树的多个位置被引用时 (例如两个参与连接的子查询，或一个参与连接的子查询加上 `WHERE` 中的标量子查询) 出现的 `LOGICAL_ERROR` (`CTE '...' does not have query tree, but was not planned yet`) 。现在该查询可以正常执行，不再抛出异常 (此前在 debug/sanitizer 构建中会导致服务器中止) 。[#108924](https://github.com/ClickHouse/ClickHouse/pull/108924) ([groeneai](https://github.com/groeneai))。
* 修复了一个内存安全问题：由 materialized view 处理调度的异步任务，可能在查询结束后仍继续使用查询级别的资源统计。[#108988](https://github.com/ClickHouse/ClickHouse/pull/108988) ([filimonov](https://github.com/filimonov))。
* 修复了一个 `LOGICAL_ERROR` ("Cannot find `__grouping_set` column in header of MergingAggregatedTransform with grouping sets" 或 "Chunk info was not set for chunk in MergingAggregatedTransform") 。在未启用分析器的情况下，对于 `UNION ALL`/`INTERSECT`/`EXCEPT` 查询，若其中一个分支在启用并行副本时使用 `GROUP BY GROUPING SETS`，而另一个分支使用 `FINAL`，则可能出现该错误。[#109003](https://github.com/ClickHouse/ClickHouse/pull/109003) ([groeneai](https://github.com/groeneai))。
* 修复了在 `Replicated` 数据库中执行 `CREATE TABLE ... AS SELECT FROM s3Cluster(...)` (以及 `fileCluster`/`urlCluster` 等其他 cluster 表函数) 时因 `NOT_FOUND_COLUMN_IN_BLOCK` 而失败的问题。[#109266](https://github.com/ClickHouse/ClickHouse/pull/109266) ([groeneai](https://github.com/groeneai))。
* 修复了在包含两个或更多分片的集群上执行读取 `Distributed` 表的 `CREATE TABLE ... ON CLUSTER ... AS SELECT` 时出现的错误 (`NOT_FOUND_COLUMN_IN_BLOCK`，旧版本中为 `std::bad_function_call`) 。[#109407](https://github.com/ClickHouse/ClickHouse/pull/109407) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了将表表达式用作 `IN` 运算符左侧参数时出现的令人费解的内部错误 (`Method getResultType is not supported for TABLE query tree node`) ；此类查询现在会返回清晰的错误信息。[#109412](https://github.com/ClickHouse/ClickHouse/pull/109412) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在 `optimize_const_name_size` 取值较小时，对 `Distributed` 表执行 `SELECT ... ORDER BY ... WITH FILL` 出现的 `Bad cast from type DB::FunctionNode to DB::ConstantNode` 逻辑错误 (在 debug/sanitizer 构建中会导致服务器中止) 。[#109938](https://github.com/ClickHouse/ClickHouse/pull/109938) ([groeneai](https://github.com/groeneai))。
* 修复了连接顺序优化器中的 `LOGICAL_ERROR` (`Left and right columns have same names`) 。在启用 `query_plan_merge_expression_into_join` 时，对多表视图执行逗号连接可能触发该错误。[#110227](https://github.com/ClickHouse/ClickHouse/pull/110227) ([groeneai](https://github.com/groeneai))。
* 修复了带有 `LIMIT` 的合法分布式查询偶发抛出 `Logical error: 'No more packets are available.'` 的问题，该问题会在 debug 和 sanitizer 构建中导致服务器中止。[#110334](https://github.com/ClickHouse/ClickHouse/pull/110334) ([groeneai](https://github.com/groeneai))。
* 修复了一个解析器缺陷：当 SELECT 查询紧接在裸表标识符之后结束时 (例如 `... FROM t COMMENT 'x'`) ，COMMENT 会被错误地解析为隐式别名，从而报出具有误导性的语法错误，而不是将注释应用到视图/表上。[#110372](https://github.com/ClickHouse/ClickHouse/pull/110372) ([adityaksolves](https://github.com/adityaksolves))。
* 修复了一个结果错误：在启用并行副本且查询带有高选择性过滤条件时，对 `FixedString` 列调用 `length()` (以及 QBit 维度) 会返回 `0`，而非固定长度 `N`。[#110427](https://github.com/ClickHouse/ClickHouse/pull/110427) ([groeneai](https://github.com/groeneai))。
* 修复了并行副本以 `custom_key_sampling` / `custom_key_range` 模式运行时，`FROM` 中包含子查询的查询报 `NOT_FOUND_COLUMN_IN_BLOCK` 错误的问题。此类查询 (例如 `SELECT * FROM (SELECT id, k, v FROM t WHERE id < 20) ORDER BY k`) 此前会因 `Not found column __table2.id in block ...` 而失败。[#110690](https://github.com/ClickHouse/ClickHouse/pull/110690) ([groeneai](https://github.com/groeneai))。
* 修复了对包含流式 (`FROM ... STREAM`) 读取的查询执行 `EXPLAIN ANALYZE` 时出现 `Logical error: 'clock'` 的问题 (在 debug/sanitizer 构建版本中服务器会崩溃；在发行版构建版本中则会无限挂起) 。该问题出现在流式读取并非简单的顶层表表达式时，例如嵌套在子查询中 (如位于 `WHERE ... IN (...)` 或 CTE 内部) ，或隐藏在普通视图或参数化视图之后。现在 `EXPLAIN ANALYZE` 会以 `NOT_IMPLEMENTED` 拒绝此类查询，与其对顶层流式读取的处理方式一致。[#110935](https://github.com/ClickHouse/ClickHouse/pull/110935) ([groeneai](https://github.com/groeneai))。
* 修复了当表与其所在数据库同名时，analyzer 无法正确解析完全限定列名 (例如 `db.table.column`) 的问题。[#110976](https://github.com/ClickHouse/ClickHouse/pull/110976) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在设置了 `parallel_replicas_min_number_of_rows_per_replica` 且投影了左表列时，`RIGHT JOIN` 报出 `NOT_FOUND_COLUMN_IN_BLOCK` / `THERE_IS_NO_COLUMN` 错误 (在某些发行版中则会静默返回错误结果) 的问题。[#111332](https://github.com/ClickHouse/ClickHouse/pull/111332) ([groeneai](https://github.com/groeneai))。
* 修复了可执行 UDF、`executable` 表引擎和可执行字典中的竞态问题：对已关闭的文件描述符执行 `fcntl` 可能会破坏并发查询中某个无关的描述符 (清除其 `O_NONBLOCK` 标志) ，进而导致查询无限期挂起。[#111779](https://github.com/ClickHouse/ClickHouse/pull/111779) ([Algunenano](https://github.com/Algunenano))。
* 修复了对包含两个或更多分片的 `Distributed` 表、`clusterAllReplicas` 或基于自定义键的并行副本执行 `ORDER BY ... WITH FILL ... INTERPOLATE` 时 (包括结果为空的情况) 出现的 `LOGICAL_ERROR` ("Invalid number of rows in Chunk") 问题，以及在加固构建版本中与之相关的越界中止问题。现在 `WITH FILL` 仅在生成最终结果的节点上执行，这也一并修复了生成的填充行在各分片/副本间重复的问题。[#111919](https://github.com/ClickHouse/ClickHouse/pull/111919) ([yakov-olkhovskiy](https://github.com/yakov-olkhovskiy))。
* 修复了针对 `system.replicas` 的查询在其状态请求处理前被终止时，`DROP TABLE ... SYNC` 永久挂起的问题。[#112164](https://github.com/ClickHouse/ClickHouse/pull/112164) ([evillique](https://github.com/evillique))。
* 修复了多表连接中两个子连接均不产生输出列时抛出 `LOGICAL_ERROR` 异常 (`Block structure mismatch in joined block stream`) 的问题，例如在 `query_plan_optimize_join_order_limit` 设置为 `0` 或 `1` 时执行 `SELECT count() FROM t1, t2, t3, t4 WHERE (t1.b = t2.b) AND (t3.a = t4.a)`。[#112205](https://github.com/ClickHouse/ClickHouse/pull/112205) ([groeneai](https://github.com/groeneai))。
* 修复了包含 `FINAL`、`PREWHERE` 过滤条件、较小 `LIMIT` 且 `make_distributed_plan = 1` 的查询在所选列顺序与表的列顺序不同时出现逻辑错误 `Cannot add step Expression to QueryPlan because it has incompatible header with root step JoinLazyColumnsStep` 的问题。原因是延迟物化在替换计划节点时未保留该节点的输出请求头，导致查询计划不一致。[#112303](https://github.com/ClickHouse/ClickHouse/pull/112303) ([groeneai](https://github.com/groeneai))。
* 修复了使用旧 analyzer 时，若必须为常量的参数 (例如 `toDecimal32` 的 scale 或 `toDateTime` 的时区) 来自标量子查询，会导致结果错误和逻辑错误的问题。此前此类参数在分析阶段会被当作零值或空值处理，致使声明的结果类型与实际计算值不一致，并导致 `CREATE VIEW` 和 `CREATE MATERIALIZED VIEW` 持久化错误的列类型。[#112492](https://github.com/ClickHouse/ClickHouse/pull/112492) ([groeneai](https://github.com/groeneai))。
* 修复了普通 `VIEW` 的定义通过查询参数引用表或字典时 (例如 `CREATE VIEW v AS SELECT x FROM {db:Identifier}.t`) 出现的逻辑错误和依赖记录错误。此类视图不再对当前数据库中的同名表记录引用依赖，因此无关的表又可以正常删除了。[#112704](https://github.com/ClickHouse/ClickHouse/pull/112704) ([groeneai](https://github.com/groeneai))。
* 修复了 `Join` 表引擎用于 JOIN 右侧、且 `ON` 部分包含同时引用两张表列的条件时 (例如 `ON (t.key = j.key) AND (t.a < j.a)`) 出现的逻辑错误。此类查询现在会被拒绝并给出明确的异常，而不再抛出 `required columns: ... but not found any in left table` 或 `std::bad_variant_access`。[#112815](https://github.com/ClickHouse/ClickHouse/pull/112815) ([groeneai](https://github.com/groeneai))。
* 修复了以极大延迟调度后台任务时 (例如可刷新materialized view 设置了极大的 `REFRESH AFTER` 周期) 出现的未定义行为和静默调度错误。现在延迟会被限制在可表示的最大值以内，不再发生溢出。[#113041](https://github.com/ClickHouse/ClickHouse/pull/113041) ([groeneai](https://github.com/groeneai))。
* 修复了向 `Distributed` 表执行异步 `INSERT` 时，若所需队列目录名称超出文件系统 255 字节的限制 (在 `use_compact_format_in_distributed_parts_names = 0` 时可能出现) 所报告的错误。此前，对于启用 `internal_replication` 的分片会报告 `LOGICAL_ERROR`，其他情况下则报告缺少来源信息的 `Code: 1001. std::exception`；现在两种情况均报告 `ARGUMENT_OUT_OF_BOUND`，并指明表名、集群和限制值。[#113083](https://github.com/ClickHouse/ClickHouse/pull/113083) ([groeneai](https://github.com/groeneai))。
* `UNDROP TABLE` 在等待正在运行的查询释放已删除的表时，现在可以通过 `KILL QUERY` 中断。[#113263](https://github.com/ClickHouse/ClickHouse/pull/113263) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了使用 materialized CTE 的查询失败后，`DROP TABLE` 永久挂起并发生内存泄漏的问题。此前该表会一直卡在删除队列中，直到服务器重启。[#113397](https://github.com/ClickHouse/ClickHouse/pull/113397) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了在 `make_distributed_plan` 下，子查询在自身的 `SETTINGS` 子句中设置 `distributed_plan_execute_locally` 时出现的段错误和 `LOGICAL_ERROR` (`No host found for exchange stream final_result__0_0`) 。分布式查询计划与执行该计划的代码从两个不同的上下文读取该设置，二者可能不一致，导致发起节点构建出自相矛盾的管道。[#113422](https://github.com/ClickHouse/ClickHouse/pull/113422) ([groeneai](https://github.com/groeneai))。
* 修复了启用 `database_atomic_wait_for_drop_and_detach_synchronously` 时，若用于填充数据的 `SELECT` 失败，`CREATE TABLE ... AS SELECT` 将无法被终止的问题：对临时表执行的内部清理 `DROP` 会等待后台删除队列，且会忽略 `KILL QUERY` 和 `max_execution_time`。[#113504](https://github.com/ClickHouse/ClickHouse/pull/113504) ([groeneai](https://github.com/groeneai))。
* 修复了启用 `join_use_nulls` 时，对字典执行 `JOIN` 且 `ON` 子句包含涉及两张表的非等值条件 (例如 `ON (t.key = d.key) AND (t.a * 10 < d.a)`) 时返回错误结果的问题，以及在启用断言的构建中触发断言中止的问题。此前该条件是基于以不匹配类型读取的列求值的，因此行可能被任意匹配。[#113534](https://github.com/ClickHouse/ClickHouse/pull/113534) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了以下问题：当以非限定名引用参数化视图的查询被发送到分片时，该视图会丢失其所属数据库，导致分片在自身的默认数据库中解析该名称。视该数据库中的内容而定，查询要么以 `UNKNOWN_FUNCTION` 失败，要么静默返回另一个视图中的行。此问题影响通过 `Distributed` 表执行的 `IN`、`JOIN` 和 `remote()`。[#113550](https://github.com/ClickHouse/ClickHouse/pull/113550) ([groeneai](https://github.com/groeneai))。
* 修复了读取 `Join` 引擎表时出现的 `Unsupported JOIN keys of type keys256 in StorageJoin` 错误，该问题出现在表的键为复合键 (多个列) 或单个 16/32 字节值 (例如 `UUID`、`Int256` 或 `FixedString(4)`) 时。此类表此前可以创建、写入并参与连接，但始终无法通过 `SELECT` 读回数据。[#113578](https://github.com/ClickHouse/ClickHouse/pull/113578) ([groeneai](https://github.com/groeneai))。
* 修复了逻辑错误 `Sending a distributed query with unknown (zero) client version`：该错误出现在挂载基于远程分片的无结构 `Distributed` 表，或从旧版本服务器写入的元数据中加载此类表时。[#113675](https://github.com/ClickHouse/ClickHouse/pull/113675) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `SELECT` 对命名表使用 `STREAM` 修饰符、同时以读取任务模式启用并行副本时出现的 `LOGICAL_ERROR`。当在 `PREWHERE` 中将 materialized CTE 用作 `IN` 集合时，服务器会抛出 `Reading from materialized CTE ... DelayedPortsProcessor gate is missing in the query plan` (在 debug 和 sanitizer 构建中会导致服务器中止) 。现在，请求并行副本时将拒绝带有 `STREAM` 的表：当 `enable_parallel_replicas = 2` 时，查询以 `SUPPORT_IS_DISABLED` 失败；当其为 `1` 时，查询将不使用并行副本运行，与 `FINAL` 的现有行为完全一致。[#113754](https://github.com/ClickHouse/ClickHouse/pull/113754) ([groeneai](https://github.com/groeneai))。
* 修复了解析 `remote`、`mysql` 等表函数的地址参数时存在的二次复杂度问题：过长的地址 (例如兆字节级、以零填充的 `FixedString`) 会使查询在分析阶段卡住，且无法取消。[#113918](https://github.com/ClickHouse/ClickHouse/pull/113918) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在启用 `database_atomic_wait_for_drop_and_detach_synchronously` 时，可刷新materialized view 的刷新被取消 (例如因服务器关闭) 后误报 `Failed to drop temporary table after refresh. Table ... is left behind and requires manual cleanup.` 错误的问题。实际上临时表已被删除，根本无需手动清理。[#113957](https://github.com/ClickHouse/ClickHouse/pull/113957) ([groeneai](https://github.com/groeneai))。
* 修复了在启用 `materialized_views_ignore_errors` 时，materialized view 在收集依赖项期间失败后 `system.query_views_log` 中缺少对应行的问题。在 debug 和 sanitizer 构建中，这还会导致服务器因 `std::out_of_range` 中止，而非记录该视图。[#114064](https://github.com/ClickHouse/ClickHouse/pull/114064) ([groeneai](https://github.com/groeneai))。
* 修复了右表非键列上的过滤条件被下推到 ANY INNER JOIN 之下时结果不一致的问题。[#114313](https://github.com/ClickHouse/ClickHouse/pull/114313) ([kirillshokhin](https://github.com/kirillshokhin))。
* 修复了在设置 `ignore_drop_queries_probability` 时，`CREATE OR REPLACE` 遗留内部 `_tmp_replace_*` 表，以及 `CREATE OR REPLACE VIEW` 以 `NOT_IMPLEMENTED` 失败的问题。其内部发出的 DROP 只是同一条用户语句中的步骤，因此 DROP 故障注入不再对其生效。[#114420](https://github.com/ClickHouse/ClickHouse/pull/114420) ([groeneai](https://github.com/groeneai))。
* 修复了读取 Delta Lake 表时，若 `metaData.partitionColumns` 中指定的列未在 `metaData.schemaString` 中声明，会导致 `LOGICAL_ERROR` 的问题。现在，只要从快照中读取该表或其 schema (而不仅限于查询带有谓词时) ，此类元数据都会被拒绝：delta-kernel 读取器返回 `BAD_ARGUMENTS`，旧版读取器返回 `INCORRECT_DATA`。[#114538](https://github.com/ClickHouse/ClickHouse/pull/114538) ([groeneai](https://github.com/groeneai))。
* 修复了以下问题：当服务器启动后运行的第一个聚合查询使用了 lazy `FINAL` 优化 (`query_plan_optimize_lazy_final`) 时，哈希表统计信息 (连同依赖它的聚合哈希表预分配) 会在整个服务器范围内被静默且永久地禁用。[#114597](https://github.com/ClickHouse/ClickHouse/pull/114597) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了启用 `ignore_drop_queries_probability` 时，可刷新materialized view 泄漏被轮换下来的 target table 的问题。刷新过程中为清理先前 target table 而发出的 `DROP` 属于刷新的一个步骤，而非用户发起的 `DROP`，因此故障注入不再对其生效。[#114622](https://github.com/ClickHouse/ClickHouse/pull/114622) ([groeneai](https://github.com/groeneai))。
* 修复了 `ON` 子句中包含多个以 `OR` 连接的条件时，`ANY RIGHT JOIN` 和 `SEMI RIGHT JOIN` 会将右表的部分行返回两次、同时丢失其他行匹配结果的问题。显式编写的 `ANY LEFT JOIN` 也受影响，因为规划器可能会交换两表并将其作为 `ANY RIGHT JOIN` 执行。[#114676](https://github.com/ClickHouse/ClickHouse/pull/114676) ([vdimir](https://github.com/vdimir))。
* 修复了当查询中的 `JOIN` 位于某个表之上，且该表的文本索引列同时被 `PREWHERE` 和 `WHERE` 文本搜索谓词使用时出现的 `LOGICAL_ERROR` (`Cannot find input column ... on its position in inputs of expression actions DAG`) 。[#114771](https://github.com/ClickHouse/ClickHouse/pull/114771) ([groeneai](https://github.com/groeneai))。
* 修复了对在 `ALIAS` 或 `EPHEMERAL` 列上声明了 `STATISTICS(...)` 的表执行任何 `INSERT` 都会报 `NOT_FOUND_COLUMN_IN_BLOCK`，从而导致此类表实际上变为只读的问题。[#115231](https://github.com/ClickHouse/ClickHouse/pull/115231) ([groeneai](https://github.com/groeneai))。
* 修复了分布式查询中 `dictGet` 及其变体的问题：未限定的字典名称现在绑定到发起服务器的当前数据库，而不再基于各分片的当前数据库进行解析——此前要么找不到该字典，要么解析到另一个同名字典。[#115541](https://github.com/ClickHouse/ClickHouse/pull/115541) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了以新名称恢复数据库或表时，已存储视图定义中的表别名被丢弃，导致读取恢复后的视图失败并报 `UNKNOWN_IDENTIFIER` 的问题。[#115645](https://github.com/ClickHouse/ClickHouse/pull/115645) ([groeneai](https://github.com/groeneai))。
* 修复了在基于 `Distributed` 表的 `IN` 子查询内部读取 `MATERIALIZED` CTE 时出现的 `LOGICAL_ERROR` "Reading from materialized CTE 'X' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan"。[#115740](https://github.com/ClickHouse/ClickHouse/pull/115740) ([groeneai](https://github.com/groeneai))。
* 修复了 DETACH DICTIONARY ... PERMANENTLY 被依赖检查 (HAVE\_DEPENDENT\_OBJECTS) 拒绝后，dictGet 报 BAD\_ARGUMENTS "Dictionary not found" 的问题。现在分离操作被拒绝时，该字典仍可完全正常使用。[#105259](https://github.com/ClickHouse/ClickHouse/pull/105259) ([groeneai](https://github.com/groeneai))。
* 修复了后台表删除队列中的 `Logical error: 'removed'` (在 debug 构建中会导致服务器中止) 。当多个 `CREATE OR REPLACE TABLE` 查询重复使用同一个显式 UUID 时，会有多个共享该 UUID 的已删除表进入队列，从而触发此问题。[#107031](https://github.com/ClickHouse/ClickHouse/pull/107031) ([groeneai](https://github.com/groeneai))。
* 修复了服务器停机期间单个复制表的结构发生变化时，`MaterializedPostgreSQL` 会停止整个数据库复制 (并报错 `LOGICAL_ERROR: Columns number mismatch`) 的问题。现在仅会跳过受影响的表，且该表可通过 `DETACH`/`ATTACH` 恢复。[#107427](https://github.com/ClickHouse/ClickHouse/pull/107427) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了集群中存在非活动副本 (例如自动扩缩容后遗留的过期条目) 时，并行副本工作分配严重倾斜的问题。读取协调器不再将此类副本计入，因此工作会在在线副本之间均衡分配，而不会全部堆积到单个副本上。[#107805](https://github.com/ClickHouse/ClickHouse/pull/107805) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了多个在 XML 中定义的 MySQL 字典通过 `share_connection` 共享同一个连接池时，`SYSTEM RELOAD DICTIONARIES` (以及 `RELOAD DICTIONARY`) 卡死的问题。此类连接池现在会遵循配置中的 `connection_pool_size` 和 `connection_wait_timeout` (默认 5 秒) ，与通过命名集合定义的字典行为一致。[#108083](https://github.com/ClickHouse/ClickHouse/pull/108083) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 防止由 leader 执行的复制分布式 DDL 在重试次数耗尽后永久阻塞后续的 `ON CLUSTER` DDL 查询。[#108505](https://github.com/ClickHouse/ClickHouse/pull/108505) ([ahaanlimaye](https://github.com/ahaanlimaye))。
* 修复了 `SYSTEM FLUSH DISTRIBUTED` 与针对同一 `Distributed` 表的 `DROP TABLE` 并发执行时可能发生的崩溃 (释放后使用) 。[#108684](https://github.com/ClickHouse/ClickHouse/pull/108684) ([groeneai](https://github.com/groeneai))。
* 修复了自动并行副本规划器中的 `LOGICAL_ERROR` (`local_replica_plan_reading_step->getAnalyzedResult() == nullptr`) ，该错误可能在启用 `automatic_parallel_replicas_mode` 且 `parallel_replicas_min_number_of_rows_per_replica` 大于 0 时出现。[#109011](https://github.com/ClickHouse/ClickHouse/pull/109011) ([groeneai](https://github.com/groeneai))。
* 修复了非事务性 `TRUNCATE` 与一个已向同一表插入数据但尚未提交的事务并发执行时，可能抛出的 `LOGICAL_ERROR` (`creation_csn is not set while removal_csn is set to 1`) 。此类 `TRUNCATE` 不再删除由尚未提交的事务创建的数据分区片段。[#109598](https://github.com/ClickHouse/ClickHouse/pull/109598) ([tuanpach](https://github.com/tuanpach))。
* 外部数据库引擎 (例如 `PostgreSQL`) 不再下推针对 `UUID` 列的范围比较 (`>=`、`>`、`<=`、`<`) 。由于 ClickHouse 与外部数据库对 UUID 的排序方式不同，下推这些比较会导致结果中的行被静默丢弃；此类谓词现改由 ClickHouse 自行计算。[#109833](https://github.com/ClickHouse/ClickHouse/pull/109833) ([vismaytiwari](https://github.com/vismaytiwari))。
* 修复了 `MaterializedPostgreSQL` 数据库引擎中，表在仍处于同步队列时被分离 (或其结构发生变化) 可能导致服务器崩溃的问题。[#110596](https://github.com/ClickHouse/ClickHouse/pull/110596) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `EPHEMERAL` 列的类型会被服务器的 `query_masking_rules` 改写的问题。若某条规则匹配到类型内部的内容，会导致 `CREATE TABLE` 存储错误的类型，甚至执行失败。[#112048](https://github.com/ClickHouse/ClickHouse/pull/112048) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了表名长度检查中的无符号下溢问题，该问题会导致创建出永远无法删除的表。当转义后的数据库名称达到 214 字节时，为 `metadata_dropped` 文件名计算的长度上限会发生回绕，导致 `CREATE TABLE` 被接受，而随后的 `DROP TABLE` 或 `DROP DATABASE` 却因 `File name too long` 而失败。现在此类名称会被拒绝并返回 `ARGUMENT_OUT_OF_BOUND`，与略低于该边界值时已返回的错误一致。[#112527](https://github.com/ClickHouse/ClickHouse/pull/112527) ([groeneai](https://github.com/groeneai))。
* 修复了 `RENAME TABLE` 依据源数据库而非目标数据库检查表名最大长度的问题。将表重命名到名称较长的数据库中，可能产生 `DROP TABLE` 无法删除的表；而将表从此类数据库中重命名移出时，则会被错误地拒绝。[#113019](https://github.com/ClickHouse/ClickHouse/pull/113019) ([groeneai](https://github.com/groeneai))。
* 修复了向 `Alias` 表插入数据且其目标表会触发 materialized view 时，`query_log` 中 `views` 列始终为空的问题。[#113076](https://github.com/ClickHouse/ClickHouse/pull/113076) ([eclbg](https://github.com/eclbg))。
* 无效的 `parallel_replicas_custom_key` 表达式 (例如 `tuple()` 或 `(x, y)`) 现在会被拒绝并返回 `ILLEGAL_TYPE_OF_COLUMN_FOR_FILTER`，而不会再越界读取 custom-key 类型列表。[#113359](https://github.com/ClickHouse/ClickHouse/pull/113359) ([nickitat](https://github.com/nickitat))。
* 修复了 `RENAME DATABASE` 会接受过长的目标名称、导致该数据库中的表无法删除的问题。现在无论 `check_table_dependencies` 如何设置，都会执行表名长度检查，且检查范围也涵盖分离的表——此前这些表从未被检查，因此即使在默认设置下也会受到影响。[#113557](https://github.com/ClickHouse/ClickHouse/pull/113557) ([groeneai](https://github.com/groeneai))。
* 向使用 `Distributed` 引擎的表进行后台插入时，因向远程分片发送数据反复出错而产生的延迟，现在会在错误解决后逐步减少。此前该延迟只增不减，且永远不会重置。[#87378](https://github.com/ClickHouse/ClickHouse/pull/87378) ([Blackmorse](https://github.com/Blackmorse))。
* 现在会拒绝针对未知集群或未配置 `<secret>` 的集群使用 `USER_INTERSERVER_MARKER` 的原生协议握手。此前，此类握手会让未经身份验证的客户端进入服务器间模式，并执行由 `fake_interserver_context` 支撑的认证前协议数据包 (例如 `TablesStatusRequest`) ，从而无需证明知晓集群 secret 即可获取本地表的信息。[#99675](https://github.com/ClickHouse/ClickHouse/pull/99675) ([MillaFleurs](https://github.com/MillaFleurs))。

<h3 id="sql-analyzer-and-join-fixes">
  SQL、analyzer 与 JOIN 相关修复
</h3>

* 修复命名 `WINDOW` 子句定义中的查询参数替换问题。此前，其中的参数未被替换，也不会报错；未设置的 `Identifier` 参数还可能在执行 `EXPLAIN SYNTAX` 时引发异常 `Logical error: '!part.empty()'`。[#110506](https://github.com/ClickHouse/ClickHouse/pull/110506) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复并发删除或替换可刷新materialized view 时偶发的服务器崩溃问题。在调度代码暂时释放互斥锁期间，如果另一个线程将任务的 `view` 设置为 `nullptr`，就会导致 `RefreshTask::doScheduling` 解引用空指针。[#105588](https://github.com/ClickHouse/ClickHouse/pull/105588) ([groeneai](https://github.com/groeneai))。
* 修复使用 `EXCEPT` 或 `INTERSECT` 定义、且操作数为 `UNION` 链的视图在执行 `DETACH`/`ATTACH` 或服务器重启后返回错误结果的问题。格式化程序未给 `INTERSECT`/`EXCEPT` 的 `UNION` 子节点添加括号，导致存储的 SQL 在重新解析时运算优先级颠倒。[#105935](https://github.com/ClickHouse/ClickHouse/pull/105935) ([groeneai](https://github.com/groeneai))。
* 修复对使用 `WITH CUBE`、`WITH ROLLUP` 或 `GROUPING SETS` 的 `GROUP BY` 结果按相同键执行 `SELECT DISTINCT` 时返回错误结果 (重复行) 的问题。在这些情况下，`query_plan_remove_redundant_distinct` 优化不再移除 `DISTINCT`，因为这些分组修饰符会生成键列取默认值的额外行，而这些默认值可能与实际分组的键值相同。[#107072](https://github.com/ClickHouse/ClickHouse/pull/107072) ([groeneai](https://github.com/groeneai))。
* 修复 OUTER JOIN 中 `WHERE` 过滤器为包含常量项的合取表达式时返回错误结果的问题 (例如 `p AND 1`，或 `WHERE p QUALIFY NULL`，其中 `QUALIFY NULL` 被合并到 `WHERE` 中) 。常量合取项可能被下推到连接的非保留侧，并从连接后的过滤器中移除，导致连接生成非保留侧列取默认值的未匹配行，而这些行错误地通过了过滤器。[#107084](https://github.com/ClickHouse/ClickHouse/pull/107084) ([groeneai](https://github.com/groeneai))。
* 修复在 `correlated_subqueries_default_join_kind = 'left'` 时，对将同一列标识符投影两次的数据源 (例如 `SELECT number, *`) 执行关联标量子查询引发 `LOGICAL_ERROR` ("无法在表达式操作 DAG 输入的对应位置找到输入列 ...") 并导致服务器异常终止的问题。[#107112](https://github.com/ClickHouse/ClickHouse/pull/107112) ([groeneai](https://github.com/groeneai))。
* 修复使用旧版 analyzer (`enable_analyzer = 0`) 时，`JOIN` 使用空值安全比较运算符 (`<=>` / `IS NOT DISTINCT FROM`) 且其中一个连接键为标量子查询 (例如 `... JOIN t2 ON (SELECT x FROM t1) <=> t2.k`) 所引发的 `LOGICAL_ERROR` (在调试构建或启用 sanitizer 的构建中会导致服务器异常终止) 。此类查询现在返回常规的 `NOT_FOUND_COLUMN_IN_BLOCK` 错误，而非逻辑错误。[#108123](https://github.com/ClickHouse/ClickHouse/pull/108123) ([groeneai](https://github.com/groeneai))。
* 修复将 `join_algorithm = 'full_sorting_merge'` 用于 `SEMI`/`ANTI` 连接时引发的 `LOGICAL_ERROR` (`Join is supported only for pipelines with one output port`) 和 `NOT_IMPLEMENTED` (`MergeJoinAlgorithm is not implemented for strictness Semi`) 异常，也涵盖对 `EXISTS` 关联子查询去关联后生成的连接。`full_sorting_merge` 现在会拒绝其无法执行的严格性/连接类型组合，使规划器回退到其他已启用的算法，或报告该连接无法执行。[#108658](https://github.com/ClickHouse/ClickHouse/pull/108658) ([groeneai](https://github.com/groeneai))。
* 修复了一个 bug：`JOIN` 的 `WITH TOTALS` 行可能包含默认值 (例如 `0`) ，而非来自连接一侧常量子查询的常量值。该错误结果仅在某些连接顺序下或启用 `query_plan_join_swap_table` 设置时出现。[#108807](https://github.com/ClickHouse/ClickHouse/pull/108807) ([vdimir](https://github.com/vdimir))。
* 修复了 glibc 构建在信号栈尺寸较大的 CPU (例如搭载支持 AMX 内核的 Intel Sapphire Rapids / Granite Rapids) 上运行时启动中止的问题 (`Cannot allocate ThreadStack`、`EINVAL`) 。原因是在调用 `aligned_alloc` 之前，信号备用栈大小未向上取整为页大小的整数倍。[#108813](https://github.com/ClickHouse/ClickHouse/pull/108813) ([groeneai](https://github.com/groeneai))。
* 修复了关联子查询被去关联化为连接、且源关系中某个列名出现多次时引发的 `Block structure mismatch in JoinStep` 逻辑错误 (在 debug/sanitizer 构建中会导致服务器中止) ，例如在 `correlated_subqueries_default_join_kind = 'right'` 下执行 `WITH t AS (SELECT number, * FROM numbers(3)) SELECT *, (SELECT t.number WHERE t.number >= 0) FROM t`。[#109114](https://github.com/ClickHouse/ClickHouse/pull/109114) ([groeneai](https://github.com/groeneai))。
* 修复了 `CREATE USER ... HOST LIKE 'a', 'b'` (以及等效的 `ALTER USER`) 静默地只保留第一个模式的问题。现在所有指定的 `HOST LIKE` 模式都会存储到该用户的主机允许列表中。[#109187](https://github.com/ClickHouse/ClickHouse/pull/109187) ([groeneai](https://github.com/groeneai))。
* 修复了带常量 `ON` 条件的 `ANY JOIN` (例如 `t1 ANY INNER JOIN t2 ON 1`) 返回意外结果的问题：该查询返回的是完整的笛卡尔积，而非 ANY 连接结果 [#109207](https://github.com/ClickHouse/ClickHouse/pull/109207) ([vdimir](https://github.com/vdimir))。
* 修复了全局 `max_rows_in_join` / `max_bytes_in_join` 限制对 parallel\_hash 连接算法不生效的问题：此前设置了 `join_overflow_mode = 'throw'` 的查询可能静默成功，而不会抛出 `SET_SIZE_LIMIT_EXCEEDED`。[#109488](https://github.com/ClickHouse/ClickHouse/pull/109488) ([m-selmi](https://github.com/m-selmi))。
* 修复了在服务器端内联插入解析路径 (`send_table_structure_on_insert_with_inline_data = 0`) 下，多查询流中的 `INSERT ... VALUES` 后跟尾随 SQL 注释 (例如 `VALUES (1) -- comment`) 时导致静默数据丢失的问题。此前该尾随注释会越过终止符 `;` 被当作行数据扫描，致使流中后续查询被静默跳过。[#109643](https://github.com/ClickHouse/ClickHouse/pull/109643) ([groeneai](https://github.com/groeneai))。
* 修复了在 `optimize_move_to_prewhere = 1` 下、`PREWHERE` 于 `FINAL` 之后执行时延迟 `PREWHERE` 的问题：`WHERE` 条件不再被移到延迟的行策略之前，此前这可能改变查询结果。[#109703](https://github.com/ClickHouse/ClickHouse/pull/109703) ([yariks5s](https://github.com/yariks5s))。
* 修复了递归 CTE 将外部作用域中的标识符解析为关联列时 (启用 `allow_experimental_correlated_subqueries = 1`) 出现的 `LOGICAL_ERROR` (`query tree node does not have valid source node`) 。此类查询现在会返回明确的 `UNSUPPORTED_METHOD` 错误。[#109863](https://github.com/ClickHouse/ClickHouse/pull/109863) ([groeneai](https://github.com/groeneai))。
* 修复了 `ORDER BY ... WITH FILL` 在 `Int64`/`UInt64` 列上跳过极大间隙时 (例如以步长 2 跨越接近 2^63 的间隙) 出现的有符号整数溢出问题。该溢出在 sanitizer 下属于未定义行为，在发布构建中则会静默回绕。[#109937](https://github.com/ClickHouse/ClickHouse/pull/109937) ([groeneai](https://github.com/groeneai))。
* 修复了在使用旧版 analyzer (`enable_analyzer = 0`) 时，若 `INTERPOLATE` 目标是 `WITH FILL` 列的别名，会出现 `Invalid number of rows in Chunk` 逻辑错误的问题。此类查询现在会被拒绝，并返回明确的 `INVALID_WITH_FILL_EXPRESSION` 错误。[#110103](https://github.com/ClickHouse/ClickHouse/pull/110103) ([groeneai](https://github.com/groeneai)) 。
* 修复了包含关联子查询 (例如 `exists((SELECT ...))`) 的过滤条件在经 `convert_query_to_cnf` 或 `optimize_and_compare_chain` 优化时出现的逻辑错误 (`Unexpected number of columns in result sample block`) 。[#110187](https://github.com/ClickHouse/ClickHouse/pull/110187) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 嵌套的关联 `EXISTS` 子查询如果引用了其直接外层查询之外的作用域中的列 (即跳过了中间作用域) ，现在会报出明确的 `NOT_IMPLEMENTED` 错误，而不再抛出内部错误 `NOT_FOUND_COLUMN_IN_BLOCK`。[#110310](https://github.com/ClickHouse/ClickHouse/pull/110310) ([groeneai](https://github.com/groeneai)) 。
* 修复了当外层查询的关联列存在重复值、且子查询通过 CROSS JOIN 路径去关联时，关联标量子查询返回错误结果的问题。此前，`count()`、`sum()` 等聚合结果会被错误地乘以重复次数。此问题影响 experimental 功能 `allow_experimental_correlated_subqueries`。[#110311](https://github.com/ClickHouse/ClickHouse/pull/110311) ([groeneai](https://github.com/groeneai)) 。
* 修复了 `ORDER BY ... WITH FILL` 在生成较大填充范围时 (尤其是配合 `INTERPOLATE` 使用时) 不遵守 `max_execution_time`、且难以及时取消的问题。[#110332](https://github.com/ClickHouse/ClickHouse/pull/110332) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 当查询按 sorting key 顺序读取时，不再应用延迟 `FINAL` 优化 (`query_plan_optimize_lazy_final`，默认禁用) 。原因在于该优化替换后的执行计划不会按 sorting key 顺序输出行，而上层计划在经过按序读取优化后可能已依赖这一顺序，进而导致结果排序错误。此外，当小于待读取行数的 `LIMIT` 直接作用于读取步骤时，也不再应用该优化，因为其必需的集合构建过程会使提前终止机制失效。[#110576](https://github.com/ClickHouse/ClickHouse/pull/110576) ([KochetovNicolai](https://github.com/KochetovNicolai)) 。
* 后台异步插入的刷写操作在被 `KILL QUERY` 终止时现在能够及时停止；此前，刷写大量缓冲数据时会无视取消请求，一直解析到结束。[#110652](https://github.com/ClickHouse/ClickHouse/pull/110652) ([tiandiwonder](https://github.com/tiandiwonder)) 。
* 修复了位于 `partial_merge` JOIN 之上的 `GROUP BY ... optimize_aggregation_in_order` 和 `DISTINCT ... optimize_distinct_in_order` 返回错误结果的问题。此前，按序读取优化会穿过 `PartialMergeJoin` 向下传播，但后者会按连接键对左侧输入重新排序，无法保留左侧数据流的原始顺序，从而导致行分组错误。[#110671](https://github.com/ClickHouse/ClickHouse/pull/110671) ([groeneai](https://github.com/groeneai)) 。
* 修复了在 `INTERSECT` 或 `EXCEPT` 查询中使用 CTE 列别名时 (例如 `WITH t (a, b) AS (SELECT 1, 2 INTERSECT SELECT 1, 2) SELECT a, b FROM t`) ，查询因 UNKNOWN\_IDENTIFIER 错误而失败的问题。[#110885](https://github.com/ClickHouse/ClickHouse/pull/110885) ([yariks5s](https://github.com/yariks5s)) 。
* 修复了 `grace_hash` 连接中，多个线程共享读取器且读取溢出块中途失败时可能出现的 `LOGICAL_ERROR: ReadBuffer is canceled. Can't read from it.` 错误。[#111056](https://github.com/ClickHouse/ClickHouse/pull/111056) ([groeneai](https://github.com/groeneai)) 。
* 修复了在 \*\_hash JOIN 期间物化右侧列时使用错误时区的问题。[#111074](https://github.com/ClickHouse/ClickHouse/pull/111074) ([yariks5s](https://github.com/yariks5s))。
* 修复带有 `COMMENT` 子句的 `CREATE` 语句在缺少注释字符串字面量时的行为：现在会抛出语法错误，而不再静默接受被错误解析的查询 (例如，`CREATE VIEW v COMMENT AS SELECT 1` 不会再创建一个不带注释的视图) 。[#111159](https://github.com/ClickHouse/ClickHouse/pull/111159) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复复用的 materialized CTE (`enable_materialized_cte`) 在 `WITH TOTALS` 或 `extremes` 输出被丢弃的分支上被读取时出现的 `LOGICAL_ERROR` (`Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan`) ，涉及外层聚合、`INSERT ... SELECT`、集合操作以及 `EXPLAIN ANALYZE` 等场景。[#111194](https://github.com/ClickHouse/ClickHouse/pull/111194) ([groeneai](https://github.com/groeneai))。
* 修复 `join_algorithm = 'full_sorting_merge'` 在 `LEFT`/`RIGHT`/`FULL`/`ASOFJOIN` 中使用原始零值而非列类型默认值填充未连接行的问题。对于 `Enum` 列 (其默认值为第一个元素，而非 `0`) ，这会导致结果错误 (对填充值的过滤会丢弃未匹配的行，使外连接在无提示的情况下退化为内连接) ，并在查询该列时引发 `UNKNOWN_ELEMENT_OF_ENUM` 错误。[#111197](https://github.com/ClickHouse/ClickHouse/pull/111197) ([groeneai](https://github.com/groeneai))。
* 修复在 `optimize_move_to_prewhere_if_final = 1` 且 `WHERE` 子句为排序键列上的隐式布尔条件 (例如 `WHERE k`) 时，`SummingMergeTree` (以及 `CoalescingMergeTree`) 配合 `FINAL` 返回错误结果的问题。此前键列的值会跨未合并的分片被累加后返回，而不是保持原值。[#111342](https://github.com/ClickHouse/ClickHouse/pull/111342) ([groeneai](https://github.com/groeneai))。
* 修复当左侧包含经 `UNION ALL` 保留下来的重复同名列 (例如 `1 AS b, 1 AS b`) 时，`RIGHT`/`FULL JOIN` 可能出现的逻辑错误 (`Unexpected number of columns in result sample block`) 。[#111554](https://github.com/ClickHouse/ClickHouse/pull/111554) ([groeneai](https://github.com/groeneai))。
* 修复格式化 `EXECUTE AS` 查询时，若其 AST 中某个子节点已被替换 (AST fuzzer 就会这样做) ，客户端会崩溃的问题。`ASTExecuteAsQuery` 现在拥有其 `target_user` 和 `subquery` 子节点的所有权，不再持有指向 `children` 的非拥有型指针。[#111725](https://github.com/ClickHouse/ClickHouse/pull/111725) ([groeneai](https://github.com/groeneai))。
* 修复在 `join_any_take_last_row = 1` 时 `query_plan_join_swap_table` 交换 `ANY JOIN` 两侧导致结果错误的问题：ClickHouse 现在会保留原有的连接侧顺序，确保 `ANY JOIN` 仍返回最后一个匹配行。[#112458](https://github.com/ClickHouse/ClickHouse/pull/112458) ([vdimir](https://github.com/vdimir))。
* 修复在子查询中使用 `getClientHTTPHeader` 时出现 `Context has expired` 异常的问题。[#112533](https://github.com/ClickHouse/ClickHouse/pull/112533) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复 `ON` 子句包含混合条件 (即跨两侧的非等值残余条件，例如 `ON (t1.key = t2.key) AND (t1.a * 10 < t2.a)`) 的 `JOIN` 返回错误结果的问题。只有哈希系列算法能够计算此类条件，但 `full_sorting_merge`、`partial_merge` 以及直接键值连接此前声称支持执行这类连接，实际却静默忽略了残余条件，导致返回多余的行。现在它们会拒绝执行此类连接，转而使用哈希算法。[#112831](https://github.com/ClickHouse/ClickHouse/pull/112831) ([groeneai](https://github.com/groeneai))。
* 修复了逗号连接或 `CROSS` 连接的 `WHERE` 通过非确定性表达式 (如 `rand`) 比较两个表的列时返回错误结果的问题。此类查询可能返回与其自身 `WHERE` 子句相矛盾的行，原因是将该连接改写为 `INNER` 连接时，该表达式被移入了连接键，而连接键会针对每一侧的每一行重新求值。[#112938](https://github.com/ClickHouse/ClickHouse/pull/112938) ([groeneai](https://github.com/groeneai))。
* 修复了解析末尾带有大量无法识别字符的 PromQL 查询 (例如使用 NUL 字节填充的 `FixedString` 值) 时出现的二次方级性能下降问题：由于解析发生在查询分析阶段，解析兆字节级的无效输入以往会使某个线程持续忙碌数十分钟，且无法取消。现在解析器遇到第一个错误时即会停止。[#112944](https://github.com/ClickHouse/ClickHouse/pull/112944) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了对非常量列使用常量除数 -1 调用 `intDiv` 时，最小有符号数的除法 (例如 `intDiv(-9223372036854775808, -1)`) 会静默溢出回绕，而不是像其他执行路径那样抛出 `ILLEGAL_DIVISION` 异常的问题。这种静默回绕还可能导致 `ORDER BY`/`DISTINCT` 结果错误：按顺序读取优化会正确地将除以负常量的 `intDiv` 视为单调函数，而回绕后的值破坏了由此得出的排序顺序。[#113048](https://github.com/ClickHouse/ClickHouse/pull/113048) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在 `enable_analyzer = 0` 时，若 `WHERE` 引用子查询中由 `untuple` 生成的列，会报 `UNKNOWN_IDENTIFIER` 错误的问题，例如 `SELECT t.keys FROM (SELECT untuple(arrayJoin(m)) AS t FROM ...) WHERE t.values > 0`。`enable_optimize_predicate_expression` 改写会将此类谓词以 `HAVING` 的形式下推到子查询中，而此时该名称尚不存在。[#113760](https://github.com/ClickHouse/ClickHouse/pull/113760) ([groeneai](https://github.com/groeneai))。
* 修复了在 `join_algorithm = 'partial_merge'` 下，当右侧带有 totals 时 `JOIN` 返回错误结果的问题：右侧可能未被合并，导致 `LEFT` 连接用默认值替代了真实匹配，而 `INNER`/`RIGHT` 连接则完全不返回任何行。在 `RIGHT`/`FULL` 的未连接行处理路径中，同样的状态会导致空指针解引用，进而使服务器崩溃。[#113936](https://github.com/ClickHouse/ClickHouse/pull/113936) ([groeneai](https://github.com/groeneai))。
* 修复了 `SELECT DISTINCT` 搭配需要读取全部输入的 `LIMIT` 时返回错误结果的问题：`LIMIT n WITH TIES` 会丢弃并列的行，`exact_rows_before_limit = 1` 会报告被截断的 `rows_before_limit_at_least`，而 `GROUP BY ... WITH TOTALS` 仅根据数据流的前一部分计算 totals 行。[#114025](https://github.com/ClickHouse/ClickHouse/pull/114025) ([groeneai](https://github.com/groeneai))。
* 修复了 `SELECT ... FINAL` 的 `PREWHERE` 使用了 `FINAL` 合并所需的列 (`ver`、`is_deleted`、`sign`) 但未选择该列时，抛出 `LOGICAL_ERROR` ("Unexpected number of kept output positions after removing unused columns from `ReadFromMergeTree`") 的问题。[#114746](https://github.com/ClickHouse/ClickHouse/pull/114746) ([groeneai](https://github.com/groeneai))。
* 修复了异步 INSERT 刷新、物化视图处理以及 `EXPLAIN ANALYZE` 中的生命周期问题，该问题可能导致访问已过期的查询跟踪状态。[#114940](https://github.com/ClickHouse/ClickHouse/pull/114940) ([azat](https://github.com/azat))。
* 修复了在时间间隔之间省略分隔逗号时，`CREATE QUOTA` 和 `ALTER QUOTA` 会静默丢弃除最后一个 `FOR INTERVAL` 块之外所有块的问题。此类语句虽然执行成功，但之前的限制均未生效。现在这些时间间隔会像 2020 年之前那样重新累加生效。[#115320](https://github.com/ClickHouse/ClickHouse/pull/115320) ([groeneai](https://github.com/groeneai))。
* 修复了 `randConstant` 的多次调用带有不同别名时，在同一查询中返回两个不同值的问题。按照文档说明，`randConstant` 在整个查询中应只有一个值，且 `SELECT randConstant() = randConstant()` 此前已能返回 `1`，但如果像 `SELECT randConstant() AS a, randConstant() AS b` 这样添加别名，就会得到两个互不相关的值。[#115384](https://github.com/ClickHouse/ClickHouse/pull/115384) ([alexey-milovidov](https://github.com/alexey-milovidov)) 。
* 修复了对损坏的 `MsgPack` 或 `ProtobufList` 文件执行 `SELECT count()` 时永不结束或返回虚构行数的问题。`optimize_count_from_files` 快速路径在统计行数时不要求读取位置向前推进，因此一个仅有两字节的 `ProtobufList` 文件会产生数十亿行，且查询始终无法返回。现在此类输入会被拒绝，并报出与常规读取路径相同的错误。[#115884](https://github.com/ClickHouse/ClickHouse/pull/115884) ([groeneai](https://github.com/groeneai)) 。
* 修复了 `system.distribution_queue` 中的 `broken_data_files` 以及 `BrokenDistributedFilesToInsert` 指标始终报告 `0` 的问题：启动时扫描异步插入队列的过程中，`DistributedAsyncInsertDirectoryQueue::initializeFilesFromDisk` 统计了损坏的字节数，却始终没有递增损坏文件计数器。[#92124](https://github.com/ClickHouse/ClickHouse/pull/92124) ([squalfof](https://github.com/squalfof)) 。

<h3 id="other-bug-fixes">
  其他缺陷修复
</h3>

* 作为内部查询一部分执行的次级查询，现在会作为内部查询记录到日志中。[#108506](https://github.com/ClickHouse/ClickHouse/pull/108506) ([mstetsyuk](https://github.com/mstetsyuk))。
* 修复了当 PREWHERE 条件被拆分为多个读取步骤时，分片中缺失的 DEFAULT 列被填充为类型默认值、而非 DEFAULT 表达式计算结果的问题。[#111795](https://github.com/ClickHouse/ClickHouse/pull/111795) ([yariks5s](https://github.com/yariks5s))。
* 以 `normalized_query_hash` 为键的配额现在会与查询计数器一样，按查询模式统计所有资源 (`read_rows`、`read_bytes`、`result_rows`、`result_bytes`、`execution_time`、`written_bytes`、`errors`) ，而不再全部计入每个用户共享的单个桶中。[#107681](https://github.com/ClickHouse/ClickHouse/pull/107681) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 MySQL `connect_timeout` 以及读写超时不生效的问题：由于采样查询 profiler 的周期性信号会不断重置 MySQL 客户端内部的 poll 截止时间，即使设置了 `connect_timeout = 1`，连接无响应的 MySQL 服务器时仍可能挂起两分钟以上。[#109592](https://github.com/ClickHouse/ClickHouse/pull/109592) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了查询 profiler 启用时，流式插入的块等待超时 (`input_format_max_block_wait_ms`) 可能永远不会触发的问题：每收到一次 profiler 信号，文件描述符的 poll 都会以完整的超时时间重新计时，导致输入源停滞时，部分块的刷写可能被无限期推迟，而不是在达到等待上限时执行。[#109602](https://github.com/ClickHouse/ClickHouse/pull/109602) ([tiandiwonder](https://github.com/tiandiwonder))。
* 修复了启用实验性设置 `make_distributed_plan = 1` 的查询在 `distributed_plan_default_reader_bucket_count` 或 `distributed_plan_default_shuffle_join_bucket_count` 取值过大时出现 `LOGICAL_ERROR` (`std::length_error`) 的问题。现在此类取值会被拒绝，并返回 `INVALID_SETTING_VALUE`。[#109770](https://github.com/ClickHouse/ClickHouse/pull/109770) ([groeneai](https://github.com/groeneai))。
* 修复 `distinct_overflow_mode = 'break'` 的行为：DISTINCT 现在会按文档所述，返回达到上限前累积的部分结果，并停止读取数据源。此前，超出 `max_rows_in_distinct` / `max_bytes_in_distinct` 的那个块会被丢弃 (导致结果被截断或为空) ，且查询会继续读取数据并插入哈希集合，直至输入结束，最终可能引发 `MEMORY_LIMIT_EXCEEDED`。[#110075](https://github.com/ClickHouse/ClickHouse/pull/110075) ([skuznetsov-clickhouse](https://github.com/skuznetsov-clickhouse))。
* 修复 `optimize_aggregation_in_order` 忽略查询取消的问题。`AggregatingInOrderTransform` 现在会在聚合块的过程中检查取消状态，因此被 `KILL QUERY` 或 `max_execution_time` (在默认的 `timeout_overflow_mode = 'throw'` 下) 终止的查询能够及时停止，而不必等整个块处理完毕。[#110104](https://github.com/ClickHouse/ClickHouse/pull/110104) ([groeneai](https://github.com/groeneai))。
* 修复了从 `mysql`/`postgresql`/`sqlite` 系列 PostgreSQL 数据源读取的值无法解析为所声明类型时 (例如将 `text` 列声明为 `Int32`) ，服务器中止的问题 (仅限 debug 和 sanitizer 构建) 。此类类型不匹配现在会作为查询错误报告，不再导致服务器中止。[#110264](https://github.com/ClickHouse/ClickHouse/pull/110264) ([groeneai](https://github.com/groeneai))。
* 修复了解析某些 PRQL 查询 (`SET dialect = 'prql'`) 时服务器中止的问题。此前 `prqlc` 编译器内部发生 panic 时会直接中止进程，而不是作为查询错误报告。[#110316](https://github.com/ClickHouse/ClickHouse/pull/110316) ([groeneai](https://github.com/groeneai))。
* 修复当行策略和 `additional_table_filters` 引用同一个未在查询中选取的列时出现 `NOT_FOUND_COLUMN_IN_BLOCK` 的问题。[#111099](https://github.com/ClickHouse/ClickHouse/pull/111099) ([groeneai](https://github.com/groeneai))。
* 修复了 `randChiSquared`、`randStudentT`、`randFisherF` 和 `randBinomial` 在使用极端参数时挂起的问题。此前此类查询无法通过 `max_execution_time` 或 `KILL QUERY` 中断。现在，即使将 `max_rand_distribution_parameter` 或 `max_rand_distribution_trials` 设置为 0，此类参数也会被拒绝；并且对于 `randBinomial`，`max_rand_distribution_trials` 不能再调高到超过其默认值 10^9。[#111909](https://github.com/ClickHouse/ClickHouse/pull/111909) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `connection_pool_max_wait_ms` 的行为，使其文档所述的默认值 `0` 真正表示无限超时。此前，查询在发现连接池已满时会在紧密循环中反复重试，占用 CPU，并在每次迭代时记录 `No free connections in pool. Waiting 0 ms.`。现在它会一直等待，直到有连接归还到连接池。[#112380](https://github.com/ClickHouse/ClickHouse/pull/112380) ([groeneai](https://github.com/groeneai))。
* 修复了 `replaceOne`、`replaceAll`、`replaceRegexpOne` 和 `replaceRegexpAll` 忽略 `max_execution_time` 和 `KILL QUERY` 的问题。现在单次调用在执行过程中会检查是否已被取消，因此针对大值或大量行的长时间替换操作会及时停止，而不会一直占用服务器线程直至完成。此类调用没有可返回的部分结果，因此在 `timeout_overflow_mode = 'break'` 下，它会将超时作为错误引发：常量折叠时总是如此；在管道中，只要该检查点先于 executor 的块间检查被触发，也会如此 (块间检查仍会静默停止查询) 。[#112483](https://github.com/ClickHouse/ClickHouse/pull/112483) ([groeneai](https://github.com/groeneai))。
* 修复了 `countSubstrings`、`countSubstringsCaseInsensitive` 和 `countSubstringsCaseInsensitiveUTF8` 忽略 `KILL QUERY` 和 `max_execution_time` 的问题：此前，处理大量行或大量匹配项的调用可能在查询取消后仍持续运行数分钟。[#113369](https://github.com/ClickHouse/ClickHouse/pull/113369) ([groeneai](https://github.com/groeneai))。
* 修复了查询在发起服务器上极快完成时可能挂起 (长达 `receive_timeout` 秒) 的问题。[#113551](https://github.com/ClickHouse/ClickHouse/pull/113551) ([nickitat](https://github.com/nickitat))。
* 修复了 `countMatches` 和 `countMatchesCaseInsensitive` 在统计单个大值的匹配数时忽略 `max_execution_time` 和 `KILL QUERY` 的问题，该问题会导致已取消的查询仍持续运行数分钟。当参数为常量时，调用发生在查询分析阶段，此时尚无管道可用于取消该调用。[#113886](https://github.com/ClickHouse/ClickHouse/pull/113886) ([groeneai](https://github.com/groeneai))。
* 修复了查询可能在达到 `max_execution_time` 前最多 1 ms 就被取消，并报出自相矛盾的错误 `Timeout exceeded: elapsed 999.672 ms, maximum: 1000 ms` 的问题。[#114559](https://github.com/ClickHouse/ClickHouse/pull/114559) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `pointInPolygon` 在使用边界框无界的常量多边形 (例如某个坐标达到 `+-DBL_MAX`) 时发生越界读取的问题。现在此类多边形会被拒绝并报错 `BAD_ARGUMENTS`，而包含空环的多边形会被视为没有内部区域。此前，该查询可能返回错误结果，或在启用了加固或 sanitizer 的构建中导致服务器中止。[#115035](https://github.com/ClickHouse/ClickHouse/pull/115035) ([groeneai](https://github.com/groeneai))。
* 修复了一个竞态条件，该问题可能导致 `STREAM BOUNDED` 查询返回的行数少于其开始前已提交的行数 (通常一行都不返回) 。[#115543](https://github.com/ClickHouse/ClickHouse/pull/115543) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在 `make_distributed_plan = 1` 下，当窗口查询的排序列经过一个未引用该列的 `Expression` 步骤时，查询计划优化期间引发 `Unknown identifier` 错误的问题。[#115890](https://github.com/ClickHouse/ClickHouse/pull/115890) ([groeneai](https://github.com/groeneai))。
* 修复了 `h3kRing`、`h3HexRing`、`h3Line` 和 `h3ToChildren` 在展开行块时忽略 `max_execution_time` 和 `KILL QUERY` 的问题。[#115893](https://github.com/ClickHouse/ClickHouse/pull/115893) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了原生 Parquet V3 读取器中，当 `PREWHERE` 的多个合取项共享同一个中间表达式时出现 `NOT_FOUND_COLUMN_IN_BLOCK` 错误的问题 (由先前的回归引入) 。[#107059](https://github.com/ClickHouse/ClickHouse/pull/107059) ([groeneai](https://github.com/groeneai))。
* 修复了在启用 `output_format_parquet_parallel_encoding` (默认启用) 且 `max_threads` 大于 1 时写入 Parquet 会挂起的问题。如果编码器未能调度额外的线程，其活动线程计数器会发生下溢，导致写入可能永久停滞，既无法完成也不会报错。[#112959](https://github.com/ClickHouse/ClickHouse/pull/112959) ([groeneai](https://github.com/groeneai))。
* 修复了读取 Parquet 文件时，若其 Thrift 元数据声明的容器或字符串长度大于元数据本身，会导致无限制内存分配的问题。现在此类长度会被直接拒绝，不再为其分配内存。[#113212](https://github.com/ClickHouse/ClickHouse/pull/113212) ([groeneai](https://github.com/groeneai))。
* 修复了 Parquet v3 读取器中的 `std::out_of_range` 异常 (`Logical error: 'std::exception. Code: 1001, type: std::out_of_range'`，在 debug 和 sanitizer 构建中还会导致服务器中止) ：当某个仅用于过滤求值的列在其输出槽位已被丢弃后才被调度解码时，就会触发该异常。[#113956](https://github.com/ClickHouse/ClickHouse/pull/113956) ([groeneai](https://github.com/groeneai))。
* 修复了 profile events 和内存跟踪器中的数据竞争问题。[#112466](https://github.com/ClickHouse/ClickHouse/pull/112466) ([mstetsyuk](https://github.com/mstetsyuk))。
* 修复了使用 `trace_profile_events_list` 设置将特定 profile events 的堆栈跟踪写入 `system.trace_log` 时，profile events 中理论上可能出现的数据竞争。[#113553](https://github.com/ClickHouse/ClickHouse/pull/113553) ([mstetsyuk](https://github.com/mstetsyuk))。
* 修复了当除法运算引发浮点异常 (除以零或 `INT_MIN / -1`) 时，`intDivOrNull`、`moduloOrNull` 和 `positiveModuloOrNull` 返回 `0` 而非 `NULL`，以及 `intDivOrNull` 和 `intDivOrZero` 抛出异常而非返回 `NULL` / `0` 的问题，有符号/无符号混合参数的情况也已一并修复。[#101976](https://github.com/ClickHouse/ClickHouse/pull/101976) ([yariks5s](https://github.com/yariks5s))。
* 修复了 `Array` 和 `Map` 值与 `NULL` 比较时 `IS DISTINCT FROM` 结果不正确的问题。[#103162](https://github.com/ClickHouse/ClickHouse/pull/103162) ([ylw510](https://github.com/ylw510))。
* 修复了 `groupConcat` 混用参数化写法和双参数写法时的问题，例如 `groupConcat(',', 2)(x, '/')`：此前行数限制参数会被静默丢弃，导致返回所有行而非指定的行数；现在第二个参数中的分隔符会正确覆盖该参数。[#104882](https://github.com/ClickHouse/ClickHouse/pull/104882) ([yariks5s](https://github.com/yariks5s))。
* 修复了使用 CAST 将较小的时间间隔单位转换为较大单位时存在的缺陷。[#105058](https://github.com/ClickHouse/ClickHouse/pull/105058) ([yariks5s](https://github.com/yariks5s))。
* 修复了在按序读取管道 (`optimize_read_in_order = 1` 且 `read_in_order_use_virtual_row_per_block = 1`) 下运行 `LIMIT ... WITH TIES` 查询时出现的逻辑错误 (`Assertion 'row < chunk.getNumRows()' failed`) 。[#105102](https://github.com/ClickHouse/ClickHouse/pull/105102) ([groeneai](https://github.com/groeneai))。
* 修复了在查询中同时使用 `enable_sharding_aggregator = 1` 和 `UNION ALL`，且 `max_streams_for_union_step` 小于管道宽度时出现的 `Logical error: 'Pipeline stuck'`。现在，`BufferedShardByHashTransform` 会在输入耗尽后立即结束空队列的输出端口；当某个被请求的空端口没有可排出的数据时，即使相邻队列已达到背压上限，它也会继续拉取输入。[#106251](https://github.com/ClickHouse/ClickHouse/pull/106251) ([groeneai](https://github.com/groeneai))。
* 修复了在 `plain` 对象存储磁盘 (例如 `s3_plain`) 上，`removeDirectory` 会像递归删除一样删除非空目录中所有文件的问题。现在删除非空目录会失败并报错 `CANNOT_RMDIR`，而递归删除会显式处理目录内容。[#106281](https://github.com/ClickHouse/ClickHouse/pull/106281) ([RinChanNOWWW](https://github.com/RinChanNOWWW))。
* 修复了配置了 `<lifetime>` 的 `executable_pool` 用户自定义函数无法感知底层脚本变更的问题。此前，只有 `SYSTEM RELOAD FUNCTIONS` 才会重新读取修改后的脚本；而按 `<lifetime>` 周期性重新加载时，执行的仍是旧版本。[#107087](https://github.com/ClickHouse/ClickHouse/pull/107087) ([groeneai](https://github.com/groeneai))。
* 修复了工作线程启动 profiler 与服务器关闭之间，在服务器全局 trace collector 上发生的数据竞争。[#107307](https://github.com/ClickHouse/ClickHouse/pull/107307) ([groeneai](https://github.com/groeneai))。
* 修复了服务器关闭期间偶发的异常中止问题 (`std::future_error`，"The associated promise has been destructed prior to the associated state becoming ready") ，其原因是通过 `threadPoolCallbackRunnerUnsafe` 调度的任务在运行前就被从线程池队列中丢弃。[#107383](https://github.com/ClickHouse/ClickHouse/pull/107383) ([groeneai](https://github.com/groeneai))。
* 修复了 `FileLog` 的逻辑错误 (`Last stored last_written_position in meta file ... is bigger than current last_written_pos`) ，该错误可能在被监视的文件被删除并以相同 inode 重新创建时出现。[#107617](https://github.com/ClickHouse/ClickHouse/pull/107617) ([groeneai](https://github.com/groeneai))。
* 修复了 `toTime64` 和 `CAST(... AS Time64)` 在 `saturate` 和 `ignore` 溢出模式下未将超出范围的值限制在 `Time64` 范围内的问题，该问题可能导致某些值显示相同、比较时却不相等。[#108028](https://github.com/ClickHouse/ClickHouse/pull/108028) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了正则表达式 "match all" 类函数 `extractAll`、`extractAllGroupsVertical`、`extractAllGroupsHorizontal`、`countMatches` 和 `splitByRegexp` 对零宽断言 (`\b`、`^`、`$`) 处理不正确的问题。例如，`extractAll('new york is the greatest', '\b(\w)')` 现在会正确返回每个单词的首字母，而不是所有字母。[#108047](https://github.com/ClickHouse/ClickHouse/pull/108047) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在使用非 `splitByNonAlpha` 分词器的文本索引上调用 `hasToken` 时返回错误结果的问题。[#108066](https://github.com/ClickHouse/ClickHouse/pull/108066) ([rschu1ze](https://github.com/rschu1ze))。
* 修复了当输入精度高于时间间隔单位时，`toStartOfInterval` 和 `dateTrunc` 返回四舍五入后的值、而非所在时间间隔起点的问题。例如，`toStartOfInterval(toDateTime64('2023-10-09 10:11:12.000999', 6), INTERVAL 1 millisecond)` 返回的是 `10:11:12.001` 而非 `10:11:12.000`。带显式 origin 参数的重载同样受影响。[#108186](https://github.com/ClickHouse/ClickHouse/pull/108186) ([yariks5s](https://github.com/yariks5s))。
* 修复了 `replaceRegexpOne` 和 `replaceRegexpAll`，使 `.` 默认匹配换行符，与其他正则表达式函数的行为保持一致。[#108265](https://github.com/ClickHouse/ClickHouse/pull/108265) ([linjiayu1025-collab](https://github.com/linjiayu1025-collab))。
* 修复了轻量级 UPDATE/DELETE 的条件被重复计算两次的问题。[#108323](https://github.com/ClickHouse/ClickHouse/pull/108323) ([ofeliacode](https://github.com/ofeliacode))。
* 修复了 `arrayPartialSort()` 在 limit 参数为非常量时出现的问题。[#108327](https://github.com/ClickHouse/ClickHouse/pull/108327) ([vitlibar](https://github.com/vitlibar))。
* 修复了正则表达式函数 (`match`、`extract`、`extractAll`、`replaceRegexpOne`、`replaceRegexpAll` 等) 在模式中包含 NUL (`\0`) 字节时静默返回错误结果的问题。现在 NUL 会被视为普通的字面字节，与 RE2 的行为一致。[#108427](https://github.com/ClickHouse/ClickHouse/pull/108427) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `changeYear`/`changeMonth`/`changeDay`/`changeHour`/`changeMinute`/`changeSecond` 作用于 `DateTime64(N)` 参数时，使用硬编码的默认标度 (3) 而非 `N` 来创建结果列的问题。此前值按标度 `N` 计算，但列对象声明的标度为 3，导致其结构与类型不一致。[#108551](https://github.com/ClickHouse/ClickHouse/pull/108551) ([groeneai](https://github.com/groeneai))。
* 修复了当集合运算 (`INTERSECT` / `UNION ALL` / `EXCEPT`) 所组合的分支中使用了关联子查询，且设置了 `correlated_subqueries_default_join_kind = 'left'` 时出现的 `LOGICAL_ERROR` ("Trying to extract chunk from ChunkBuffer before all inputs are finished") 。[#108554](https://github.com/ClickHouse/ClickHouse/pull/108554) ([groeneai](https://github.com/groeneai))。
* 修复了 `changeYear`、`changeMonth`、`changeDay`、`changeHour`、`changeMinute` 和 `changeSecond` 中与 `DateTime64` 相关的缺陷：纳秒精度 (标度 9) 的输入不再抛出 `DECIMAL_OVERFLOW`，纪元之前的亚秒级输入现在也能返回正确的日历秒。[#108681](https://github.com/ClickHouse/ClickHouse/pull/108681) ([takumihara](https://github.com/takumihara))。
* 避免在编译超大正则表达式 (例如包含数十万个通配符的 `LIKE` 或 `match` 模式) 时产生过多的服务器日志输出和过长的错误消息；此类模式现在会直接失败，并报出明确的 `CANNOT_COMPILE_REGEXP` 错误。[#108821](https://github.com/ClickHouse/ClickHouse/pull/108821) ([Algunenano](https://github.com/Algunenano))。
* 修复了当源类型与目标类型的物理类型相同时，`reinterpret(x, 'Decimal128(scale)')` (以及目标为 `Decimal32`/`Decimal64`/`Decimal256`/`DateTime64` 的情况) 生成的结果列内部标度为源标度、而非所请求目标标度的问题。此前值本身正确，但列对象的结构与其声明的类型不一致。[#108878](https://github.com/ClickHouse/ClickHouse/pull/108878) ([groeneai](https://github.com/groeneai))。
* 修复了在连接失步或处于模糊测试时，将超出范围的协议数据包类型转换为字符串 (例如在 "Unexpected packet from server" / "Received ... packet" 错误消息中) 所引发的未定义行为。[#108885](https://github.com/ClickHouse/ClickHouse/pull/108885) ([groeneai](https://github.com/groeneai))。
* 修复 `changeYear`/`changeMonth`/`changeDay`/`changeHour`/`changeMinute`/`changeSecond` 作用于 `DateTime64(N)` 时，以硬编码的默认标度 3 (而非 `N`) 构建结果列的问题；同时修复 `timeSlots` 作用于 `DateTime64` 时，其声明的返回类型忽略可选参数 `Size` 标度的问题。这两个问题都会导致生成列的实际标度与声明类型不一致：将结果传给 `arrayPushBack`/`arrayPushFront`/`arrayConcat` 时会引发 `LOGICAL_ERROR` (`writeSlice expects same column types`) ，而当 `Size` 使用最大标度时，`timeSlots` 会返回错误的时间戳。[#108994](https://github.com/ClickHouse/ClickHouse/pull/108994) ([groeneai](https://github.com/groeneai))。
* 修复 ProfileEvents 增量非单调的问题 [#109180](https://github.com/ClickHouse/ClickHouse/pull/109180) ([azat](https://github.com/azat))。
* 修复 `SAMPLE` 比率的指数绝对值超出 `Int32` 范围时 (例如 `SAMPLE 1e-3000000000`) 被静默当作 `SAMPLE 1` 处理的问题。[#109197](https://github.com/ClickHouse/ClickHouse/pull/109197) ([Algunenano](https://github.com/Algunenano))。
* 修复了 `toUTCTimestamp`/`fromUTCTimestamp` (及其别名 `to_utc_timestamp`/`from_utc_timestamp`) 和 `toTime64` 在 `DateTime64` 路径上的两个缺陷。其一，接近 `Int64` 边界时会发生有符号整数溢出 (现改用 `Int128` 计算，并截断到可表示范围内) 。其二，对于接近时区偏移边界的负小数值会返回错误结果：拆分秒数时向零截断，导致 `timezoneOffset()` 检查的是下一秒，从而可能在 DST/偏移变化处取错一侧。[#109738](https://github.com/ClickHouse/ClickHouse/pull/109738) ([groeneai](https://github.com/groeneai))。
* 修复了行策略过滤表达式使用 `arrayJoin` 时出现的逻辑错误 (`column->size() == num_rows`) ；此类过滤器现在会被拒绝。[#109753](https://github.com/ClickHouse/ClickHouse/pull/109753) ([Algunenano](https://github.com/Algunenano))。
* 修复了 `generateRandomStructure()` 在类型嵌套超过内部深度限制时，偶尔会生成两个数据类型拼接在一起的无效结构字符串 (例如 `Decimal32(7)IPv4`) ，导致结果无法解析的问题。[#109928](https://github.com/ClickHouse/ClickHouse/pull/109928) ([groeneai](https://github.com/groeneai))。
* 修复了 `accurateCastOrDefault` 中查询设置的传递问题，以及 `Dynamic` 和 `Variant` 所编码的源 `NULL` 值未能保留的问题。[#109946](https://github.com/ClickHouse/ClickHouse/pull/109946) ([Avogar](https://github.com/Avogar))。[#114912](https://github.com/ClickHouse/ClickHouse/pull/114912) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复 `max_bytes_in_distinct` 和 `max_bytes_in_set`：字符串键存储在 arena 中，而该 arena 未被纳入限制检查，因此对字符串键执行 DISTINCT / IN 时，内存占用可能超出字节限制，超出量可达全部键数据的大小 (且随键长度无上限增长) 。现在这些限制会将 arena 计算在内，与文档描述一致；字符串键接近字节限制的查询现在可能会更早 (且正确地) 触发限制。[#110120](https://github.com/ClickHouse/ClickHouse/pull/110120) ([skuznetsov-clickhouse](https://github.com/skuznetsov-clickhouse))。
* 修复了读取内部维度大小为零的 Npy 文件时的问题，使物化后的行与优化及未优化的 `count()` 结果保持一致。[#110146](https://github.com/ClickHouse/ClickHouse/pull/110146) ([qiuyanjun888](https://github.com/qiuyanjun888))。
* 修复 `indexHint`/`ignore`/`isZeroOrNull` 函数接收到类型解析为 `Nothing` 的参数时 (例如在 `indexHint(assumeNotNull(materialize(NULL)))` 这类表达式中) 出现的逻辑错误 (在 debug/sanitizer 构建版本中会导致服务器中止) 。[#110192](https://github.com/ClickHouse/ClickHouse/pull/110192) ([groeneai](https://github.com/groeneai))。
* 修复了 `plain_rewritable` 磁盘上的某个已有路径被重写为不同大小的内容后，读取文件出错的问题：内存中的元数据仍保留过时的文件大小，可能导致读取失败并报错 `UNEXPECTED_END_OF_FILE`。[#110304](https://github.com/ClickHouse/ClickHouse/pull/110304) ([thevar1able](https://github.com/thevar1able))。
* 现在会拒绝小于 1.0 的 `vector_search_index_fetch_multiplier` 值，以免计算出的拉取数量被截断为零，导致 ANN 搜索返回空结果。[#110452](https://github.com/ClickHouse/ClickHouse/pull/110452) ([tamish560](https://github.com/tamish560))。
* 修复了插入的值中含有数值类型转换表达式 (例如 `initializeAggregation('sumState', 0::UInt64)`) 时，偶发 `Cannot parse string ... as UInt64 ... While executing ValuesBlockInputFormat` 错误的问题。[#110637](https://github.com/ClickHouse/ClickHouse/pull/110637) ([groeneai](https://github.com/groeneai))。
* 修复了 `readWKT` 拒绝带前导空白字符的 WKT 字符串 (例如 `readWKT(' POINT(1 2)')`) 的问题，而带类型的 `readWKTPoint`/`readWKTPolygon`/... 读取器以及 WKT 语法均接受此类字符串。[#110706](https://github.com/ClickHouse/ClickHouse/pull/110706) ([groeneai](https://github.com/groeneai))。
* 修复了消耗时间间隔长度为零的配额 (例如 CREATE QUOTA q FOR INTERVAL 0 SECOND MAX queries = 1000) 时服务器崩溃 (整数除以零) 的问题。现在创建配额时会拒绝非正的时间间隔时长。[#110846](https://github.com/ClickHouse/ClickHouse/pull/110846) ([PedroTadim](https://github.com/PedroTadim))。
* 修复了 FIPS 构建中使用 Ed25519 SSH 密钥 (`CREATE USER ... IDENTIFIED WITH ssh_key ... TYPE 'ssh-ed25519'`，或在 `users.xml` 中配置此类密钥) 时发生崩溃的问题。Ed25519 未获 FIPS 认可，此类密钥现在会被拒绝，并返回明确的 `LIBSSH_ERROR` 错误。[#110891](https://github.com/ClickHouse/ClickHouse/pull/110891) ([thevar1able](https://github.com/thevar1able))。
* 基于 `QBit` 的转置距离函数 (`cosineDistanceTransposed`、`L2DistanceTransposed`、`dotProductTransposed`) 现在对截断为 `precision` 个位平面的值采用有界的低精度重建，不再将其重建为粗粒度单元的下边界 (被丢弃的位以零填充) 。零填充会使所有重建值都偏向零，且在低精度下会退化：对于 precision 为 1 的 `QBit(BFloat16)`，仅保留符号位，因此所有值都被重建为 `±0.0`，每一行的距离都是同一个常量，不含任何排序信息。现在的重建方式取决于丢弃了哪些位：原始 `Int8` 编码被重建为其单元中心 (与 `...TransposedQuantized` 路径已采用的 `Lloyd-Max` 重建一致) ；precision 为 1 的浮点值变为标准的符号量化；保留完整指数、仅丢弃尾数位的浮点值被重建为其所在 binade 内的有界中点 (真正的零或 `±0.0` 仍保持为精确零，并单独划出非有限值单元，使 `±inf` 保持精确的无穷大；关于存在歧义的 `NaN` 单元，请参见下文说明) ；而在指数位仍被截断时，则保留有界下边界，因此较小的 `precision` 能以精度换取速度，而不会让数值膨胀若干个数量级。全精度结果保持不变。[#110911](https://github.com/ClickHouse/ClickHouse/pull/110911) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了原生 ORC 读取器对损坏的 ORC 文件进行 schema 推断时的越界读取问题：此类文件的类型树所声明的列数多于 stripe footer 中的列编码数。现在会以 `CANNOT_EXTRACT_TABLE_STRUCTURE` 错误拒绝此类文件，而不会在 debug/sanitizer 构建中导致服务器中止。[#110967](https://github.com/ClickHouse/ClickHouse/pull/110967) ([groeneai](https://github.com/groeneai))。
* 现在每个 SSH 密钥都会单独计入 `max_authentication_methods_per_user` 限制，因此无论使用何种语法，该限制都能一致生效。此前，单个 `ssh_key` 方法中的多个密钥只算作一个。[#111181](https://github.com/ClickHouse/ClickHouse/pull/111181) ([TheMC47](https://github.com/TheMC47))。
* Iceberg REST 目录在凭证过期时，现在会报告底层错误，而不再静默报告 `UNKNOWN_TABLE`。[#111379](https://github.com/ClickHouse/ClickHouse/pull/111379) ([alesapin](https://github.com/alesapin))。
* 修复了 `readWKTPoint`/`readWKT` 在处理带维度标记的空点 (例如 `POINT M EMPTY`) 时，返回未初始化坐标 (标量) 或上一行坐标 (向量化) 的问题。此类输入现在会被拒绝并报 `CANNOT_PARSE_TEXT` 错误，与 `POINT EMPTY` 的行为保持一致。[#111517](https://github.com/ClickHouse/ClickHouse/pull/111517) ([groeneai](https://github.com/groeneai))。
* 创建 `minmax` 统计信息时，现在会发出警告，而不再抛出异常。[#111785](https://github.com/ClickHouse/ClickHouse/pull/111785) ([hanfei1991](https://github.com/hanfei1991))。
* 确保 `randBinomial` 在退化概率 `0` 和 `1` 下，无论试验次数多少均可正常使用。[#112021](https://github.com/ClickHouse/ClickHouse/pull/112021) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了 `system.s3_queue_settings` 中 `bucketing_mode`、`partitioning_mode`、`partition_regex` 和 `partition_component` 的值显示错误的问题。[#112300](https://github.com/ClickHouse/ClickHouse/pull/112300) ([bharatnc](https://github.com/bharatnc))。
* PromQL 查询中的错误现在会报告正确的位置。[#112494](https://github.com/ClickHouse/ClickHouse/pull/112494) ([fallintoplace](https://github.com/fallintoplace))。
* `SYSTEM DISABLE FAILPOINT` 现在会拒绝不存在的 fail point 名称，并像 `SYSTEM ENABLE FAILPOINT` 一样抛出 `BAD_ARGUMENTS`。此前，名称输错时仍会报告成功，而目标 fail point 依旧处于启用状态，且不会提示实际上并未禁用任何内容。[#112680](https://github.com/ClickHouse/ClickHouse/pull/112680) ([groeneai](https://github.com/groeneai))。
* 修复了读取 `Nested` 元素子列 (其所在列曾被删除后重新添加) 时类型错误的问题。将此类子列与其父列一同查询时，子列位置上返回的是整个元素，而数据块声明的仍是元素类型，从而在 release 构建中产生任意值，在 debug 和 sanitizer 构建中触发逻辑错误。[#112769](https://github.com/ClickHouse/ClickHouse/pull/112769) ([groeneai](https://github.com/groeneai))。
* 拒绝单位重复或未按从大到小顺序排列的 PromQL 时长。[#112954](https://github.com/ClickHouse/ClickHouse/pull/112954) ([fallintoplace](https://github.com/fallintoplace))。
* 修复了 `replaceRegexpOne`/`replaceRegexpAll` 中的未定义行为 (向 `memcpy` 传入空指针) ：当替换字符串引用了未参与匹配的捕获组时会触发该问题，例如 `replaceRegexpAll('abc', '(a)|(b)', '\\2')`。[#113012](https://github.com/ClickHouse/ClickHouse/pull/113012) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了在 ClickHouse 26.3 中使用 `unicode_word` 分词器创建的文本索引无法在后续版本中加载的兼容性问题。[#113061](https://github.com/ClickHouse/ClickHouse/pull/113061) ([rschu1ze](https://github.com/rschu1ze))。
* 拒绝 PromQL 字符串转义中无效的 Unicode 代理码点。[#113203](https://github.com/ClickHouse/ClickHouse/pull/113203) ([fallintoplace](https://github.com/fallintoplace))。
* 拒绝 PromQL 字符串中无效的跨分隔符转义。[#113587](https://github.com/ClickHouse/ClickHouse/pull/113587) ([fallintoplace](https://github.com/fallintoplace))。
* 修复了当第一个参数在窗口帧内为常量时，`theilsU` 在该窗口帧上返回任意值而非 0 的问题。[#113691](https://github.com/ClickHouse/ClickHouse/pull/113691) ([alexey-milovidov](https://github.com/alexey-milovidov))。
* 修复了通过原生协议接收某些格式错误的 `Replicated` 序列化列时报告的错误码：此类列现在会以 `INCORRECT_DATA` 被拒绝，而不再报告 `LOGICAL_ERROR` (后者在 debug 和 sanitizer 构建中会导致服务器中止) 。[#114186](https://github.com/ClickHouse/ClickHouse/pull/114186) ([Avogar](https://github.com/Avogar))。
* 修复了对较低精度的 `Decimal64` 进行重新缩放时若 `Int64` 溢出，会生成错误 (且往往符号相反) 的 `Time64` 字面量和 `IN` 列表常量的问题。此类转换现在会报告 `DECIMAL_OVERFLOW`，与 `DateTime64` 分支及显式 `CAST` 的行为一致。[#114546](https://github.com/ClickHouse/ClickHouse/pull/114546) ([groeneai](https://github.com/groeneai))。
* PromQL 选择器现已支持带引号的指标名和标签名。[#114551](https://github.com/ClickHouse/ClickHouse/pull/114551) ([fallintoplace](https://github.com/fallintoplace))。
* 修复了 `ReplicatedMergeTree` 表在经由 attach 线程执行的启动尝试失败后，一直处于只读状态的问题。现在会正确调度重启重试，自动恢复机制及其会话检查得以恢复正常。[#114802](https://github.com/ClickHouse/ClickHouse/pull/114802) ([azat](https://github.com/azat))。
* `timeSeriesRange` 和 `timeSeriesFromGrid` 会对 1970 年之前的时间戳误报 `DECIMAL_OVERFLOW`，原因是起始/结束时间戳被当作无符号值读取。此外，对于 `DateTime`/`UInt32` 时间戳，步长会被静默截断为低 32 位。现在所有计算均使用 `Int64` 进行。[#114815](https://github.com/ClickHouse/ClickHouse/pull/114815) ([vitlibar](https://github.com/vitlibar))。
* 修复了查询因 `MEMORY_LIMIT_EXCEEDED` 失败后，异步插入中可能出现异常的问题；同时修复了 `async_insert_queue_flush_on_shutdown`，确保队列中的插入在服务器关闭时能够被刷写。[#114839](https://github.com/ClickHouse/ClickHouse/pull/114839) ([azat](https://github.com/azat))。
* 修复了当 `sequenceMatch`、`sequenceCount` 或 `sequenceMatchEvents` 的模式中包含事件编号 `0` (例如 `sequenceMatch('(?0)')`) 时，抛出 `out_of_range` 异常并以内部错误 `Code: 1001` 呈现的问题。此类模式现在会以 `BAD_ARGUMENTS` 被拒绝。仅包含单个符号的时间条件 (例如 `sequenceMatch('(?1)(?t>+)(?2)')`) 此前会被静默视为 `(?t>0)`，现在会以 `SYNTAX_ERROR` 被拒绝。[#115056](https://github.com/ClickHouse/ClickHouse/pull/115056) ([groeneai](https://github.com/groeneai))。
* 修复了当坐标不是 `Float64` 时，`geoToH3` 的错误信息中参数位置和类型均有误的问题。在默认设置 `geotoh3_argument_order = 'lat_lon'` 下，错误信息会指向另一个参数，并打印该参数的类型。[#115503](https://github.com/ClickHouse/ClickHouse/pull/115503) ([groeneai](https://github.com/groeneai))。
* 修复了 text、tokenbf\_v1 和 ngrambf\_v1 索引中反斜杠转义字符无效的问题。[#115634](https://github.com/ClickHouse/ClickHouse/pull/115634) ([ahmadov](https://github.com/ahmadov))。
* 修复了 `TZ` 环境变量为空时服务器无法启动的问题。[#68921](https://github.com/ClickHouse/ClickHouse/pull/68921) ([ardenwick](https://github.com/ardenwick))。
