发布日期:. 2026-02-12
本次发布包含来自 15.15 的多项修复。 有关 15 主版本新特性的说明,请参见 Section E.18。
防范 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 且该 CTE 位于根据标准 SQL 规则(基于所包含的列引用和聚合)分配给该聚合的语义层级之下时抛出错误。 之前尝试的修复本身导致了新的问题,而且目前不清楚应该如何处理。 由于 SQL 标准完全禁止在聚合中使用子查询,将此类情况视为错误已经足够。
修复 CTE 查询中 MERGE 的触发器过渡表捕获问题 (Dean Rasheed) §
当执行包含 MERGE 和另一个对具有语句级 AFTER 触发器的表的 DML 操作的数据修改 CTE 查询时,传递给触发器的过渡表将不包含 MERGE 影响的行,而只包含其他操作影响的行。
修复当分区目标表的所有子分区都被裁剪时更新或删除失败的问题 (Amit Langote) §
在这种情况下,执行器可能会报告 “could not find junk ctid column” 错误,尽管实际上不需要执行任何操作。
允许在部分哈希索引上进行索引扫描,即使索引的谓词隐含了 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 条目会因事务回滚而丢失。 这导致共享内存中出现不一致的状态。
修复流复制服务器重启时可能出现的 “unexpected data beyond EOF” 失败 (Anthonin Bonnefoy) §
修复解析分区范围边界时列位置的错误跟踪问题 (myzhen) §
例如,这可能导致在关于将分区边界值转换为列的数据类型的错误消息中引用了错误的列名。
修复错误消息中的各种小错误(Man Zeng,Tianchen Zhang) § § §
例如,关于备份清单中时间线编号不匹配的错误报告, 在应该显示结束时间线编号的地方显示了起始时间线编号。
修复使用 LLVM 17 或更高版本进行 JIT 编译时无法执行函数内联的问题 (Anthonin Bonnefoy) §
调整我们的 JIT 代码以兼容 LLVM 21(Holger Hoffstätte) §
之前的代码在 aarch64 机器上无法编译。
在 GNU/Hurd 上支持进程标题更改(Michael Banck) §
使 pg_resetwal 在更改 OldestXID 时打印更新后的值 (Heikki Linnakangas) §
它之前已经对其可以更改的每个其他变量都这样做了。
使 pg_resetwal 允许将下一个多事务 xid 设置为 0 或将下一个多事务偏移量设置为 UINT32_MAX (Maxim Orlov) §
这些是有效的值,因此拒绝它们是不正确的。在最坏的情况下, 如果恰好在多事务回卷点尝试 pg_upgrade,升级将失败。
在 contrib/amcheck 中,为 btree 索引父级检查使用正确的快照 (Mihail Nikalayeu) §
之前的代码在检查使用 CREATE INDEX CONCURRENTLY 创建的索引时 会导致虚假错误。
修复 contrib/amcheck 对 “half-dead” btree 索引页面的处理 (Heikki Linnakangas) §
amcheck 预期此类页面有父级下行链接, 但实际上没有,从而导致关于 “mismatch between parent key and child high key” 的虚假错误报告。
修复 contrib/amcheck 对不完整的 btree 根页面分裂的处理 (Heikki Linnakangas) §
amcheck 可能会报告关于 “block is not true root” 的虚假错误。
修复 contrib/intarray 的 @@ 选择性估算器中的边缘情况整数溢出问题 (Chao Li) §
这可能导致在涉及最大整数值的情况下产生不准确的选择性估算。
修复 contrib/ltree 中的多字节编码问题 (Jeff Davis) §
之前的代码可能会将不完整的多字节字符传递给 lower(), 可能导致不正确的行为。
将时区数据文件更新至 tzdata 2025c 版本 (Tom Lane) §
唯一的变更是 Baja California 1976 年之前时间戳的历史数据。