发布日期:. 2025-11-13
本次发布包含来自 16.10 的多项修复。 有关 16 主版本新特性的说明,请参见 Section E.14。
在 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)
正确地将 JSON 构造器表达式(如 JSON_OBJECT())视为非严格的 (Tender Wang,Richard Guo) §
在某些情况下,这些表达式即使有一个或多个空值输入也能产生非空结果,因此它们是非严格的。 规划器错误地将它们分类为严格的,从而可能执行不正确的查询转换。
进一步修复 SIMILAR TO 正则表达式中字符类的处理 (Laurenz Albe) §
之前将 SIMILAR TO 模式匹配表达式翻译为 POSIX 风格正则表达式的修复 破坏了一个之前能正常工作的边界情况:如果在左方括号之后紧跟一个转义字符, 然后在转义序列之后紧跟一个右方括号(例如 [\w]), 右方括号不再被识别为字符类的终止符。
修复解析聚合函数时,其参数包含带有对聚合函数外部 CTE 的 FROM 引用的子查询的问题(Tom Lane) §
此类 CTE 引用在确定聚合的语义层级时必须像外层列引用一样起作用; 但它未被纳入考虑,从而导致晦涩的规划器或执行器错误。
修复在估算 SubPlan 成本时边界情况下出现的 “no relation entry for relid” 错误(Richard Guo) §
避免规划器在扩展分区表时出现的不太可能的释放后使用问题(Bernd Reiß) §
仅在最后一个存活分区被并发删除时才存在该风险。
移除 B-树索引清理中的错误断言(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) §
用于哈希元组的哈希函数所消耗的任何内存都构成查询生命周期的内存泄漏。 可能发生这种情况的一种方式是需要被哈希的值需要反 toast 处理。
修复数据库创建 WAL 重放期间的轻微内存泄漏 (Nathan Bossart) §
修复内存不足失败后共享统计表的损坏问题(Mikhail Kot) §
此前,在创建新哈希表条目过程中发生内存不足失败会留下一个损坏的条目, 可能导致其他会话后续出错。
修复 MERGE 中的并发更新问题 (Yugo Nagata) §
当执行 MERGE UPDATE 操作时,如果目标行有多个并发更新, 锁定并重试的代码有时会错误地识别目标元组的最新版本,导致不正确的结果。
在 MERGE 和 INSERT ... ON CONFLICT DO UPDATE 中添加缺少的副本标识检查 (Zhijie Hou) § § §
如果 MERGE 可能需要更新或删除操作, 且目标表发布了更新或删除,则要求目标表定义 REPLICA IDENTITY。 未能要求这一点可能会悄悄地破坏复制。 同样,带有 UPDATE 选项的 INSERT 在目标表发布插入或更新时也必须要求 REPLICA IDENTITY。
避免当发布者与订阅者位于同一服务器上时 DROP SUBSCRIPTION 期间的死锁(Dilip Kumar) §
修复 pg_stat_replication 视图中复制延迟的不正确报告 (Fujii Masao) §
如果任何备库服务器的重放 LSN 停止推进, write_lag 和 flush_lag 列最终将停止更新。
避免关于无效 primary_slot_name 设置的重复日志消息 (Fujii Masao) §
在写入复制槽状态到磁盘失败后删除未完成的槽状态文件 (Michael Paquier) §
此前,如磁盘空间不足等失败会留下一个临时的 state.tmp 文件。 这很有问题,因为它会阻止所有后续写入状态的尝试,需要人工干预才能清理。
修复逻辑复制并行应用工作进程中锁超时信号的错误处理 (Hayato Kuroda) §
同一个信号编号被同时用于工作进程关闭和锁超时,导致混淆。
避免在从流式 WAL 源切换到归档 WAL 源时出现不必要的 WAL 接收器关闭 (Xuneng Zhou) §
在时间线切换期间,备库服务器的 WAL 接收器应保持活动状态, 等待新的 WAL 流起始点。然而实际上它在反复关闭并立即重新启动, 这可能会混淆状态监控代码。
避免由于常规表和临时表之间文件编号的偶然碰撞导致逻辑复制失败 (Vignesh C) §
这个低概率问题表现为诸如 “unexpected duplicate for tablespace X, relfilenode Y” 之类的瞬态错误。 contrib/autoprewarm 也受到了影响。 此修复的一个副作用是 SQL 函数 pg_filenode_relation() 现在将忽略临时表。
修复 pgoutput 逻辑解码插件维护的关系同步缓存中的 释放后使用问题(Vignesh C,Masahiko Sawada) §
逻辑解码期间的错误可能导致同一会话中后续逻辑解码尝试崩溃。 该情况仅在通过 SQL 函数调用 pgoutput 时可达。
避免不必要地失效逻辑复制槽 (Bertrand Drouvot) §
避免在单用户模式下尝试释放复制槽时的断言失败 (Hayato Kuroda) §
修复在检查用户是否具有 Windows 管理员权限时失败消息的不正确打印 (Bryan Green) §
此代码会崩溃或至少打印出乱码。 但是没有收到此类情况的报告,说明这些系统调用的失败极为罕见。
避免在 macOS 和 BSD 平台上当与已存在的信号量集冲突时启动失败 (Tom Lane) §
如果已存在的信号量集的信号量数量少于我们请求的数量, 这些平台返回 EINVAL 而非我们代码预期的 EEXIST,导致数据库启动失败。
避免在使用某些 libsanitizer 选项测试 PostgreSQL 时崩溃(Emmanuel Sibi,Jacob Champion) §
修复 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 时, 不再为这些对象生成 COMMENT 或 SECURITY LABEL 命令。
修复 pg_dump 和 pg_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) §
将全零页面计为空闲空间,并忽略根据页面特殊空间大小检查而无效的页面。 B-树索引的代码已经将全零页面计为空闲, 但 Hash 和 GiST 的代码会报错退出,这被认为对用户不够友好。 类似地,现在使这三种情况都统一为忽略损坏页面,而不是抛出错误。
加固我们的读写屏障宏以满足 Clang 的要求 (Thomas Munro) §
我们假设 __atomic_thread_fence() 是防止 C 编译器 重排其周围内存访问的充分屏障,但这对 Clang 似乎并不成立, 使其至少对 RISC-V、MIPS 和 LoongArch 机器可能生成不正确的代码。 添加显式编译器屏障来修复此问题。
修复使用 LLVM 版本 21 及更高版本构建的问题(Holger Hoffstätte) §
使用 meson 构建时,对 numeric.c 和 checksum.c 应用与 makefile 构建相同的特殊优化标志 (Nathan Bossart,Jeff Davis) § §
对两个文件都使用 -ftree-vectorize, 并对 checksum.c 额外使用 -funroll-loops, 以匹配 makefile 长期以来的做法。
修复 PGXS 构建基础设施以支持为扩展构建 NLS po 文件 (Ryo Matsumura) §
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。