发布日期:. 2026-02-12
本次发布包含来自 16.11 的多项修复。 有关 16 主版本新特性的说明,请参见 Section E.14。
防范 oidvector/int2vector 出现意外维度 (Tom Lane) §
这些数据类型预期是不包含空值的一维数组,但存在一些类型转换路径允许违反这些预期。 对一些依赖这些预期但未加以验证的函数增加了检查,这些函数此前可能因此而行为异常。
PostgreSQL 项目感谢 Altan Birler 报告此问题。 (CVE-2026-2003)
加固选择率估算器,防止其被绑定到接受意外数据类型的操作符上 (Tom Lane) § § §
contrib/intarray 包含一个选择率估算函数,该函数可能被滥用于执行任意代码, 因为它未检查其输入是否为预期的数据类型。第三方扩展应检查类似的风险, 并使用 intarray 现在所采用的技术添加防护。由于此类扩展修复需要时间, 我们现在要求超级用户权限才能将非内置的选择率估算器绑定到操作符。
PostgreSQL 项目感谢 Daniel Firer(作为 zeroday.cloud 的一员)报告此问题。 (CVE-2026-2004)
修复 contrib/pgcrypto 的 PGP 解密函数中的缓冲区溢出问题 (Michael Paquier) §
使用超长会话密钥解密一个精心构造的消息会导致缓冲区溢出, 后果严重可达任意代码执行。
PostgreSQL 项目感谢 Team Xint Code(作为 zeroday.cloud 的一员)报告此问题。 (CVE-2026-2005)
修复多字节字符长度验证不充分的问题 (Thomas Munro,Noah Misch) § § § § § §
多个缺陷使得能够执行精心构造 SQL 的攻击者可以溢出字符串缓冲区, 后果严重可达任意代码执行。在这些修复之后,当字符串函数处理存储在数据库中的无效文本时, 应用程序可能会观察到 “invalid byte sequence for encoding” 错误。
PostgreSQL 项目感谢 Paul Gerste 和 Moritz Sanft(作为 zeroday.cloud 的一员)报告此问题。 (CVE-2026-2006)
不允许子查询中的 CTE 引用确定聚合函数的语义层级 (Tom Lane) §
此变更撤销了两个小版本之前所做的改动,改为在子查询引用的 CTE 低于 标准 SQL 规则根据所包含的列引用和聚合所分配的语义层级时抛出错误。 之前的修复被证明会引发其自身的问题,且目前尚不清楚应该如何替代处理。 由于 SQL 标准完全不允许在聚合内使用子查询,将此类情况视为错误似乎已足够。
修复 CTE 查询中 MERGE 的触发器转换表捕获问题 (Dean Rasheed) §
当执行包含 MERGE 和另一个对具有语句级 AFTER 触发器的表的 DML 操作的数据修改 CTE 查询时, 传递给触发器的转换表不会包含受 MERGE 影响的行, 而仅包含受其他操作影响的行。
修复当分区表目标表的所有子表都被修剪后,更新或删除操作失败的问题 (Amit Langote) §
在这种情况下,执行器可能会报告 “could not find junk ctid column” 错误,尽管实际上不需要执行任何操作。
避免当查询包含重复的窗口函数调用时规划器可能出现的失败 (Meng Zhang,David Rowley) §
对此类调用去重时的混淆可能导致诸如 “WindowFunc with winref 2 assigned to WindowAgg with winref 1” 之类的错误。
允许在部分哈希索引上进行索引扫描,即使索引的谓词蕴含了 WHERE 子句的真实性 (Tom Lane) §
通常我们会删除被谓词蕴含的 WHERE 子句,因为测试它是无意义的; 对于每个索引项,它必然成立。然而,如果索引要求在前导索引键上有 WHERE 子句 (如哈希索引那样),这可能会阻止创建索引扫描计划。 在考虑此类索引时,不再删除被蕴含的子句。
不要为非日志 BRIN 索引生成 WAL(Kirill Reshke) §
一个很少执行的代码路径错误地为 BRIN 索引生成了 WAL 记录,即使该索引被标记为非日志。 崩溃恢复随后会因为该文件已存在而无法重放该记录。
防止截断未读 NOTIFY 消息仍需要的 CLOG (Joel Jacobson,Heikki Linnakangas) § § §
此修复防止了当后端进程处理 NOTIFY 消息较慢时出现的 “could not access status of transaction” 错误。
将 NOTIFY 消息处理期间发生的错误升级为 FATAL,即关闭连接 (Heikki Linnakangas) §
此前,如果后端在接收 NOTIFY 消息时遇到错误, 它会跳过该消息,向客户端报告错误,然后继续执行。但这种行为存在很多问题。 一个主要的担忧是客户端无法很好地知道通知已丢失, 更无法知道通知的内容。根据应用逻辑,丢失通知可能导致应用程序陷入等待状态。 此外,剩余的消息在有人发送新的 NOTIFY 之前不会被处理。
此外,如果在接收 NOTIFY 信号时连接处于空闲状态, 由于其他方面的考虑,任何 ERROR 都会被升级为 FATAL。因此,我们选择在所有情况下都这样做, 以保持一致性,并向应用程序提供一个明确的信号,表明它可能错过了某些通知。
修复在锁定元组时跟踪更新链时的错误(Jasper Smit) §
此代码路径忽略了检查更新链中第一个新元组的 xmin, 使得在原始更新者中止且空间立即被 VACUUM 回收并重新使用时, 有可能锁定一个无关的元组。 这可能导致意外的事务延迟或死锁。 也有观察到与识别了错误元组相关的错误。
修复就地目录更新相关的问题(Noah Misch) § § §
对就地更新发送非事务性的失效消息,因为此类更新在事务回滚后仍然存在。 同时确保更新在其他会话能看到之前已被写入 WAL 日志。 这些修复主要防止关系的冻结 XID 属性变得不一致的场景, 从而避免可能的 CLOG 过早截断和随后的 “could not access status of transaction” 错误。
修复后端进程在退出时因尝试释放已取消映射的共享内存段中的锁而可能崩溃的问题 (Rahila Syed) §
防范崩溃后多事务日志被错误截断的问题(Heikki Linnakangas) §
修复 pg_stat_get_backend_activity() 可能返回错误编码结果的问题 (Chao Li) §
保存会话活动字符串的共享内存缓冲区可能以不完整的多字节字符结尾。 读取端应该截断掉任何此类不完整的字符,但此函数未能做到这一点。
防范递归内存上下文日志记录(Fujii Masao) §
持续不断的请求内存上下文日志记录的信号流可能导致日志记录代码递归执行, 理论上可能导致栈溢出。
修复重新初始化并行执行上下文时的内存上下文使用问题 (Jakub Wartak,Jeevan Chalke) §
此错误可能由于辅助数据结构的生存期短于并行上下文而导致崩溃。 仅使用核心 PostgreSQL 已知无法触发该问题, 但我们收到了扩展中出现问题的报告。
在创建新的多事务 ID 时设置下一个多事务 ID 的偏移量, 以消除在边界情况下所需的等待循环(Andrey Borodin) § §
之前的逻辑可能会陷入等待一个永远不会发生的更新。
避免多次重写数据修改 CTE(Bernice Southey,Dean Rasheed) §
此前,在更新可自动更新的视图或具有规则的关系时,如果原始查询包含数据修改 CTE, 重写器会由于递归而多次重写这些 CTE。这不仅效率低下, 而且在 CTE 包含始终生成列的更新时可能产生错误的报错。
当 WAL 不存在回溯到检查点记录所指示的重做点时,使恢复失败 (Nitin Jadhav) §
在开始恢复之前添加一个显式检查,这样不会造成损害并提供有用的错误信息。 此前,恢复在这种情况下可能崩溃或损坏数据库。
避免在 ALTER PUBLICATION 期间修改源查询树 (Sunil S) §
此错误的可见影响是,为该查询触发的事件触发器只能看到第一个 publish 选项,即使指定了多个。如果此类查询被设置为预备语句,重新执行时也会出现异常行为。
将 CREATE SUBSCRIPTION ... CONNECTION 中指定的连接选项传递给发布者的 walsender (Fujii Masao) §
在此修复之前,options 连接选项(如果有)被忽略, 因此例如无法在 walsender 会话中设置自定义服务器参数值。 这原本是预期可以工作的,并且在 PostgreSQL 版本 15 的重构破坏之前确实可以工作,因此恢复了之前的行为。
防止新创建或新同步的复制槽被失效(Zhijie Hou) §
与并发检查点的竞态条件可能允许删除复制槽所需的 WAL, 导致该槽立即被标记为无效。
修复计算复制槽所需 xmin 时的竞态条件(Zhijie Hou) §
这可能导致错误 “cannot build an initial slot snapshot as oldest safe xid follows snapshot's xmin”。
在逻辑复制订阅的初始同步期间,在开始复制数据之前提交 pg_replication_origin 条目的添加 (Zhijie Hou) §
此前,如果复制步骤失败,新的 pg_replication_origin 条目会因事务回滚而丢失。 这导致共享内存中的状态不一致。
在并行工作进程应用失败后不推进逻辑复制进度(Zhijie Hou) §
之前的行为允许订阅者丢失事务。
修复在重启流复制备库服务器时可能出现的 “unexpected data beyond EOF” 失败问题(Anthonin Bonnefoy) §
修复解析分区范围边界时列位置跟踪错误的问题(myzhen) §
例如,这可能导致在关于将分区边界值转换为列数据类型的错误消息中引用了错误的列名。
修复错误消息中的各种小错误(Man Zeng,Tianchen Zhang) § § §
例如,关于备份清单中时间线编号不匹配的错误报告在本应显示结束时间线编号的地方 显示了起始时间线编号。
修复使用 LLVM 版本 17 或更高版本进行 JIT 编译时无法执行函数内联的问题 (Anthonin Bonnefoy) §
调整我们的 JIT 代码以兼容 LLVM 21(Holger Hoffstätte) §
之前的代码在 aarch64 机器上无法编译。
增加新的服务器参数 file_extend_method 来控制 posix_fallocate() 的使用(Thomas Munro) §
PostgreSQL 版本 16 及更高版本会使用 posix_fallocate()(如果平台提供的话)来扩展关系文件。 然而,据报告这与某些文件系统交互不良:BTRFS 压缩会因使用 posix_fallocate() 而被禁用, 而在较旧的 Linux 内核版本中 XFS 可能会产生虚假的 ENOSPC 错误。 为提供一种解决方案,引入了这个新的服务器参数。将 file_extend_method 设置为 write_zeros 将使服务器回退到通过写入零字节块来扩展文件的旧方法。
在 Windows 上遵守 open() 的 O_CLOEXEC 标志(Bryan Green,Thomas Munro) § § §
使此标志像在 POSIX 平台上一样工作,以避免将文件句柄泄露到子进程(如 COPY TO/FROM PROGRAM)中。虽然该泄露没有造成太多问题, 但它似乎是不可取的。
修复在使用 meson 构建的 Solaris 可执行文件中无法解析服务器命令行长选项的问题 (Tom Lane) §
支持在 GNU/Hurd 上更改进程标题(Michael Banck) §
使 pg_resetwal 在更改 OldestXID 时打印更新后的值 (Heikki Linnakangas) §
它已经对可以更改的每个其他变量都做了这一点。
使 pg_resetwal 允许将下一个多事务 xid 设置为 0 或将下一个多事务偏移量设置为 UINT32_MAX (Maxim Orlov) §
这些是有效的值,因此拒绝它们是不正确的。在最坏的情况下, 如果在恰好处于多事务回卷点时尝试 pg_upgrade,升级将会失败。
在 contrib/amcheck 中,为 B-树索引父页检查使用正确的快照 (Mihail Nikalayeu) §
之前的代码在检查使用 CREATE INDEX CONCURRENTLY 创建的索引时会导致虚假错误。
修复 contrib/amcheck 以正确处理 “half-dead” B-树索引页 (Heikki Linnakangas) §
amcheck 期望此类页面有父级下行链接,但实际上没有, 导致关于 “mismatch between parent key and child high key” 的虚假错误报告。
修复 contrib/amcheck 以正确处理 不完整的 B-树根页分裂 (Heikki Linnakangas) §
amcheck 可能报告关于 “block is not true root” 的虚假错误。
修复 contrib/intarray 的 @@ 选择率估算器中的边界情况整数溢出问题(Chao Li) §
这可能导致在涉及最大整数值的情况下产生不准确的选择率估算。
修复 contrib/ltree 中的多字节编码问题 (Jeff Davis) §
之前的代码可能将不完整的多字节字符传递给 lower(), 很可能导致不正确的行为。
将时区数据文件更新至 tzdata 2025c 版本 (Tom Lane) §
唯一的变更是下加利福尼亚 1976 年之前时间戳的历史数据。