受支持版本: 15

E.3. 发布版本 15.15 #

发布日期:. 2025-11-13

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

E.3.1. 迁移到版本 15.15 #

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

但是,如果你从早于 15.14 的版本升级,请参见 Section E.4

E.3.2. 变更 #

  • CREATE STATISTICS 中检查模式上的 CREATE 权限(Jelte Fennema-Nio) §

    此遗漏允许表所有者在任何模式中创建统计信息对象, 可能导致意外的命名冲突。

    PostgreSQL 项目感谢 Jelte Fennema-Nio 报告此问题。 (CVE-2025-12817)

  • 避免 libpq 中分配大小计算时的整数溢出 (Jacob Champion) §

    libpq 中有几处在计算所需的内存分配大小时不够谨慎。 足够大的输入可能导致整数溢出,导致分配的缓冲区过小, 然后写入超出缓冲区末尾。

    PostgreSQL 项目感谢 Positive Technologies 的 Aleksey Solovev 报告此问题。 (CVE-2025-12818)

  • 进一步修复 SIMILAR TO 正则表达式中字符类的处理 (Laurenz Albe) §

    之前对将 SIMILAR TO 模式匹配表达式转换为 POSIX 风格正则表达式的修复, 破坏了一个之前可以正常工作的边缘情况:如果在开始方括号之后紧跟一个转义字符, 然后在转义序列之后紧跟一个闭合方括号(例如 [\w]), 该闭合方括号将不再被识别为字符类的终止符。

  • 修复对参数中包含从 FROM 引用聚合函数外部 CTE 的子查询的聚合函数的解析 (Tom Lane) §

    此类 CTE 引用在确定聚合的语义层级时必须像外层列引用一样处理; 但它未被考虑在内,从而导致晦涩的规划器或执行器错误。

  • 修复在估算 SubPlan 代价时边缘情况下出现的 no relation entry for relid 错误(Richard Guo) §

  • 避免规划器在展开分区表时极小概率出现释放后继续使用的问题 (Bernd Reiß) §

    只有在最后一个仍存活的分区被并发删除时,才存在这种风险。

  • 移除 btree 索引清理中的错误断言(Peter Geoghegan) §

  • 修复包含多个扫描条件的 GIN 索引扫描中可能出现的无限循环 (Tom Lane) §

    GIN 可以处理那些能够排除不匹配条目、但对查找相关条目没有帮助的扫描条件,例如 tsquery 子句 !term。但这类条件不能位于扫描条件数组的首位。 代码未能在所有情况下确保这一点,结果就是,一个同时含有这类条件和普通条件的查询, 是否能正常工作取决于查询中给出这些条件的顺序。

  • 确保 GIN 索引扫描可以被取消(Tom Lane) §

    某些代码路径可能会长时间运行而不检查中断。

  • 确保 BRIN 自动汇总为需要快照的索引表达式提供快照 (Álvaro Herrera) § §

    以前,自动汇总对此类索引会失败,然后留下占位符索引元组, 导致索引随时间膨胀。

  • 修复当表包含接近 232 页时 BRIN 索引扫描中的整数溢出隐患 (Sunil S) §

    此疏忽可能导致无限循环或扫描不需要的表页。

  • 修复 JIT 生成的元组解构代码对存储值进行零扩展的错误 (David Rowley) §

    在不使用 JIT 时,对应代码执行的是符号扩展而不是零扩展,从而导致小整数数据类型的 Datum 表示不同。 这种不一致在大多数情况下被掩盖了,但已知在使用 Memoize 计划节点时会导致 could not find memoization table entry 错误,也可能还有其他症状。

  • 修复触发器结果关系信息缓存的错误逻辑 (David Rowley,Amit Langote) §

    在分区的列集与其父分区表的列集在物理上不完全相同的情况下, 此疏忽可能导致崩溃。

  • 为 TID Scan 和 TID Range Scan 计划节点补充缺失的 EvalPlanQual 重新检查 (Sophie Alpert,David Rowley) § §

    这一遗漏可能导致在并发更新场景下没有重新检查 ctid 上的条件, 从而使更新行为取决于所选择的计划类型。

  • 修复 EvalPlanQual 对未为 EPQ 准备替代本地连接计划的外部或自定义连接的处理 (Masahiko Sawada,Etsuro Fujita) §

    在这种情况下,本应正常调用外部或自定义访问方法,但实际上并没有,通常会导致崩溃。

  • 避免在 DETACH CONCURRENTLY 期间复制哈希分区约束 (Haiyang Li) §

    ALTER TABLE DETACH PARTITION CONCURRENTLY 会尝试向 已分离的分区添加分区约束的副本。这并不合适,一方面是因为非并发 DETACH 本就不会这样做;更主要的原因是,在哈希分区场景中, 约束表达式会引用父表 OID。这会在导出/恢复期间, 或在 DETACH 之后删除父表时引发问题。 在 v19 及更高版本中,我们将不再创建任何此类复制约束。 在已发布的分支中,为了最大限度地降低意外后果的风险, 仅在哈希分区的情况下跳过添加复制约束。

  • 禁止在分区键中使用生成列 (Jian He,Ashutosh Bapat) §

    这之前已经不被允许,但检查遗漏了某些情况, 例如列引用隐含在整行引用中的情况。

  • 禁止在 COPY ... FROM ... WHERE 子句中使用生成列 (Peter Eisentraut,Jian He) §

    之前,尝试引用此类列会导致不正确的行为或晦涩的错误消息, 因为在执行 WHERE 过滤时,生成列尚未被计算。

  • 修复 pg_temp 中统计信息对象的可见性检查 (Noah Misch) §

    位于临时模式中的统计信息对象不能在不加模式限定的情况下引用, 但 pg_statistics_obj_is_visible() 遗漏了这一点, 可能无论如何都返回 true。反过来, pg_describe_object() 等函数可能无法如预期那样对对象名称进行模式限定。

  • 修复 pg_event_trigger_dropped_objects() 对临时状态的报告 (Antoine Violin,Tom Lane) § §

    如果被删除的列默认值、触发器或 RLS 策略属于临时表, 则应以 is_temporary 为 true 来报告它。

  • 修复哈希子计划中的内存泄漏(Haiyang Li) §

    用于哈希元组的哈希函数消耗的任何内存都构成查询生命周期的内存泄漏。 一种可能发生的情况是被哈希的值需要解压(de-toasting)。

  • 修复 WAL 重放数据库创建过程中的轻微内存泄漏 (Nathan Bossart) §

  • 修复内存不足失败后共享统计信息表损坏的问题 (Mikhail Kot) §

    之前,在创建新的哈希表条目过程中发生内存不足失败会留下一个损坏的条目, 可能在稍后导致其他会话出错。

  • 修复 MERGE 中的并发更新问题 (Yugo Nagata) §

    当执行 MERGE UPDATE 操作时,如果目标行有多个并发更新, 加锁重试代码有时会错误地识别目标元组的最新版本,导致不正确的结果。

  • MERGEINSERT ... ON CONFLICT DO UPDATE 中添加缺失的副本标识检查 (Zhijie Hou) § § §

    如果 MERGE 可能需要更新或删除操作, 且目标表发布更新或删除,则要求它定义了 REPLICA IDENTITY。 不要求这一点可能会静默地破坏复制。 同样,带有 UPDATE 选项的 INSERT 在目标表发布插入或更新时也必须要求 REPLICA IDENTITY

  • 避免当发布端和订阅端在同一服务器上时 DROP SUBSCRIPTION 的死锁 (Dilip Kumar) §

  • 修复 pg_stat_replication 视图中复制延迟的错误报告 (Fujii Masao) §

    如果任何备库的重放 LSN 停止推进, write_lagflush_lag 列最终将停止更新。

  • 避免关于无效 primary_slot_name 设置的重复日志消息 (Fujii Masao) §

  • 在写入复制槽状态到磁盘失败后移除未完成的槽状态文件 (Michael Paquier) §

    之前,磁盘空间不足等失败会留下一个临时的 state.tmp 文件。 这是有问题的,因为它会阻塞所有后续的状态写入尝试, 需要手动清理。

  • 避免从流式 WAL 源切换到归档 WAL 源时 WAL 接收器意外关闭 (Xuneng Zhou) §

    在时间线切换期间,备库的 WAL 接收器应该保持存活, 等待新的 WAL 流起始点。然而它会反复关闭然后立即重启, 这可能混淆状态监控代码。

  • 避免由于常规表和临时表之间文件编号偶然冲突导致的逻辑复制失败 (Vignesh C) §

    这个低概率问题表现为临时错误, 如 unexpected duplicate for tablespace X, relfilenode Ycontrib/autoprewarm 也受到影响。 此修复的一个副作用是 SQL 函数 pg_filenode_relation() 现在将忽略临时表。

  • 修复 pgoutput 逻辑解码插件维护的关系同步缓存中的释放后使用问题 (Vignesh C,Masahiko Sawada) §

    逻辑解码期间的错误可能导致同一会话中后续逻辑解码尝试崩溃。 此情况仅在通过 SQL 函数调用 pgoutput 时可以触发。

  • 避免在单用户模式下尝试释放复制槽时的断言失败 (Hayato Kuroda) §

  • 修复检查用户是否具有 Windows 管理员权限时失败消息的错误打印 (Bryan Green) §

    此代码可能会崩溃或至少打印乱码。但尚未有此类情况的报告, 说明这些系统调用的失败极为罕见。

  • 避免在 macOS 和 BSD 平台上因与已存在的信号量集冲突而导致启动失败 (Tom Lane) §

    如果已存在的信号量集比我们请求的信号量数量少, 这些平台返回 EINVAL 而不是我们代码预期的 EEXIST, 导致数据库启动失败。

  • 修复 64 位 Windows 调试构建中的虚假内存上下文检查警告 (David Rowley) §

  • 正确处理 PL/pgSQL 赋值语句中的 GROUP BY DISTINCT (Tom Lane) §

    解析器未能在此上下文中记录 DISTINCT 选项, 导致该命令的行为如同普通的 GROUP BY

  • 避免在 PL/Python 中处理 SQL 错误时泄漏内存 (Tom Lane) §

    此修复解决了在我们之前的小版本中引入的会话生命周期内存泄漏问题。

  • 修复 libpq 对高位设置字符的跟踪输出 (Ran Benita) §

    char 被视为有符号类型的平台上, 输出中包含了不美观的 \xffffff 修饰。

  • 修复 libpq 在 Windows 上 GSSAPI 逻辑中处理套接字相关错误的问题 (Ning Wu,Tom Lane) §

    用于使用 GSSAPI 加密/解密传输数据的代码未能正确识别连接套接字上的错误条件, 因为 Windows 报告这些错误的方式与其他平台不同。 这导致在 Windows 上无法建立此类连接。

  • pg_dump 中,导出订阅和事件触发器上的安全标签 (Jian He,Fujii Masao) §

    这些类型的对象上的标签之前被遗漏了。

  • 修复 pg_dump 对默认 ACL 和外键约束的排序 (Kirill Reshke,Álvaro Herrera) § § §

    确保这些数据库对象类型的排序一致,就像其他对象类型已经做到的那样。

  • pg_dump 中,为单独导出的域约束的注释标注正确的依赖关系 (Noah Misch) §

    此错误可能导致并行 pg_restore 在约束本身恢复之前 就尝试创建注释。

  • pg_restore 中,跳过未被恢复的发布和订阅的注释和安全标签 (Jian He,Fujii Masao) § §

    当指定 --no-publications--no-subscriptions 时, 不要为这些对象输出 COMMENTSECURITY LABEL 命令。

  • 修复 pg_dumppg_restore 中数据压缩逻辑的各种错误 (Daniel Gustafsson,Tom Lane) §

    多处缺少或不正确的错误检查,还有在大端硬件上才会出现的可移植性问题。 这些问题之前未被发现,因为此代码仅用于读取目录格式导出中压缩的 TOC 文件。 pg_dump 永远不会生成此类导出; 该情况只能通过在事后手动压缩 TOC 文件来触发,这是被支持的操作但非常不常见。

  • 修复 pgbench 在启动 COPY 操作时未能干净退出的问题 (Anthonin Bonnefoy) §

    pgbench 并不打算支持这种情况, 但之前它会进入无限循环。

  • 修复 pgbench 对多个错误的报告 (Yugo Nagata) §

    在两次连续的 PQgetResult 调用都失败的情况下, pgbench 可能报告错误的错误消息。

  • pgbench 中,修复流水线模式下关于错误的错误断言 (Yugo Nagata) §

  • 确保 contrib/pg_buffercache 函数可以被取消 (Satyanarayana Narlapuram,Yuhang Qiu) §

    某些代码路径可能会长时间运行而不检查中断。

  • 修复 contrib/pg_prewarm 对索引的权限检查 (Ayush Vatsa,Nathan Bossart) §

    pg_prewarm() 要求对要预热的关系具有 SELECT 权限。然而,由于索引没有自己的 SQL 权限,这导致非超级用户无法预热索引。 改为检查索引所属表的 SELECT 权限。

  • 使 contrib/pgstattuple 对空或无效的索引页面更加健壮 (Nitin Motiani) §

    将全零页面计为空闲空间,并忽略根据页面特殊空间大小检查为无效的页面。 btree 索引的代码已经将全零页面计为空闲, 但 hash 和 gist 代码会报错退出,这被认为对用户不太友好。 同样,使所有三种情况都统一为忽略损坏页面而不是抛出错误。

  • 加固我们的读写屏障宏以满足 Clang 的要求 (Thomas Munro) §

    我们假设 __atomic_thread_fence() 是阻止 C 编译器重新排序 其周围内存访问的充分屏障,但事实证明这对 Clang 并不成立, 允许它为至少 RISC-V、MIPS 和 LoongArch 机器生成不正确的代码。 添加显式编译器屏障来修复此问题。

  • 修复使用 LLVM 21 及更高版本的构建问题(Holger Hoffstätte) §

  • 修复 PGXS 构建基础设施以支持为扩展构建 NLS po 文件 (Ryo Matsumura) §

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。