↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18)

E.2. 发布版本 18.4 #

发布日期: 2026-05-14

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

E.2.1. 迁移到版本 18.4 #

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

但是,如果你从早于 18.2 的版本升级,请参见第 E.4 节。

E.2.2. 变更 #

  • 防止处理启动包时发生无界递归(Michael Paquier)§

    恶意客户端可以通过无限交替发送被拒绝的 SSL 和 GSS 加密请求,使已连接的后端崩溃。

    PostgreSQL 项目感谢 Calif.io(与 Claude 和 Anthropic Research 协作)报告此问题。(CVE-2026-6479)

  • 修复内存分配计算中的多处整数溢出问题(Tom Lane,Nathan Bossart,Heikki Linnakangas)§ § § § § § § § §

    多处代码在计算需要分配多少内存时,未充分注意整数溢出的可能性。溢出会导致分配过小的缓冲区,调用者随后会写过该缓冲区的末尾。这至少会触发服务器崩溃,并且很可能可被利用来执行任意代码。在许多但绝非所有情况下,这种风险只存在于 32 位构建中。

    PostgreSQL 项目感谢 Xint Code、Bruce Dang、Sven Klemm 和 Pavel Kohout 报告这些问题。(CVE-2026-6473)

  • 在 pg_createsubscriber 中正确为订阅名称加引号(Nathan Bossart)§

    给定的订阅名称未经加引号就被插入到 SQL 命令中,因此在订阅名称来自不可信来源的(也许不太可能的)情况下,可能实现 SQL 注入。

    PostgreSQL 项目感谢 Yu Kunpeng 报告此问题。(CVE-2026-6476)

  • 在逻辑复制源检查中正确引用对象名称(Pavel Kohout)§

    ALTER SUBSCRIPTION ... REFRESH PUBLICATION 将模式名和关系名未经引用就插入到 SQL 命令中,从而允许在发布者上执行任意 SQL。

    PostgreSQL 项目感谢 Pavel Kohout 报告此问题。(CVE-2026-6638)

  • 拒绝 ts_headline() 中过长的选项(Michael Paquier)§

    StartSel、StopSel 和 FragmentDelimiter 字符串的长度不得超过 32Kb,但此前没有对此进行检查。过长的值通常会使服务器崩溃。

    PostgreSQL 项目感谢 Xint Code 报告此问题。(CVE-2026-6473)

  • 在恢复属性 MCV 统计信息时检测错误输入(Michael Paquier)§

    统计信息恢复函数在验证高频值统计信息时不够谨慎,会接受稍后可能导致规划器崩溃的值。

    PostgreSQL 项目感谢 Jeroen Gui 报告此问题。(CVE-2026-6575)

  • 防范 timeofday() 和 pg_strftime() 中的恶意时区名(Tom Lane)§ §

    精心构造的时区设置可能将 % 序列传递给 snprintf(),从而可能造成崩溃或泄露服务器内存。另一条导致类似结果的路径,是让 pg_strftime() 使用的固定大小输出缓冲区溢出。

    PostgreSQL 项目感谢 Xint Code 报告此问题。(CVE-2026-6474)

  • 创建多范围类型时,确保用户在为该多范围类型指定的模式上拥有 CREATE 权限(Jelte Fennema-Nio)§

    多范围类型可以放入不同于其父范围类型的模式中,但此前在这样做时遗漏了必需的权限检查。

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

  • 在认证代码中使用时序安全的字符串比较(Michael Paquier)§

    在检查口令、hash 等值时,使用 timingsafe_bcmp() 而不是 memcmp() 或 strcmp()。尚不清楚这些函数的数据依赖性在这些位置是否真的可被有效利用,但为安全起见,将其替换。

    PostgreSQL 项目感谢 Joe Conway 报告此问题。(CVE-2026-6478)

  • 将 PQfn() 标记为不安全,并避免在 libpq 内部使用它(Nathan Bossart)§

    对于非整数结果类型,PQfn() 不会获得输出缓冲区的大小,因此它无法检查服务器返回的数据能否放入缓冲区。恶意服务器因而可能覆盖客户端内存。若不改变 API 就无法修复这一点,所以将该函数标记为已废弃。在 libpq 内部,改用一个能够执行缺失检查的变体版本。

    PostgreSQL 项目感谢 Yu Kunpeng 和 Martin Heistermann 报告此问题。(CVE-2026-6477)

  • 防止 pg_basebackup 和 pg_rewind 中的路径遍历(Michael Paquier)§

    这些应用未能验证从其输入中读取的输出文件路径,因而恶意来源可以覆盖这些应用可写的任意文件。通过拒绝绝对路径或包含父目录引用的路径,约束数据可以写入的位置。

    PostgreSQL 项目感谢 Tencent Xuanwu Lab 的 XlabAI Team 和 Valery Gubanov 报告此问题。(CVE-2026-6475)

  • 防范 contrib/intarray 的 query_int 类型以及 contrib/ltree 的 ltxtquery 类型中的字段溢出(Tom Lane)§ §

    这些查询结构的解析没有检查 16 位字段溢出,因而可能构造出无效的查询树。执行该查询时,这可能使服务器崩溃。

    PostgreSQL 项目感谢 Xint Code 报告此问题。(CVE-2026-6473)

  • 防范 contrib/ltree 的 lquery 类型中过长的值(Michael Paquier)§

    包含超过 64K 个项的值会导致内部溢出,可能造成栈破坏或错误结果。

    PostgreSQL 项目感谢 Vergissmeinnicht、A1ex 和 Jihe Wang 报告此问题。(CVE-2026-6473)

  • 防止 contrib/spi 中的 SQL 注入和缓冲区越界写(Nathan Bossart)§

    check_foreign_key() 在为键值加引号时不够谨慎,并且还使用固定长度缓冲区构造查询。虽然该模块只是作为示例代码,但仍然不应包含此类危险错误。

    PostgreSQL 项目感谢 Nikolay Samokhvalov 报告此问题。(CVE-2026-6637)

  • 在假定支持排序规则的类型上的等值条件意味着唯一性之前,检查是否存在非确定性排序规则(Richard Guo)§ § § § §

    许多规划器优化都会假定,例如,如果 x 上存在唯一索引,则最多只有一个表行能满足 WHERE x = 'abc'。不过,如果该索引和 WHERE 子句附加了不同的排序规则,一般来说这个结论是不安全的。当两个排序规则都是确定性排序规则时这是安全的,因为该属性本质上要求两个字符串相等就意味着逐位相等。但非确定性排序规则并不如此,因此如果 WHERE 子句或索引任一方具有非确定性排序规则,基于唯一匹配假设进行优化就可能给出错误的查询结果。

  • 修复连接移除期间 RestrictInfo 结构体中关系引用移除不完整的问题(Tom Lane)§

    已经证明这个疏忽会导致规划器失败,例如意外出现“FULL JOIN is only supported with merge-joinable or hash-joinable join conditions”错误。它还可能在其他情况下导致未能考虑有效的计划。

  • 改进规划器将分区键列匹配到子查询输出的逻辑(Richard Guo)§

    在将操作数与分区键比较之前,去除其中的无操作 PlaceHolderVar。此变更使分区剪枝在某些此前未能识别出无需扫描某个分区的情况下能够成功。

  • 修复自连接移除,使其能够处理裸布尔列形式的连接子句,例如 ON t1.boolcol(Andrei Lepikhov, Tender Wang, Alexander Korotkov)§

    以前这种情况会导致“no relation entry for relid N”错误。

  • 修复 UPDATE/DELETE ... WHERE CURRENT OF,使其可用于带有虚拟生成列的表(Satyanarayana Narlapuram, Dean Rasheed)§

  • 修复 INSERT ... ON CONFLICT 中 EXCLUDED 列引用里的虚拟生成列展开问题(Satyanarayana Narlapuram, Dean Rasheed)§

  • 修正规则动作和规则限定条件中对 NEW 生成列的错误处理(Richard Guo,Dean Rasheed)§

    此前,在 INSERT 情况下,此类列引用会生成 NULL;在 UPDATE 情况下,则等同于 OLD 值。

  • 修复虚假的“indexes on virtual generated columns are not supported”错误(Robert Haas)§

    创建表达式索引时有时会错误地报告此错误。

  • 修复虚假的“generated columns are not supported in COPY FROM WHERE conditions”错误(Tom Lane)§

    在 COPY FROM WHERE 条件中使用系统列时,有时会错误报告此错误。

  • 当 MERGE 在可重复读或可串行化模式下遇到被并发更新的元组时,正确报告串行化失败(Tender Wang)§

    此前,这类场景的行为与较低隔离级别中的行为相同。

  • 修复源表包含已删除列时的 CREATE TABLE ... LIKE ... INCLUDING STATISTICS(Julien Tachoires)§

    在这类情况下,扩展统计信息对象可能会被错误复制,或该命令可能给出错误的报错。

  • 允许 ALTER INDEX ... ATTACH PARTITION 在适当时将父索引标记为有效(Sami Imseih)§

    存在一些边界情况:即使分区索引的所有叶子索引均有效,该分区索引仍可能保持被标记为无效。此变更提供了一种机制,使用户可以在不借助手工更新系统目录的情况下纠正这种情况。

  • 修复 ALTER TABLE ... SET NOT NULL,使其只在完成目录更改后才调用对象访问钩子函数(Artur Zakirov)§

  • 修复 ALTER FOREIGN DATA WRAPPER,使其不要删除包装器对象对其处理器函数的依赖(Jeff Davis)§

  • 修复外键触发器的可延迟性丢失问题(Yasuo Honda)§

    以前,定义为 DEFERRABLE INITIALLY DEFERRED 的外键,在被设置为 NOT ENFORCED 状态再改回 ENFORCED 后,会表现得像 NOT DEFERRABLE。

    如果你有受此问题影响的外键,可以在安装本次更新后,再次将其设置为 NOT ENFORCED,然后改回 ENFORCED 来修复。

  • 修复 WITHOUT OVERLAPS 以允许域(Jian He)§

    UNIQUE/PRIMARY KEY ... WITHOUT OVERLAPS 要求无重叠列是范围或多范围,但它也应允许基于这类类型的域。

  • 不允许复合类型通过多范围成为自身的成员(Heikki Linnakangas)§

    当中间类型是域、数组、复合类型或范围时,我们已经禁止此类情况;但此前遗漏了多范围。

  • 修复 Datum 镜像比较,使其不受符号扩展差异影响(David Rowley)§

    这修复了一些此前会导致“could not find memoization table entry”错误或错误查询结果的情况。

  • 修复带非严格等值操作符的 hash IN/NOT IN 的错误逻辑(Chengpeng Yan)§

    此前的代码可能崩溃或给出错误结果。所有内置数据类型都有严格的等值操作符,因此此问题只可能出现在扩展数据类型上。

  • 在 to_char() 中截断过长的区域设置相关数字符号(Tom Lane)§

    如果某个区域设置指定了长度超过 8 字节的货币符号、千位分隔符、小数符号或正负号符号,就可能出现缓冲区越界写。现实世界中不存在这样的区域设置,而且非特权攻击者也不太可能在 Postgres 服务器下安装恶意区域设置定义;但为安全起见,检查过长符号并在需要时截断。

  • 防止解析 Ispell 字典的词缀文件时发生缓冲区越界写(Tom Lane)§ §

    损坏或恶意的词缀文件可能使服务器崩溃。这不被视为安全问题,因为文本检索配置文件被假定为可信,但仍然值得修复。

  • 防范窗口聚合的帧起始和结束位置计算中的整数溢出(Richard Guo)§

    用户指定的极大偏移量(接近 INT64_MAX)可能导致错误或错误的查询结果。

  • 修复 array_agg_array_combine(),使其正确组合数组的空值位图(Dmytro Astapov)§

    此错误导致并行化的 array_agg(anyarray) 计算有时产生不正确输出。

  • 如果 sync_file_range() 返回错误码 EINTR,则进行重试(DaeMyung Kang)§

  • 修复 pg_stat_reset_single_table_counters() 在共享系统目录上的错误行为(Chao Li)§

    这类场景会产生重置当前数据库的 stat_reset_timestamp 的副作用,而这不是有意的。

  • 当并行应用工作进程空闲时更新活动统计信息(Zhijie Hou)§

    以前,刚完成事务的统计信息可能长时间不被报告,尤其在工作负载较轻时。

  • 修复集合操作中估算数组长度时出现的“no relation entry for relid 0”失败(Tender Wang)§

  • 修复 pglz_decompress() 接收损坏输入时的缓冲区越界读问题(Andrew Dunstan)§

    此前可能读取输入末尾之后的几个字节,在极其不走运的情况下可能导致崩溃。

  • 修复增量 JSON 解析器对跨输入缓冲区边界的数字词元的处理(Andrew Dunstan)§

    过去可能接受格式不正确的数字,导致后续失败。

  • 防止恢复增量备份时关系可见性映射膨胀(Robert Haas)§

    由于错误计算预期文件长度,恢复可能向可见性映射追加许多零块。这不会导致数据损坏,但可能浪费大量磁盘空间。

  • 在文本列上的系统目录缓存查找中使用 C 排序规则,而不是数据库的默认排序规则(Jeff Davis)§

    这避免了某些边缘场景中的失败,例如物理复制启动时没有已确定的数据库,因而无法确定默认排序规则。

  • 防止卡住的 slotsync 工作进程阻塞备库提升(Nisha Moond、Ajin Cherian)§ § §

    一个徒劳等待主库响应的工作进程,会让提升延迟一段不合理的时间。

  • 修复空闲 slotsync 工作进程产生过多日志输出的问题(Zhijie Hou)§

  • 确保即使发生错误后,tuplestore 数据结构在内部也保持一致(Tom Lane)§

    此前代码对此不够谨慎,这在大多数时候没有问题,但对于支撑 WITH HOLD 游标的 tuplestore 则有问题。在 v15 及更早版本中,这会导致容易重现的崩溃;目前尚不知道较新分支是否易受影响,但最好在所有分支中保持一致性。

  • 让 pg_aios 系统视图的 pid 列在条目没有所属进程时显示 NULL 而不是 0(ChangAo Chen)§

  • 修复 pg_stat_replication 中过早报告 NULL 延迟的问题(Shinya Kato)§

    即使复制活动正在发生,延迟列也经常读作 NULL。

  • 修复并行 B-树索引扫描所用共享内存分配不足的问题(Siddharth Kothari)§

    在边界情况下,这可能导致服务器崩溃。

  • 避免处理不记录 WAL 的 GiST 索引时罕见的刷盘失败(Tomas Vondra)§

    不记录 WAL 的 GiST 索引有时仍可能产生“xlog flush request n/nnnn is not satisfied”错误,原因是错误地选择了一个“假 LSN”来表示插入点。

  • 修复对非常规大小的段所需 DSA 页面映射大小的低估问题(Paul Bunn)§

    此误算导致越界访问,并进而造成服务器崩溃。

  • 修复共享内存中 oldest-multixact 数组的索引(Yura Sokolov)§ §

    这一错误可能导致一个已预备但尚未提交的事务所持有的行锁在其他会话看来不可见,或者导致该事务结果出现其他可见性问题。在 max_connections 设置非常小时,也可能发生内存踩踏。

  • 修复安装过多 EXPLAIN 扩展选项时的数组越界写(Joel Jacobson)§

  • 修复处理扩展数据类型表达式上的扩展统计信息时可能发生的服务器崩溃(Michael Paquier)§

    如果该数据类型的 typanalyze 函数没有计算任何有用的统计信息,就可能发生 NULL 指针解引用。核心内置的 typanalyze 函数都不会这样表现,但扩展可能会如此。

  • 正确显示在 GROUP BY 中使用的连接别名 Vars(Tom Lane)§

    在包含类似 SELECT ... t1 LEFT JOIN t2 USING (x) GROUP BY x 查询的视图中,GROUP BY 子句可能被逆解析错误显示,从而导致导出/恢复失败。只有当 t1.x 和 t2.x 数据类型并不相同,并且 t1.x 是需要隐式强制转换的一侧时,才会发生该失败。

  • 修复基于 ICU 的字符串处理中轻微的内存泄漏(Jeff Davis)§

  • 如果启动进程失败,在 postmaster 退出前正确关闭其他子进程(Ayush Tiwari)§

    对此情况的处理依赖于一个早已过时的假定:启动进程运行时不存在其他 postmaster 子进程,因此可以立即退出 postmaster。孤立的子进程最终会注意到 postmaster 已死亡并自行退出,但更干净的关闭过程仍然是可取的。

  • 修复检查点 WAL 重放与多事务 ID 创建之间的竞态条件(Heikki Linnakangas)§

    跟随来自较旧小版本主库的 WAL 的备库,可能陷入反复崩溃和重启的循环,并抱怨“could not access status of transaction”。

  • 防止 WAL 发送进程关闭时无限期等待(Anthonin Bonnefoy)§ §

    在发布逻辑复制数据的集簇关闭时,WAL 发送进程会等待所有待处理 WAL 被写出。但它没有正确请求执行此操作,因此在某些情况下这可能变成无限期等待。

  • 确保恢复期间对表空闲空间映射的更改会被持久化(Alexey Makhmutov)§

    此前,在重放应当改变空闲空间映射的操作时,WAL 重放确实会更新该映射;但如果启用了校验和,映射页缓冲区不会被标记为脏,因此这些更改可能永远不会被写出。在备库上,随着时间推移,这会导致映射与表的实际内容严重不符。虽然该映射只作为提示使用,但在备库被提升为活跃服务器后,直到大部分映射被更新修复之前,这种情况可能在一段时间内造成显著性能下降。

  • 修复某些 ecpg 函数在没有已建立连接的情况下被调用时的崩溃(Shruthi Gowda)§

  • 加固 tar 文件解析逻辑,使其能够防范无法处理的归档(Tom Lane)§

    pg_basebackup 和 pg_verifybackup 中使用的 tar 文件读取代码,根本没有验证输入是否为 tar 文件,更不用说验证它是否属于我们能够处理的有效 tar 文件子集。对于输入文件由 PostgreSQL 代码生成的常见场景,这不是问题;但如果输入由其他 tar 程序生成,就可能成为问题。

  • 修复备份解压和 tar 解析代码中的多项错误(Andrew Dunstan, Tom Lane, Chao Li)§ § §

    pg_basebackup 和 pg_verifybackup 中使用的解压和 tar 文件读取代码,会错误处理 tar 文件填充数据,在边界情况下可能损坏 LZ4 压缩数据,未检查一些异常错误条件,压缩/解压错误后未退出(导致级联错误报告),并且会泄漏内存。

  • 在 pg_dump 中,保留 NOT NULL 约束的 NO INHERIT 属性(Jian He)§

    有些情况遗漏了打印 NO INHERIT 子句。

  • 在 pg_dumpall 中,不要跳过具有悬挂授权者 OID 的角色 GRANT(Tom Lane)§

    作为替代,像 v16 之前那样,通过发出不带任何 GRANTED BY 子句的 GRANT 来处理此类情况。这可以避免在可预见的情况下丢失授权,因为 v16 之前的服务器不会阻止删除授权者角色。继续针对缺失的授权者发出警告,但仅当源服务器为 v16 或更高版本时才这样做。

  • 在 pg_upgrade 中,连接到较旧源服务器时注意使用正确的协议版本(Jacob Champion)§

    在尝试从 2018 年以前的服务器升级时,这可能会造成问题。

  • 在 contrib/basic_archive 中,允许启动时归档目录不存在(Nathan Bossart)§

    此前,如果 basic_archive.archive_directory 的设置没有指向一个已存在的目录,就会被拒绝。这并不理想,因为即使该目录稍后出现,归档也会无限期卡住。

  • 修复 contrib/ltree,使其能够处理大小写折叠改变字符串字节长度的情况(Jeff Davis)§ §

    此前,指定大小写不敏感匹配的 lquery 模式,可能无法匹配本应匹配的标签。

  • 修复 contrib/pg_overexplain 的 RANGE_TABLE 选项输出结构错误的问题(Satyanarayana Narlapuram)§

    某些字段在 JSON、YAML 和 XML 格式中位置错误,导致输出在结构上无效。

  • 在 contrib/pg_stat_statements 中,如果解析 pgss_query_texts.stat 文件时发生错误,不要泄漏内存(Heikki Linnakangas)§

  • 在 contrib/postgres_fdw 中,避免因过早清理失败连接而崩溃(Etsuro Fujita)§

    如果远程连接的中止清理失败,我们就不能再使用它。但要将关闭连接对象延迟到事务结束时执行,因为打开的游标等数据结构中可能仍有对它的引用。

  • 将时区数据文件更新到 tzdata 2026b 发布版本(Tom Lane)§

    British Columbia(America/Vancouver)将从 2026 年 11 月开始全年采用 UTC-07(实际上就是永久 DST)。本次发布假定其 TZ 缩写从那时起为 MST。这看起来可能会改变,但尚不清楚会使用什么新缩写。另外还有一项针对 Moldova 的历史修正:自 2022 年以来,他们一直遵循 EU 的 DST 转换时间。

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.