E.5. 发布版本 17.7 #
发布日期:. 2025-11-13
本次发布包含来自 17.6 的多项修复。有关 17 主版本新特性的说明,请参见第 E.12 节。
E.5.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)
防止当
JSON_VALUE等 SQL/JSON 函数的DEFAULT子句包含COLLATE表达式时出现“unrecognized node type”错误(Jian He)§ §正确地将 JSON 构造器表达式(如
JSON_OBJECT())视为非严格的(Tender Wang,Richard Guo)§在某些情况下,这些表达式即使有一个或多个空值输入也能产生非空结果,因此它们是非严格的。规划器错误地将它们分类为严格的,从而可能执行不正确的查询转换。
进一步修复
SIMILAR TO正则表达式中字符类的处理(Laurenz Albe)§之前将
SIMILAR TO模式匹配表达式转换为 POSIX 风格正则表达式的修复破坏了一个之前有效的边界情况:如果在左方括号之后紧接着一个转义字符,然后在转义序列之后紧接着一个右方括号(例如[\w]),右方括号将不再被视为字符类的终止符。修复对参数包含子查询且该子查询中有
FROM引用聚合函数外部 CTE 的聚合函数的解析问题(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上的条件,使得更新的行为取决于选择了哪种计划类型。修复没有准备替代本地连接计划用于 EPQ 的外部或自定义连接的 EvalPlanQual 处理(Masahiko Sawada,Etsuro Fujita)§
在这种情况下,应该正常调用外部或自定义访问方法,但之前并未发生,通常会导致崩溃。
避免在
DETACH CONCURRENTLY期间重复 hash 分区约束(Haiyang Li)§ALTER TABLE DETACH PARTITION CONCURRENTLY被编写为向现已分离的分区添加分区约束的副本。这是不恰当的,部分原因是非并发DETACH不会这样做,但主要原因是在 hash 分区的情况下,约束表达式包含对父表 OID 的引用。这在导出/恢复期间,或在DETACH之后父表被删除时会导致问题。在 v19 及更高版本中,我们将不再创建任何此类约束副本。在已发布的分支中,为了最大限度地降低不可预见后果的风险,仅在 hash 分区的情况下跳过添加复制约束。禁止在分区键中使用生成列(Jian He,Ashutosh Bapat)§
这本来已经不被允许,但检查遗漏了一些情况,例如列引用隐含在整行引用中的情况。
禁止在
COPY ... FROM ... WHERE子句中使用生成列(Peter Eisentraut,Jian He)§以前,尝试引用此类列会导致不正确的行为或晦涩的错误消息,因为在执行
WHERE过滤时生成列尚未计算。避免并行清理中潜在的释放后使用问题(Kevin Oommen Anish)§
该缺陷在标准构建中似乎没有实际后果,但理论上仍存在风险。
修复
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 来报告它。修复 hash 子计划中的内存泄漏(Haiyang Li)§
用于对元组进行 hash 运算的 hash 函数所消耗的任何内存都构成了查询生命周期的内存泄漏。这种情况的一种发生方式是参与 hash 运算的值需要 de-toast。
避免启动进程中的
SMgrRelation对象泄漏(Jingtang Zhang)§在长时间运行的备库服务器上,保存这些对象的 hash 表可能会显著膨胀,因为原先没有释放不再需要条目的机制。
修复 WAL 重放数据库创建过程中的轻微内存泄漏(Nathan Bossart)§
修复内存不足失败后共享统计信息表损坏的问题(Mikhail Kot)§
之前,在创建新的 hash 表条目过程中发生内存不足失败会留下一个损坏的条目,可能在稍后导致其他会话出错。
修复
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)§当
synchronized_standby_slots引用了不存在的复制槽时,避免发生故障(Shlok Kyal)§在写入复制槽状态到磁盘失败后删除未完成的槽状态文件(Michael Paquier)§
以前,磁盘空间不足等失败会留下一个临时
state.tmp文件。这是有问题的,因为它会阻止所有后续写入状态的尝试,需要手动干预来清理。修复逻辑复制并行应用工作进程中锁超时信号的错误处理(Hayato Kuroda)§
同一个信号编号被同时用于工作进程关闭和锁超时,导致混淆。
避免从流式传输切换到归档 WAL 源时不必要的 WAL 接收进程关闭(Xuneng Zhou)§
在时间线切换期间,备库的 WAL 接收进程应保持活动状态,等待新的 WAL 流式传输起始点。相反,它反复关闭并立即重新启动,这可能会混淆状态监控代码。
避免由于常规表和临时表之间文件编号偶然冲突导致的逻辑复制失败(Vignesh C)§
这一低概率问题表现为像“unexpected duplicate for tablespace
X, relfilenodeY”这样的瞬态错误。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 上无法建立此类连接。
修复继承表列上非继承而来的非空约束的转储问题(Dilip Kumar)§
从早于 v18 的服务器转储时,pg_dump 未能保留这类约束。
在 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)§
修复 pg_combinebackup 中每个文件的内存泄漏(Tom Lane)§
确保
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)§
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.