发布说明

PostgreSQL 16.9

E.5. 发布版本 16.9 #

发布日期:. 2025-05-08

本次发布包含来自 16.8 的多项修复。 有关 16 主版本新特性的说明,请参见 Section E.14

E.5.1. 迁移到版本 16.9 #

对于运行 16.X 的用户,不需要执行导出/恢复。

但是,如果你在分区表上有自引用外键约束,可能需要重新创建这些约束以确保它们被正确执行。 请参见下面的第二个变更日志条目。

此外,如果你有任何 BRIN bloom 索引,建议在更新后对其进行重建索引。 请参见下面的第三个变更日志条目。

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

E.5.2. 变更 #

  • 避免在检查声称为 GB18030 编码的无效编码字符串时发生单字节缓冲区越界读取 (Noah Misch,Andres Freund) § §

    虽然可能性不大,但如果不完整的多字节字符出现在内存末尾,可能会导致 SIGSEGV 崩溃。 这在服务器和使用 libpq 的应用程序中都可能发生。 (CVE-2025-4207)

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

    如果外键约束引用的表与分区表本身相同,则创建或挂载分区时未能为外键约束创建所需的系统目录条目。 这导致约束无法被完全执行。

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

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

    代码未能考虑到解压缩结果与输入对象不完全相同的情况,这会导致合并摘要时未能添加部分数据, 从而在索引搜索中遗漏行。

    这个错误从引入 BRIN bloom 索引的 v14 开始就存在,但当时此代码路径很少被触及。 在 v17 中由于并行索引构建现在使用了该代码,因此触发的可能性大大增加。

  • 修复在 UPDATEDELETEMERGE 查询中使用 FROM 中的 视图或函数的全行表引用时出现的意外 attribute has wrong type 错误 (Tom Lane) §

  • 修复对带有 DO NOTHING 动作的分区表执行 MERGE 的问题 (Tender Wang) §

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

  • 防止当表有一个域数据类型的 GENERATED 列且该域的约束不允许空值时, INSERT 命令失败的问题(Jian He) §

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

  • 正确处理在 INSERT/UPDATE/DELETE/MERGE 命令内部的 WITH 子句中出现的对外部 CTE 名称的引用, 而该命令本身又位于 WITH 内部 (Tom Lane) §

    解析器未能检测到不允许的递归情况,也未能在将 CTE 排序为可用顺序时考虑此类引用。

  • 当参数为匿名记录类型时,不要尝试并行化 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 子句的情况下添加该类型的列时, 未能在现有行中安装域的默认值,而是将新列留为空值。

  • 修复外键约束的 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 更复杂时 不进行预排序来避免此问题。

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

    这导致本可以用哈希表处理的额外子表达式(即右侧全为常量的 INNOT IN= ANY 子句)被不必要地低效执行。

  • 禁用位图堆扫描中的跳过获取优化 (Matthias van de Meent) §

    事实证明,当并发的 vacuum 将页面标记为全部可见时,此优化可能导致返回已死亡的元组。

  • 修复当搜索键很多时 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 已启用,后端进程也可能未能等待同步提交。

  • 避免当 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) §

  • 禁止复制已失效的复制槽(Shlok Kyal) §

    这可以防止当失效的槽指向已被删除的 WAL 时出现问题。

  • 禁止在非热备模式的备库上恢复逻辑复制槽 (Masahiko Sawada) §

    这可以防止在 wal_level 过低的情况下, 槽在提升后仍然保持有效的场景。

  • 防止在逻辑解码的快进模式中 catalog xmin 被过度推进 (Zhijie Hou) §

    此错误可能允许已删除的系统目录条目被清理掉,即使 WAL 读取进程仍然可能需要它们。

  • 避免当不需要强锁的 DDL 操作影响正在进行逻辑复制的表时丢失数据 (Shlok Kyal,Hayato Kuroda) § §

    DDL 命令引起的系统目录变更未能反映到 WAL 解码进程中, 使其可能使用过期的系统目录数据来解码后续变更,很可能导致数据损坏。

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

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

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

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

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

  • 修复关于不正确恢复时间线选择的错误消息中错误的检查点详情 (David Steele) §

    如果请求的恢复时间线不可达,报告的检查点和时间线应该是从 backup_label 读取的值(如果存在的话)。此消息之前报告的是来自控制文件的值, 这在没有 backup_label 的情况下从控制文件恢复时是正确的, 但在存在 backup_label 时则不正确。

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

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

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

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

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

    服务器会拒绝此类 DROP 命令。这实际上没有什么后果, 因为这些分区会在随后对其父表或分区索引的 DROP 中自动消失。但是,尝试删除时报告的错误在 --single-transaction 模式下恢复时会导致问题。

  • pg_dumpall 中,避免在 pg_auth_members 包含无效角色 OID 时发出无效的角色 GRANT 命令(Tom Lane) §

    改为打印警告并跳过该条目。这更好地处理了在旧分支中由于 GRANTDROP ROLE 之间的竞态条件而导致的系统目录损坏问题。

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

    这些疏忽可能导致在某些 Windows 构建配置中崩溃,例如 libpq 的调试构建被非调试构建的调用应用程序使用时。

  • 允许通过查询取消来中断 contrib/dblink 查询 (Noah Misch) §

    此变更回移了 v17 时代的修复。它可以防止由于未能检测到死锁而导致 CREATE DATABASEDROP DATABASE 可能挂起的问题。

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

  • 防止 contrib/pg_freespacemappg_freespacemap() 中的断言失败 (Tender Wang) §

    对没有存储的关系(如视图)应用 pg_freespacemap() 会导致断言失败,尽管在非断言构建中没有不良影响。 现在增加了错误检查以拒绝该情况。

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

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

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

    新增了一个时区 America/Coyhaique,用于智利的艾森大区, 因为该地区改为全年使用 UTC-03,从而与 America/Santiago 不同。