发布日期:. 2025-08-14
本次发布包含来自 15.13 的多项修复。 有关 15 主版本新特性的说明,请参见 Section E.18。
对于运行 15.X 的用户,不需要执行导出/恢复。
但是,如果你有任何 BRIN numeric_minmax_multi_ops 索引,建议在更新后对它们进行重建索引。 请参见下面的第四条变更日志条目。
另外,如果你从早于 15.13 的版本升级,请参见 Section E.5。
加强规划器估算函数中的安全检查 (Dean Rasheed) §
针对 CVE-2017-7484 的修复及后续修复,旨在防止泄漏函数被应用于调用用户无权读取的列的统计数据。 已发现该保护中存在两个漏洞。其中一个漏洞涉及分区和继承层次结构,其中表上的 RLS 策略应限制对统计数据的访问,但实际上并未限制。
另一个漏洞涉及查询通过视图访问表的情况,视图所有者有权读取底层表,但调用用户对视图没有权限。 视图所有者的权限满足了安全检查,泄漏函数会在检查调用用户对视图的权限之前被应用于底层表的统计数据。 此问题已通过在规划开始时对视图进行安全检查来修复。这可能导致权限失败比以前更早发生。
PostgreSQL 项目感谢 Dean Rasheed 报告此问题。 (CVE-2025-8713)
防止 pg_dump 脚本被用于攻击执行恢复的用户 (Nathan Bossart) §
由于导出/恢复操作通常涉及以超级用户身份运行 SQL 命令,目标数据库安装必须信任源服务器。 但是,这并不意味着执行 psql 进行恢复的操作系统用户也应该信任源服务器。 这里的风险是,已经获得源服务器超级用户级别控制权的攻击者可能能够使其输出被解释为 psql 元命令的文本。 这将提供对恢复用户自身帐户的 shell 级别访问,独立于对目标数据库的访问。
为了确保这种情况不会发生,扩展了 psql 的 \restrict 命令以阻止执行后续元命令,并让 pg_dump 在输出任何源服务器数据之前发出该命令。
PostgreSQL 项目感谢 Martin Rakhmanov、Matthieu Denais 和 RyotaK 报告此问题。 (CVE-2025-8714)
在 pg_dump 输出的注释中将名称中的换行符转换为空格 (Noah Misch) §
包含换行符的对象名称提供了向输出脚本注入任意 SQL 命令的能力。 (如果没有前述修复,也可以通过这种方式注入 psql 元命令。) CVE-2012-0868 曾修复了这类问题,但后续工作又重新引入了几种情况。
PostgreSQL 项目感谢 Noah Misch 报告此问题。 (CVE-2025-8715)
修复 BRIN numeric_minmax_multi_ops 支持函数中不正确的距离计算 (Peter Eisentraut,Tom Lane) §
在 64 位平台上结果有时是错误的,在 32 位平台上则严重错误。 这不会产生明显的故障,因为该逻辑仅用于选择如何将值合并到范围中;最坏情况下索引会变得低效和膨胀。 尽管如此,建议重建任何使用 numeric_minmax_multi_ops 操作符类的 BRIN 索引。
避免可接受的 XML 输入大小上限回退 (Michael Paquier,Erik Wienhold) § §
我们为规避早期 libxml2 2.13.x 版本中的一个缺陷,走上了一条会拒绝超过 10MB 文本块的代码路径,而此前的代码没有这一限制。 考虑到这些早期版本现在理应已不再实际使用,因此恢复到先前的代码路径。
修复 MERGE 到普通继承父表的问题 (Dean Rasheed) §
由于未能处理 WITH CHECK OPTION 和 RETURNING 操作,向这样的目标表的插入可能会崩溃或产生不正确的查询结果。
允许具有语句级触发器的表成为分区或继承子表 (Etsuro Fujita) §
我们不允许分区或继承子表拥有带转换表的行级触发器,因为对整个继承树的操作需要为每个这样的子表维护单独的转换表。 但这个问题不适用于语句级触发器,因为只有父表的语句级触发器会被触发。 检查现有表是否可以成为分区或继承子表的代码却同时拒绝了两种触发器。
禁止从子外部表收集转换元组 (Etsuro Fujita) §
我们不支持外部表上带转换表的触发器。 但是,作为分区或继承子表的外部表这种情况被忽略了。如果父表有这样的触发器,则会从外部子表收集不正确的转换元组。 现在改为抛出一个错误,报告该情况不被支持。
允许重置具有保留前缀的未知自定义参数 (Nathan Bossart) §
之前,如果使用 ALTER DATABASE/ROLE/SYSTEM 存储了参数设置, 当该参数未知但具有保留前缀时,存储的设置无法被删除。这种情况可能在扩展曾经有一个参数但该参数在升级中被删除时出现。
修复 ALTER SUBSCRIPTION ... DROP PUBLICATION 期间潜在的死锁问题 (Ajin Cherian) §
确保服务器进程在复制源删除期间以一致的顺序获取目录锁。
缩短创建具有冲突名称的索引时的竞态条件窗口 (Tom Lane) §
在为索引选择自动生成的名称时,避免与尚未提交的 pg_class 行以及完全有效的行冲突。 这避免了可能选择与某个并发 CREATE INDEX 相同的名称的情况, 当该命令仍在填充其索引,或已完成但属于尚未提交的事务的一部分时。 仍然存在一个问题窗口,但仅限于验证新索引参数并插入其 pg_class 行所需的时间。
防止在单个命令中对多个表执行清理时使用不正确的 VACUUM 选项 (Nathan Bossart,Michael Paquier) §
一个表的 TRUNCATE 和 INDEX_CLEANUP 选项可能被应用到其他表上。
修复 SIMILAR TO 正则表达式中字符类的处理 (Laurenz Albe) § §
将 SIMILAR TO 模式匹配表达式转换为 POSIX 风格正则表达式的代码没有考虑方括号可以嵌套。 例如,在类似 [[:alpha:]%_] 的模式中,代码将 % 和 _ 字符当作元字符处理,而它们应该是字面量。
在反解析查询时,始终在 FETCH FIRST 子句中的表达式周围添加括号 (Heikki Linnakangas) §expression ROWS WITH TIES
这避免了某些反解析结果在语法上无效的情况。
限制检查点进程的 fsync 请求队列大小 (Alexander Korotkov,Xuneng Zhou) § §
在 shared_buffers 设置非常大的情况下,检查点进程可能会尝试为 fsync 请求分配超过 1GB 的内存, 从而导致失败和无限循环。限制队列大小以防止这种情况。
避免在读取部分写入的 WAL 记录时逻辑解码出现无限等待 (Vignesh C) §
如果服务器在写入一条跨越多个页面的 WAL 记录的第一部分后崩溃,后续对 WAL 流的逻辑解码将等待数据到达下一个 WAL 页面。 如果服务器当前处于空闲状态,这可能永远不会发生。
修复 ACL 字符串中角色名称的不一致引用 (Tom Lane) §
之前的引用规则是区域设置敏感的,这可能导致在不同安装之间传输 aclitem 值时出现可移植性问题。 (pg_dump 不会这样做,但其他工具可能会。) 为确保一致性,始终在 aclitem 输出中引用非 ASCII 字符;但为了保持向后兼容性,在 aclitem 输入期间从不要求它们被引用。
拒绝关系选项和外部数据选项的名称中的等号(=) (Tom Lane) §
这种选项名称没有明显的使用场景,而允许它们会在存储的表示中产生歧义。
修复 LZ4 压缩归档数据可能不正确的解压缩问题 (Mikhail Gribkov) §
此错误似乎仅在输入数据不太可压缩时才会出现,这可能解释了它为何未被发现。
避免 btree 索引扫描可能将错误的索引条目标记为死的罕见场景 (Peter Geoghegan) §
避免在逻辑复制期间重新分发来自其他事务的缓存失效消息 (vignesh C) §
我们之前一轮的小版本发布包含了一个错误修复,以确保复制接收进程会响应跨进程缓存失效消息, 防止它们在执行复制更新时使用过期的目录数据。但是,该修复无意中使它们也重新分发了这些消息, 导致失效消息数量呈指数增长,这通常会以内存分配失败告终。 通过不重新分发收到的消息来修复此问题。
避免在检查点期间过早删除旧的 WAL (Vitaly Davydov) §
如果在检查点进行过程中复制槽的重启点被推进,不再需要的 WAL 段可能被过早删除, 导致在数据库随后立即崩溃时恢复失败。通过将它们多保留一个检查点周期来修复此问题。
永不向后移动复制槽的已确认刷新位置 (Shveta Malik) §
在某些情况下,复制客户端可能确认一个超过其已持久存储的 LSN,然后在重启后可能发送一个较旧的 LSN。 只要客户端对两个点之间的 WAL 没有需要做的事情,我们就认为这不是一个错误。 但是,我们不应该重新发送该 WAL,以免出现数据重复,因此要确保我们始终相信给定槽的最新已确认 LSN。
允许在备库上等待事务时被中断 (Kevin K Biju) §
在备库上创建复制槽可能需要等待主库上某些活跃事务完成然后在备库上重放。 由于这可能是一个无限期的等待,因此允许取消该操作是可取的,但循环中没有检查查询取消。
修复自动清理中的每关系内存泄漏 (Tom Lane) §
修复某些代码路径,它们可能在没有活动快照的情况下尝试读取系统目录中的 toasted 字段 (Nathan Bossart) §
这可能导致断言失败,或报出 “cannot fetch toast data without an active snapshot” 错误。
移除错误的断言,该断言要求在 PortalRunMulti() 结束时必须已确定命令标签 (Alvaro Herrera) §
这在边缘情况下会失败,例如空的预备语句。
修复 XMLTABLE 解析中的断言失败 (Richard Guo) §
恢复在并行模式下运行 PL/pgSQL 表达式的能力 (Dipesh Dhameliya) §
PL/pgSQL 的“表达式”概念非常广泛,涵盖任何返回单列且不超过一行的 SQL SELECT 查询。 因此在某些情况下,例如聚合函数的求值,查询涉及大量工作,使用并行工作进程来运行它会很有用。 这以前是可能的,但之前的一个错误修复无意中禁用了它。
修复 PL/Python 错误报告中的边缘情况资源泄漏 (Tom Lane) § §
在报告来自 Python 的错误时发生的内存不足故障可能导致未能减少 Python 对象的引用计数, 从而导致会话生命周期的内存泄漏。
修复 libpq 的 PQport() 函数,使其在传入的连接不是 NULL 的情况下永远不返回 NULL (Daniele Varrazzo) §
这是文档中记录的行为,但最近的 libpq 版本在用户未提供端口规范的某些情况下会返回 NULL。 恢复我们历史上在这种情况下返回空字符串的行为。(v18 及以后的版本将改为返回编译时默认端口号,通常是 "5432"。)
避免 GSSAPI 认证需要大于 16kB 的数据包时失败 (Jacob Champion,Tom Lane) §
属于许多 AD 组的 Active Directory 用户需要更大的认证数据包。此前的限制会导致连接失败,并显示难以理解的错误消息, 通常为 “GSSAPI context establishment error: The routine must be called again to complete its function: Unknown error”。
修复 SSL 和 GSSAPI 数据传输中与时序相关的失败 (Tom Lane) §
当在非阻塞模式下使用 SSL 或 GSSAPI 加密时,libpq 有时会失败并显示 “SSL error: bad length” 或 “GSSAPI caller failed to retransmit all data needing to be retried”。
避免 ecpg 应用程序中连接查找时的空指针解引用 (Aleksander Alekseev) §
这种情况仅在应用程序同时拥有命名连接和未命名连接时才可能发生。
改进 psql 对 COPY 和 \copy 选项的 tab 补全 (Atsushi Torikoshi) §
COPY FROM 和 COPY TO 提供相同的补全建议,尽管有些选项只对其中一种情况有效。 区分这些情况以提供更准确的建议。
避免 pgbench 在收到多个管道同步消息时的断言失败 (Fujii Masao) §
确保 pg_dump 以有效的顺序导出域约束的注释 (Jian He) §
在某些情况下,注释命令可能出现在约束创建之前。
确保 pg_dump 中所有类型的数据库对象具有稳定的排序顺序 (Noah Misch,Andreas Karlsson) § § §
pg_dump 在执行依赖驱动的重新排序之前,先按逻辑名称对对象进行排序。 此排序未考虑标识某些对象类型(如规则和约束)的完整唯一键,因此可能对逻辑上相同的数据库产生不同的排序顺序。 这使得通过比较 pg_dump 输出的差异来比较数据库变得困难, 因此改进了逻辑以确保在所有情况下排序顺序稳定。
在 pg_upgrade 中,检查不一致的继承非空约束 (Ali Akbar) § § § § § §
18 之前的 PostgreSQL 版本允许删除继承列的非空约束。 但是,这会导致无法恢复的模式,从而导致 pg_upgrade 失败。 在 pg_upgrade 的预检查期间检测此类情况, 以允许用户在启动升级之前修复它们。
避免在 initdb 期间启用 track_commit_timestamp 时的断言失败 (Hayato Kuroda,Andy Fan) §
修复 pg_waldump 以显示 PREPARE TRANSACTION WAL 记录中已删除统计信息的信息 (Daniil Davydov) §
避免在 contrib/dblink 连接建立期间可能的打开连接泄漏 (Tom Lane) §
在罕见的情况下,当我们在将新连接对象插入 dblink 的哈希表时遇到内存不足时, 打开的连接将泄漏直到会话结束,导致在远程服务器上留下一个空闲会话。
使 contrib/pg_prewarm 能够处理非常大的 shared_buffers 设置 (Daria Shanina) §
如果 shared_buffers 大于约 5000 万个缓冲区(400GB), 自动预热会因内存分配错误而失败。
在 contrib/pg_stat_statements 中,避免在规范化查询中使用的参数编号出现间隔 (Sami Imseih) §
修复 contrib/postgres_fdw 的 DirectModify 方法中的内存泄漏 (Tom Lane) §
如果查询在两次调用 DirectModify 方法之间失败,用于保存远程修改命令结果的 PGresult 会在该会话剩余生命周期内泄漏;这种情况可能发生在需要处理 RETURNING 数据时。
确保在 configure 的 --with-includes 和 --with-libraries 选项中列出的目录在系统提供的目录之前被搜索 (Tom Lane) §
使用这些选项的一个常见原因是允许用户构建的库版本覆盖系统提供的版本。 但是,由于 makefile 发出的命令中开关排序的疏忽,这在某些环境中无法正常工作。
修复 configure 对 __cpuid() 和 __cpuidex() 的检查 (Lukas Fittl,Michael Paquier) §
configure 未能检测到这些 Windows 特定的函数,因此它们不会被使用, 由于无法验证硬件指令的可用性,导致 CRC 计算比必要的更慢。 此错误的实际影响有限,因为 Windows 的生产构建通常不使用 Autoconf 工具链。
修复在基于 Solaris 的平台上使用 --with-pam 选项的构建失败 (Tom Lane) §
Solaris 在 PAM 认证的 API 方面与其他 Unix 平台不一致。 这表现为一个“inconsistent pointer” 编译器警告,我们之前从未处理过。 但从 GCC 14 开始,默认情况下这是一个错误而不是警告,因此需要修复它。
使我们的代码可移植到 GNU Hurd (Michael Banck,Christoph Berg,Samuel Thibault) §
修复关于 IOV_MAX 和 O_RDONLY 的假设,这些假设在 Hurd 上不成立。
使我们对 memset_s() 的使用严格符合 C11 标准 (Tom Lane) §
这避免了在某些平台上的编译失败。
防止 JSONB 比较代码中的未初始化值编译器警告 (Tom Lane) §
避免在使用 libxml2 2.14 及更高版本构建时出现弃用警告 (Michael Paquier) §
避免在 C++ 下编译 pg_locale.h 时出现的问题 (John Naylor) §
PostgreSQL 头文件通常需要包裹在 extern "C" { ... } 中, 以便被使用 C++ 编写的扩展包含。由于 pg_locale.h 使用了 libicu 头文件,这对其不起作用,但我们可以通过在这些头文件中抑制仅 C++ 的声明来解决此问题。 想要使用 libicu 的 C++ API 的 C++ 扩展可以在 pg_locale.h 之前包含 libicu 头文件来实现。