发布说明

PostgreSQL 17.5

E.5. 17.5 发布 #

发布日期:. 2025-05-08

本次发布包含自 17.4 以来的多项修复。 有关 17 主版本中新特性的更多信息,请参见 Section E.10

E.5.1. 迁移到版本 17.5 #

对于运行 17.X 的用户,无需执行转储/恢复。

不过,如果你在分区表上有自引用外键约束,则可能需要重新创建这些约束,以确保它们得到正确实施。见下文第二条变更记录。

此外,如果你有任何 BRIN bloom 索引,建议在更新后对其重建索引。见下文第三条变更记录。

此外,如果你是从早于 17.1 的版本升级,请参见 Section E.9

E.5.2. 变更 #

  • 在检查声称采用 GB18030 编码但实际编码无效的字符串时,避免发生一字节缓冲区过读(Noah Misch, Andres Freund) § §

    虽然可能性不高,但如果内存末尾出现一个不完整的多字节字符,就可能发生 SIGSEGV 崩溃。无论在服务器端还是在使用 libpq 的应用中,都可能出现这种情况。 (CVE-2025-4207)

  • 正确处理分区表上的自引用外键(Álvaro Herrera) §

    如果外键约束引用的表就是同一个分区表,那么在创建或附加分区时,系统未能为该外键约束建立所需的目录项。这导致该约束未能得到完整实施。

    要修复此问题,如果在该约束创建之后又创建或附加过分区,你应当删除并重新创建分区表上的所有自引用外键。请注意,当前可能已经存在违反约束的行,在这种情况下重新创建约束会失败,你需要先修复这些行后再试。

  • brin_bloom_union() 中合并压缩 BRIN 摘要时避免数据丢失(Tomas Vondra) §

    代码未考虑解压结果可能与输入对象并不完全相同,这会导致部分数据未能加入合并后的摘要,进而使索引搜索漏掉某些行。

    这个错误自 v14 引入 BRIN bloom 索引时就已存在,但当时这条代码路径很少触发。在 v17 中触发它的概率大幅提高,因为并行索引构建现在会使用这段代码。

  • 修复在 FROM 中对视图或函数使用整行表引用的 UPDATEDELETEMERGE 查询中,意外报出 attribute has wrong type 错误的问题(Tom Lane) §

  • 修复带有 DO NOTHING 动作的分区表 MERGE(Tender Wang) §

    某些情况下会报出 unknown action in MERGE WHEN clause 错误。

  • 防止在表具有域数据类型的 GENERATED 列且该域约束禁止 null 值时,INSERT 命令失败(Jian He) §

    即使生成表达式产生了完全正常的结果,也会错误报告约束失败。

  • 正确处理出现在 WITH 内部某个 INSERT/UPDATE/DELETE/MERGE 命令所附 WITH 子句中的外层 CTE 名称引用(Tom Lane) §

    解析器既未能识别不允许的递归情况,也未在将 CTE 排序为可用顺序时考虑这类引用。

  • 修复 JSON 构造表达式的键中类型转换被错误处理的问题(Amit Langote) §

  • 当参数为匿名记录类型时,不要尝试并行化 array_agg()(Richard Guo, Tom Lane) §

    与并行工作进程通信的协议不支持识别某个工作进程返回的具体记录类型。

  • 修复 ARRAY(subquery)ARRAY[expression, ...] 结构,使其在输入类型为 int2vectoroidvector 时产生合理结果(Tom Lane) §

    该补丁恢复了 PostgreSQL 9.5 之前的行为:结果类型为 int2vector[]oidvector[]

  • 修复解析 Ispell 字典时可能错误报告无效词缀的问题(Jacob Brazeal) §

  • 修复 ALTER TABLE ADD COLUMN 在域类型带有默认值时的处理,使其能够正确工作(Jian He、Tom Lane、Tender Wang) § §

    如果某个域类型具有默认值,那么添加该类型的列时,若未显式给出 DEFAULT 子句,就无法在现有行中填入该域的默认值,而是会让新列保持为 null。

  • 修复外键约束的 ON DELETE SET DEFAULTSET NULL 动作中存在重复列名时的错误行为(Tom Lane) §

  • 改进对不允许修改外键约束属性的尝试所给出的错误消息(Álvaro Herrera) §

  • 避免重置标记为 ON COMMIT DELETE ROWS 的临时表的 relhassubclass 标志时发生错误(Noah Misch) §

  • 补上对 XMLSERIALIZE()INDENT 选项缺失的反解析支持(Jim Jones) § §

    此前,使用 XMLSERIALIZE(... INDENT) 的视图或规则在导出时会丢失 INDENT 子句,导致恢复后的结果不正确。

  • 避免过早求值同时具有 FILTERORDER BY(或 DISTINCT)选项的聚合函数参数(David Rowley) §

    当存在 ORDER BYDISTINCT 时,我们会考虑预先对聚合输入值排序,而不是在 Agg 计划节点内执行排序。但如果聚合输入中包含可能失败的表达式,例如某些输入除数可能为零的除法,同时又存在旨在防止此类失败的 FILTER 子句,这样做就会有问题。预排序会把这些表达式的求值提前到 FILTER 测试之前,从而仍然触发失败。现已修复:若存在 FILTER,且输入表达式不只是简单的 Var 或 Const,则不再进行预排序。

  • 修复在存在外连接时,依据列 NOT NULL 约束得出错误推论的问题(Richard Guo) §

    在某些情况下,规划器会丢弃 IS NOT NULL 查询条件,即使该条件是在外连接之后生效,因此并非冗余。

  • 避免基于应用于复合值的 IS [NOT] NULL 测试进行不正确的优化(Bruce Momjian) §

  • 修复规划器无法在顶层表达式中识别多个可哈希的 ScalarArrayOpExpr 子表达式的问题(David Geier) §

    这会使其他本可借助哈希表处理的子表达式被以不必要的低效方式执行,也就是右侧全部为常量的 INNOT IN= ANY 子句。

  • 修复低填充因子时表大小估算不正确的问题(Tomas Vondra) §

    当规划器估算一个尚未分析过的表的行数时,会把该表的 fillfactor 设置计入估算,但此前未将结果限制为每页至少一行。因此,低填充因子可能导致不合理地偏小的估算结果。

  • 在位图堆扫描中禁用 skip fetch 优化(Matthias van de Meent) §

    事实证明,当并发 vacuum 将某个页面标记为 all-visible 时,这项优化可能返回已死亡元组。

  • 修复 GIN 索引搜索在存在大量搜索键时启动阶段的性能问题(Tom Lane、Vinod Sridharan) § §

    带有大量键值的可索引子句,例如数组元素多达数万个的 jsonbcol ?| array[...],其启动阶段需要 O(N2) 时间,而且在这段时间内也无法取消。

  • 检测 BRIN 索引操作符类中缺失的支持过程,并报告错误而不是崩溃(Álvaro Herrera) §

  • 在等待 Append 计划节点的异步子计划时响应中断,例如取消查询(Heikki Linnakangas) §

    此前,必须等到某个子计划准备就绪之后,系统才会有响应。

  • 更频繁地报告活动 WAL 发送进程的 I/O 统计信息(Bertrand Drouvot) §

    此前,pg_stat_io 视图直到 WAL 发送进程退出后,才会累计该进程执行的 I/O。现在,这类 I/O 最多延迟一秒就会被报告。

  • 修复刚启动后立即处理 synchronous_standby_names 时的竞争条件(Melnikov Maksim、Michael Paquier) §

    在系统启动后的短时间内,即使启用了 synchronous_standby_names,后端也可能未等待同步提交。

  • 处理同一查询期间 io_combine_limit 可能发生变化的情况(Thomas Munro) §

  • 避免在 scram_iterations 被设为 INT_MAX 时发生无限循环(Kevin K Biju) §

  • 避免因对 json_array() 的子查询进行双重转换而导致可能崩溃(Tom Lane) §

  • 修复 pg_strtof() 在 endptr 为 null 时崩溃的问题(Alexander Lakhin、Tom Lane) §

  • 修复某些 GUC 赋值在内存耗尽后崩溃的问题(Daniel Gustafsson) §

  • 避免 Snowball 词干提取器遇到内存耗尽时崩溃(Maksim Korotkov) §

  • 修复规划期间过度释放 SpecialJoinInfo 结构体的问题(Richard Guo) §

    如果启用了分区连接,这会在规划期间导致崩溃。

  • 不允许复制已失效的复制槽(Shlok Kyal) §

    这可以避免当失效槽指向已被移除的 WAL 时出现问题。

  • 不允许在未处于热备模式的备库上恢复逻辑复制槽(Masahiko Sawada) §

    这可以防止这样一种情况:即使 wal_level 过低,该槽在提升后仍可能保持有效。

  • 防止逻辑解码在 fast forward 模式下将 catalog xmin 推进过头(Zhijie Hou) §

    这个错误可能导致已删除的系统目录项被 vacuum 清除,尽管 WAL 读取进程仍可能需要它们。

  • 避免在不会获取强锁的 DDL 操作影响逻辑复制中的表时发生数据丢失(Shlok Kyal、Hayato Kuroda) § §

    由 DDL 命令引起的系统目录变更未能反映到 WAL 解码进程中,导致它们可能继续使用过时的系统目录数据来解码后续变更,并最终造成数据损坏。

  • 防止应用工作进程遇到错误但该错误被捕获且未导致工作进程退出时,错误地重置复制源(Hayato Kuroda) §

    这个错误可能导致重复数据被应用。

  • 修复逻辑复制中订阅端分区表具有 BRIN 索引时的崩溃问题(Tom Lane) §

  • 避免逻辑复制索引查找中重复创建快照(Heikki Linnakangas) § §

  • 改进混合来源订阅的检测(Hou Zhijie、Shlok Kyal) §

    如果某个被订阅的表也通过其他发布被跟踪,创建订阅时会给出警告,因为这可能导致接收到重复数据。此变更改进了该逻辑,也能检测出通过另一份发布被跟踪的是分区父表或子表的情况。

  • 修复关于恢复时间线选择错误的报错中检查点细节不正确的问题(David Steele) §

    如果请求的恢复时间线不可达,那么在存在 backup_label 的情况下,报出的检查点和时间线应当取自该文件中读到的值。此前,这条消息报告的是控制文件中的值;在没有 backup_label、仅从控制文件恢复时这没有问题,但在存在 backup_label 时就不正确。

  • 修复 smgropen() 中的操作顺序(Andres Freund) §

    确保在调用 smgr_open 回调之前,SMgrRelation 对象已经完成初始化,这样一旦回调失败,就能正确清理。

  • 移除 pgstat_report_stat() 中不正确的断言(Michael Paquier) §

  • 修复 gistFindCorrectParent() 中过于严格的断言(Heikki Linnakangas) §

  • 避免在 maintenance_work_mem 值非常小时,并行 vacuum 中发生断言失败(Masahiko Sawada) §

  • 修复主库重启时备库上罕见的断言失败(Heikki Linnakangas) §

  • 在 PL/pgSQL 中,避免在简单的 SELECT expression 查询上定义可滚动游标时出现 unexpected plan node type 错误(Andrei Lepikhov) §

  • 不要在 pg_dump--clean 模式中尝试删除单个索引分区(Jian He) §

    服务器会拒绝此类 DROP 命令。这其实没有实际后果,因为这些分区无论如何都会在后续删除其父表或分区索引时一并消失。不过,尝试删除时报出的错误会在以 --single-transaction 模式恢复时造成问题。

  • pg_dumpall 中,如果 pg_auth_members 包含无效角色 OID,则避免输出无效的角色 GRANT 命令(Tom Lane) §

    改为打印警告并跳过该条目。这样可以更好地应对后续分支中曾因 GRANTDROP ROLE 之间的竞争条件而出现的系统目录损坏。

  • pg_amcheckpg_upgrade 中,使用正确的函数释放由 libpq 分配的内存(Michael Paquier、Ranier Vilela) § § §

    这些疏漏可能会在某些 Windows 构建配置下导致崩溃,例如调用应用是非调试构建,却使用了 libpq 的调试构建。

  • 修复 reindexdb 对并行重建索引操作的调度(Alexander Korotkov) §

    原先的代码未能达到预期的并行度。

  • 避免 contrib/pageinspectheap_page_items() 在输入数据损坏时崩溃(Dmitry Kovalenko) §

  • 防止 contrib/pg_freespacemappg_freespacemap() 发生断言失败(Tender Wang) §

    pg_freespacemap() 应用于缺少存储的关系(例如视图)会导致断言失败,不过在非断言构建中没有实际不良影响。现已增加错误检查以拒绝这种情况。

  • contrib/postgres_fdw 中,避免从子查询中上拉限制条件(Alexander Pyhalov) §

    此修复可防止罕见的 unexpected expression in subquery output 错误。

  • 修复系统 include 目录中存在旧版 libpq_fe.h 时的构建失败(Tom Lane) §

  • 修复在 macOS 15.4 上的构建失败(Tom Lane、Peter Eisentraut) §

    这次 macOS 更新破坏了我们对 strchrnul() 的配置探测。

  • 修复读流按缓冲区数据的 valgrind 标记(Thomas Munro) §

    这不会影响已发布版本的 PostgreSQL 核心代码,但使用该按缓冲区数据特性的扩展在 valgrind 下测试时,可能会遇到伪失败。

  • 避免 valgrind 对字符串哈希代码发出告警(John Naylor) §

  • 将时区数据文件更新到 tzdata 2025b,以纳入智利夏令时法规变更,以及伊朗的历史修正(Tom Lane) §

    智利艾森大区新增时区 America/Coyhaique,用于反映该地区全年改用 UTC-03,从而与 America/Santiago 分离。