选择 打开 改范围 完整检索页

PostgreSQL 18.6 发布说明

E.1. 发布版本 18.6 #

发布日期:. 2026-08-13

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

注意:由于在发布打包完成后发现了回归问题,18.5 从未发布。

E.1.1. 迁移到版本 18.6 #

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

但是,下面前三个安全条目描述了更新后可能需要进行的配置调整和数据清理。

此外,如果存在任何 GIN 索引,请参见下面有关其所属表的 reltuples 值可能已损坏的变更条目。

此外,如果使用 contrib/btree_gistcontrib/ltree,可能需要为这些扩展创建的索引重建索引; 请参见下面的相关条目。

此外,如果是从早于 18.2 的版本升级,请参见 Section E.4

E.1.2. 变更 #

  • 将逻辑解码输出插件限制为新服务器参数 output_plugin_libraries 指定的集合 (Jacob Champion) § §

    此前,复制用户可以为逻辑解码选择任意可加载库,从而实施各种攻击。 为了在不破坏原有可用配置的情况下收紧这一限制,现引入一份允许使用的 输出插件列表。

    默认情况下,只有随 PostgreSQL 提供的输出插件 (pgoutputtest_decoding)会包含在 output_plugin_libraries 中。使用其他输出插件的安装必须在 更新服务器后将其加入该参数,例如:

    output_plugin_libraries = 'pgoutput, test_decoding, my_trusted_decoder'
    

    此外,从版本 17 或更高版本迁移时,如果 pg_upgrade --check 发现新集簇的 output_plugin_libraries 参数不允许旧集簇逻辑复制槽 所使用的插件,检查将会失败。 请在执行 pg_upgrade 前对新集簇的设置作必要补充。

    PostgreSQL 项目感谢 Vladimir Tokarev 和 Yu Kunpeng 报告此问题。 (CVE-2026-6471)

  • 修复 contrib/pgcrypto 的 PGP 加密,使其能够检测 不受支持的密码算法(Daniel Gustafsson) § §

    此前,如果 OpenSSL 拒绝所请求的密码算法(例如,因为它正以 FIPS 模式运行, 或尚未加载 legacy provider),pgcrypto 无法发现这一失败,只会将未经加密的块与明文进行异或,使这种 加密 轻易即可破解。这通常发生在已弃用或不符合 FIPS 的 密码算法上(cipher-algo=blowfish/bf、twofish、cast5 或 3des)。

    默认情况下,pgcrypto 现在将无法解密以这种方式 受影响的任何消息。为了能够取回这类数据,现新增选项 ignore-cipher-failure,用于 pgp_pub_decrypt()pgp_sym_decrypt()。 设置 ignore-cipher-failure=1 将恢复此前的行为, 从而可以移除有缺陷的加密封装:

    pgp_sym_decrypt(encrypted_column, any key, 'ignore-cipher-failure=1')
    

    识别出受影响的消息并移除其封装后,即可使用现代算法重新加密。不过, OpenSSL 的行为必须与创建这些有缺陷消息时相同:如果不受支持的算法集合 并不相同,这种方法将无法奏效。请参阅 ignore-cipher-failure 的文档。

    PostgreSQL 项目感谢 Shishir Sharma 报告此问题。 (CVE-2026-14663)

  • 修复 psql:跳过脚本中的 COPY ... FROM STDIN 命令后面的内联数据,即使 COPY 在发送 PGRES_COPY_IN 前失败 (Tom Lane) § §

    此前,如果 COPY 命令在开始执行时失败(例如目标表不存在), psql 无法意识到这一点,会继续把随后的内联数据 当作 SQL 命令读取。即使在最好的情况下这也是错误的,在最坏的情况下则会 构成 SQL 注入风险。现在,psql 会识别语法有效的 COPY ... FROM STDIN 命令,并在服务器没有返回 PGRES_COPY_IN 时自行跳过数据。

    此修复不太可能影响生产 SQL 脚本,但测试脚本可能会有意测试失败的 COPY ... FROM STDIN 命令。此类脚本需要在每条 这样的命令后增加一行 \. 数据终止符。

    PostgreSQL 项目感谢 Alexander Lakhin 报告此问题。 (CVE-2026-6464)

  • 交叉检查运行 EXECUTEFETCH 的 portal 的输出行类型(Robert Haas) §

    EXECUTEFETCH 使用两个 portal: 外层 portal 用于语句本身,内层 portal 则代其运行实际查询。 此前可以使两个 portal 声明的行类型不一致,从而导致服务器内存泄露和 任意代码执行。

    PostgreSQL 项目感谢 Ben Morris(与 Claude 和 Anthropic Research 协作)和 Peter Geoghegan 报告此问题。 (CVE-2026-16239)

  • 修复 to_char() 处理过长时区缩写时发生的 缓冲区越界写入(Tom Lane) §

    这很容易导致服务器崩溃,并且已有报告表明可利用该问题执行任意代码。

    PostgreSQL 项目感谢 Hcamael、Amjad Shahzad、AntAISecurityLab 的 Tan Zhen、Tomer Fichman、 Zheng Yu、Amy Burnett(OpenAI Codex Security)、Rick de Jager、Heewon Song、Sylvie Mayer、Aleksander Alekseev 和 Hillai Ben Sasson 报告此问题。 (CVE-2026-14669)

  • 修复正则表达式匹配/拆分函数中的缓冲区越界写入(Masahiko Sawada) §

    如果传入编码无效的数据,这些函数可能会在转换缓冲区末尾之外写入数据。

    PostgreSQL 项目感谢 Francesco Verardi 报告此问题。 (CVE-2026-14664)

  • 增强 ascii() 函数对无效输入的防护 (Michael Paquier) §

    通过提供编码无效的输入,可以诱使此函数越界读取并返回几个不应访问的 数据字节。在启用断言的构建中,还可能触发其断言。

    PostgreSQL 项目感谢 Hcamael 报告此问题。 (CVE-2026-18024)

  • 修复 pg_restore_attribute_stats() 对多范围类型的处理 (OpenAI Security Research Team) § §

    pg_restore_attribute_stats() 将多范围类型当作其底层 范围类型处理。对于边界直方图,这是正确的,但对于其他所有统计信息类型 都是错误的。

    PostgreSQL 项目感谢 Amy Burnett(OpenAI Codex Security)报告此问题。 (CVE-2026-16238)

  • scalarineqsel() 检查预期为 tid 类型的常量是否确实属于该类型(Tom Lane) §

    对于所有使用此估算器的内置操作符,这一预期都会成立,但恶意构造的操作符 可能违反该预期,从而导致崩溃或服务器内存泄露。

    PostgreSQL 项目感谢 Hcamael 报告此问题。 (CVE-2026-14668)

  • 增强 tsvectortsquery 代码对超长值的防护 (包括单个词位以及向量/查询的总长度)(Tom Lane) § §

    文档所述限制并未在所有代码路径上强制执行。

    PostgreSQL 项目感谢 Yuhang Wu、Zhenpeng Lin、Zheng Yu 和 Hcamael 报告这些问题。 (CVE-2026-14662)

  • 修复多处错误地假定无需处理超过 FUNC_MAX_ARGS 个 函数参数的问题(Tom Lane) § §

    特别是,服务器对聚合函数参数数量的实际限制是 FUNC_MAX_ARGS - 1,但解析器未强制执行这一限制, 给后续处理带来隐患。

    PostgreSQL 项目感谢 Zheng Yu、ylwangtju 和 Masahiko Sawada 报告这些问题。 (CVE-2026-14679)

  • 拒绝从 SQL 调用接受或返回 internal 类型的函数 (Tom Lane) § §

    现有防护已被证明不足,因此添加更明确的检查。

    PostgreSQL 项目感谢 Amy Burnett(OpenAI Codex Security)报告此问题。 (CVE-2026-14680)

  • ALTER TABLE 重建扩展统计信息对象时保留其所有权 (Masahiko Sawada) §

    此前,执行 ALTER TABLE 的角色会取得这类对象的所有权, 这并不合适。

    PostgreSQL 项目感谢 Noah Misch 报告此问题。 (CVE-2026-6469)

  • 逆解析 EXTRACT() 函数调用时,按需为字段名加引号 (Nathan Bossart) §

    解析器接受 EXTRACT() 中的任意字符串字面量作为字段名, 并将验证推迟到执行阶段。如果该调用被存储后再逆解析(例如在 pg_dump 期间),字符串正文会被原样输出, 从而造成 SQL 注入。

    PostgreSQL 项目感谢 Ben Morris(与 Claude 和 Anthropic Research 协作)报告此问题。 (CVE-2026-15741)

  • 在此前漏检的场景中检查数据类型的 USAGE 权限 (Nathan Bossart) § § §

    CREATE TYPE AS RANGEALTER TABLE OF 以及创建存储表达式的命令此前都没有执行这一检查。这些遗漏使没有 USAGE 权限的角色仍能创建依赖该类型的对象,并可能阻止 类型所有者日后更改该类型。

    PostgreSQL 项目感谢 Jingzhou Fu 报告此问题。 (CVE-2026-6470)

  • 角色发生变更后使依赖角色的缓存计划失效 (Ilya Staroverov、Shinya Kato、Nathan Bossart) §

    角色成员关系、角色属性和数据库所有权的变更可能影响行级安全策略的预期行为, 但此前系统仍会继续使用按旧状态生成的缓存计划。

    PostgreSQL 项目感谢 Ilya Staroverov 和 Shinya Kato 报告此问题。 (CVE-2026-14666)

  • 在直接 SSL 连接之后拒绝 GSSEncRequest(Michael Paquier) §

    建立 TLS 加密连接后,服务器仍会接受 GSSAPI 加密请求。如果请求成功, 连接仍会使用 TLS 加密,但在 pg_hba 规则看来却像 GSS 连接。因此,意图禁止 TLS 的 pg_hba 策略无法 得到正确执行。

    PostgreSQL 项目感谢 p4p3r 报告此问题。 (CVE-2026-14681)

  • 让模拟的 SCRAM secret 更可信(Nathan Bossart) §

    如果尝试以 SCRAM 登录不存在或没有 SCRAM secret 的角色,系统会生成一个 模拟 secret 并照常执行认证握手,以免向攻击者泄露这些事实。但模拟 secret 使用固定的迭代次数,这本身可能形成可观察的响应差异。现改用配置设置 scram_iterations,使模拟 secret 更接近该安装中的真实 secret。

    PostgreSQL 项目感谢 Radim Marek 报告此问题。 (CVE-2026-14672)

  • 修复 ecpg 应用程序因接收服务器返回的无效 bytea 数据而发生的越界写入 (Michael Paquier) §

    ecpg 未经检查便假定任何 bytea 值 都必须以 \x 开头。有缺陷或恶意的服务器可能发送短于 2 字节的 字符串,从而破坏应用程序内存。

    PostgreSQL 项目感谢 ylwangtju 报告此问题。 (CVE-2026-16241)

  • 不要对 psql\unrestrict 命令参数执行反引号扩展(Nathan Bossart) §

    CVE-2025-8714 修复中的这一疏漏,使恶意服务器能够把 shell 命令注入 纯文本转储输出,并在恢复时于运行 psql 的机器上 执行;这正是 CVE-2025-8714 意图防止的场景。

    PostgreSQL 项目感谢 Lucas Velgus、Filip Janus 和 Daniel Bakker 报告此问题。 (CVE-2026-18408)

  • 移除 pg_dump 关于 pg_proc.protrftypes 不可能包含超过 FUNC_MAX_ARGS 个条目的假设 (Tom Lane) §

    由于该数组可能同时包含输入和输出参数的条目,其长度完全可能超过 FUNC_MAX_ARGS(该值只限制输入参数)。即使并非如此, pg_dump 也不能假定服务器构建时使用的 FUNC_MAX_ARGS 值与自身相同。越界写入会导致 pg_dump 内部的内存被破坏。

    PostgreSQL 项目感谢 Masahiko Sawada 报告此问题。 (CVE-2026-19385)

  • 增强 PL/Perltied Perl 数组和哈希的防护(Tom Lane) §

    行为不符合常规的 tied 对象可能导致内存覆盖,或构造出损坏的结果数组 (这很可能在之后引发问题)。

    PostgreSQL 项目感谢 Hcamael 报告此问题。 (CVE-2026-14670)

  • 修复 PL/PerlPL/Tcl 内存分配计算中的整数溢出(Heikki Linnakangas) §

    该问题与 CVE-2026-6473 属于同一类型,只是出现在代码的不同部分, 并采用相同方式修复。

    PostgreSQL 项目感谢 Tulya Project(Team Dhiutsa、Bitecope Technologies Private Ltd) 报告此问题。 (CVE-2026-14677)

  • 确保 contrib/amcheck 函数在执行索引表达式前限制 search_path(Noah Misch) §

    由于 amcheck 会以相关表所有者的身份运行这些索引表达式,调用者可能劫持 依赖 search_path 的函数,以表所有者身份运行任意代码。 默认情况下这并非漏洞,因为只有超级用户可以调用 amcheck 函数;但如果将 该权限授予其他用户,造成的风险会比文档所述更大。

    PostgreSQL 项目感谢 Yuelin Wang 和 Jacob Brazeal 报告此问题。 (CVE-2026-14673)

  • 修复 contrib/fuzzystrmatchlevenshtein()levenshtein_less_equal() 函数中的整数溢出 (Nathan Bossart) §

    向这些函数传入很大的代价值可能引发整数溢出,从而产生无意义的结果, 甚至在某些情况下导致越界写入。

    PostgreSQL 项目感谢 Ben Morris(与 Claude 和 Anthropic Research 协作)报告此问题。 (CVE-2026-15742)

  • 修复 contrib/pg_stat_statements 中的缓冲区越界写入 (Álvaro Herrera) §

    查询规范化过程未准确计算规范化字符串所需的空间。

    PostgreSQL 项目感谢 Sajeeb Lohani(与 TrendAI Zero Day Initiative 合作)和 Yuelin Wang 报告此问题。 (CVE-2026-14676)

  • 修复 contrib/pg_trgm 的 GiST picksplit 函数中的 数据类型错误(Heikki Linnakangas) §

    此错误会导致缓冲区越界读取,通常造成不佳的页面分裂决策;在极少数情况下 也可能导致崩溃。

    PostgreSQL 项目感谢 Mehmet D. Ince 报告此问题。 (CVE-2026-14678)

  • 移除 contrib/refint 中的计划缓存 (Ayush Tiwari) §

    这种缓存行为存在几个严重缺陷,尤其是 check_foreign_key() 会把新键值嵌入其级联 UPDATE 查询, 因此缓存计划会重复使用最初所需的值,而不是当前应使用的键值。 最简单的解决办法是移除该缓存。

    PostgreSQL 项目感谢 Hcamael 报告此问题。 (CVE-2026-14671)

  • 确保并行 GIN 索引构建正确更新表的 pg_class.reltuples 值(Jan Nidzwetzki、Tomas Vondra) §

    并行工作进程可能会用未初始化的值报告其已处理行数,导致 reltuples 得到无效值,甚至 Infinity 或 NaN。 此类值可能导致后续的自动清理和自动分析操作始终判定该表不需要处理。 出现这种情况后不会自行恢复。需要手工执行 ANALYZE 命令或创建另一个索引,才能把 reltuples 重置为 正确值。如果有任何带 GIN 索引的表,建议检查其 reltuples 条目是否合理。以下查询可能有助于此检查:

    SELECT DISTINCT t.oid::regclass, t.reltuples
    FROM pg_class t
      JOIN pg_index i ON t.oid = i.indrelid
      JOIN pg_class ic ON i.indexrelid = ic.oid
    WHERE t.relhasindex AND ic.relam = 2742;
    
  • 修复重新扫描异步 Append 计划节点时异步读取处理不当的问题 (Alexander Korotkov、Gleb Kashkin、Etsuro Fujita) §

    当上层计划节点尚未读取完整的 Append 输出就重新扫描 Append 时, 需要丢弃所有已发送到外部服务器且尚未完成的请求(例如由 postgres_fdw 发送的请求)。此前,当子计划的 参数发生变化,或者在下一次扫描中被分区剪枝丢弃时,这项操作未能 正确完成。这可能导致错误的查询结果、无限循环或断言失败。

  • 修复 RANGE 分区表的分区剪枝错误(David Rowley) §

    在某些情况下,本不应跳过的 DEFAULT 分区会被跳过,这可能导致 查询结果中缺少行。

  • 剪枝结果关系后,正确更新 ModifyTable 计划节点中的外部数据包装器状态 (Ayush Tiwari、Rafia Sabih) § §

    此前,如果运行时分区剪枝判定作为目标的分区表中某些分区无需扫描,而该表又 包含任何外部表分区,就很可能发生崩溃或错误行为。

  • 修复 UPDATE 使用 RETURNING OLD 时, 在带有 BEFORE UPDATE 触发器的表上漏掉并发更新的问题 (Dean Rasheed) §

    如果目标行被并发更新,那么在隔离级别 READ COMMITTED 下,任何 OLD 值在 RETURNING 中都应反映更新后的行。但如果存在触发器, 返回的却是陈旧值(尽管触发器本身和最终输出行看到的是正确值)。

  • 修复存在多个连接键和大量 NULL 值时哈希连接的性能问题(David Rowley) §

    NULL 键元组不应插入哈希表,因为它们绝不会匹配任何其他元组。如果 NULL 位于非末尾连接列,代码就会错误处理;当大量输入包含 NULL 时,哈希表会 因此严重膨胀。

  • 修复带圆括号的 OLD/NEWRETURNING 表达式中的解析(Marko Grujic) §

    诸如 (old).colname(old).* 的表达式 处理有误,实际上被转换成了 NEW 引用。

  • 修复规划器对 value IN (array) 表达式所做的可空性和 严格性检查(Ayush Tiwari) §

    只有在已知数组操作数非空时,这些检查才应成功,但此前遗漏了这项 考虑,因而可能应用本不该采用的优化。如果数组实际为空,这可能导致 查询结果错误。

  • 修复错误的连接移除逻辑(Matheus Alcantara、Richard Guo) § §

    在边缘情况下,来自外连接可空侧内部的常量输出值可能在应替换为 NULL 时未被替换。

  • 在移除连接期间更彻底地清理 PlaceHolderVars (Richard Guo、Arne Roland) § §

    此修复更正了各种可能触发断言或产生错误计划的边缘情况。

  • 补上对容器数据类型(数组、复合类型、范围类型)进行等值比较时遗漏的 可哈希性检查(Andrei Lepikhov、Tom Lane) §

    规划器在决定可以使用基于哈希的计划类型之前,必须验证容器组成类型的 可哈希性。此前有些地方遗漏了这一步,导致执行时出现 could not identify a hash function 错误。

  • 避免将 WHERE 子句下推越过使用不同等价规则的分组步骤 (Richard Guo) §

    对采用非确定性排序规则分组的分组列所作的测试,只有在使用同一排序规则 进行比较时才能安全地下推。否则,它可能过滤掉一些本应被分组合并的行。

  • 修复 COUNT 窗口函数的错误优化:这些函数带有 EXCLUDE 子句或缺少 ORDER BY (Chengpeng Yan、David Rowley) §

    这些窗口函数在不应被视为单调函数的情况下被当成单调函数处理, 因而可能计算出错误答案。

  • 避免 cache lookup failed for collation 0 错误;该错误发生在 规划器为 "char" 类型的列查找统计信息时(Feng Wu) §

  • 修复 ALTER COLUMN ... DROP EXPRESSION 在存在多级 分区时无法正常工作的问题(Alberto Piai) §

  • 修复为排他约束索引附加分区的问题(Japin Li) §

    值得注意的是,这一疏漏破坏了分区排他约束的导出/恢复。

  • 禁止设置 NO INHERIT;分区 NOT NULL 约束 不允许使用 ALTER CONSTRAINT 进行此设置 (Andreas Karlsson) §

    分区表上的 NOT NULL 约束应由所有分区继承,因此不得标记为 NO INHERIT。创建约束时正确执行了此规则,但 ALTER TABLE ... ALTER CONSTRAINT 未执行此规则。

  • 禁止将规则重命名为 _RETURN(Tom Lane) §

    该名称保留给视图的 ON SELECT 规则,但 ALTER RULE 允许将其他规则重命名为 _RETURN,从而引发后续问题。

  • 修复 DROP OWNED BY 中角色成员资格授权未释放锁的问题 (Jeff Davis) §

    这一疏漏会产生警告消息,随后成员资格授权上的锁会一直保留到事务结束。

  • 修复 EXPLAIN 在逆解析 SQL/JSON 聚合时 失败的问题(Richard Guo) §

    某些计划结构会导致 invalid JsonConstructorExpr underlying node type 错误。

  • 修复 REINDEX CONCURRENTLY 与可延迟唯一约束一起 使用时的问题(Nitin Motiani) §

    REINDEX CONCURRENTLY 期间创建的临时索引副本被 错误地标记为强制立即满足唯一性,导致虚假的约束违例报告。

  • 修复 LIKE 在非确定性排序规则下的反斜杠匹配问题 (Nitin Motiani、Tom Lane) § §

    使用非确定性排序规则时,LIKE 会错误处理转义后的反斜杠 (\\),实际效果相当于该字符不存在。对于普通字符前的 前导反斜杠,它也处理错误;在这种情况下,反斜杠实际应被忽略,但它却 导致普通字符被精确匹配,而不是让非确定性排序规则判断是否匹配。

  • 修复精确匹配模式的 LIKE/正则表达式索引扫描优化 (Jelte Fennema-Nio) §

    非确定性排序规则下的 LIKE 重构意外破坏了以下优化:当索引 排序规则与表达式排序规则不匹配时,把 LIKE 或正则表达式的 精确匹配模式转换成等值索引条件。不仅如此,这还使 psql\d tablename 命令慢了很多。

  • 修复 to_date() 对本地化月份名和星期名的匹配 (Heikki Linnakangas) § §

    当大小写折叠改变字符串的字节长度时,匹配逻辑会出现错误行为。

  • 更正希腊语词尾 sigma 的大小写折叠规则(Jeff Davis) §

    如果字符串前面只有 Case Ignorable 字符,则不要将其视为词尾 sigma。 这仅影响内置 pg_unicode_fast 区域设置。

  • 修复 Hangul U+11A7 (TBASE) 的 NFC 重组错误 (Diego Frias、Michael Paquier) §

    该字符被当作有效的 T 音节,但实际上并非如此,因此在规范化过程中被 悄然吞掉。

  • 避免不区分大小写的 synonym 词典可能截断输出词位 (Jeff Davis) §

    如果折叠为小写增加了词位的字节长度,输出时会错误地将其截断为原来的 字节长度。

  • 增强大小写转换逻辑对截断 UTF-8 字符的防护(Jeff Davis) §

  • 修复 hash_record_extended() 中的拼写错误 (Man Zeng) §

    代码未初始化传给 FunctionCallInvoke() 的第二个 isnull 参数。对于 现有的核心内置扩展哈希支持函数,这不会造成影响,因为它们不会检查 该值。不过,如果扩展提供的哈希函数检查 PG_ARGISNULL(1),就可能受到影响。

  • 修复 pg_get_publication_tables() 在可发布表被并发删除时 失败的问题(Bharath Rupireddy) §

  • 防止 satisfies_hash_partition() 在使用 VARIADIC NULL 时崩溃(Robert Haas) §

  • 使 tsvector_filter() 及相关函数以更清晰且一致的 方式报告无效权重错误(Ewan Young) §

    特别是,以八进制形式 (\nnn)报告不可打印的 ASCII 权重字符,就像 charout() 对它们的呈现方式 一样。这可以避免生成编码无效的错误消息。

  • 拒绝 uuidv7() 中超出范围的时间戳偏移值 (Baji Shaik) §

    偏移值不得大到使时间戳超出 v7 UUID 可表示的范围。此前会生成无效的 UUID 值。

  • 修复 xpath() 对命名空间节点处理不当的问题 (Michael Paquier) § §

    此修复避免了意外的 could not copy node 错误。

  • 修复 jsonpath.decimal 方法对无效精度 或小数位数抛出硬错误的问题(Ewan Young) § §

    静默模式本应抑制这些错误,但未能做到。

  • 修复 IS JSON 或类似构造的参数属于字符串类别但缺少到 text 类型的类型转换时发生的空指针崩溃(Ayush Tiwari) §

    PostgreSQL 核心中没有这种数据类型, 但某些扩展类型可以触发该问题。

  • 确保 SQL/JSONON EMPTY / ON ERROR DEFAULT 值按正确的 typmod 进行强制转换(Ewan Young) §

    例如,numeric 目标列所声明的精度和小数位数此前没有应用于 默认值。

  • 避免将最小的 money 值除以 -1 时出现依赖机器的行为 (Andrey Rachitskiy) §

  • 修复为文本搜索词典创建缓存条目的过程中发生内存不足后导致的崩溃 (Tom Lane) §

  • 修复处理格式错误的 ispell/hunspell 词典文件时的内存安全缺陷 (Andrey Rachitskiy) §

  • 禁止访问其他会话的临时表(Jim Jones、Daniil Davydov、 Alexander Korotkov) § §

    某些代码路径未能阻止这种访问,导致在没有报错的情况下得到错误 (不一致)的结果。

  • 防止访问临时表期间出现 no empty local buffer available 错误(Melanie Plageman) §

    限制读取流机制可使用的本地缓冲区数量。此前,较大的 effective_io_concurrency 值可能允许单个流用尽所有 缓冲区,从而导致失败。

  • 修复自动清理处理数据库的顺序(Rustam Khamidullin) §

    它无意中按评分从低到高处理数据库,而正确顺序应当相反。

  • 恢复 VACUUM 在回卷失效保护模式下完整使用共享缓冲池的能力 (Melanie Plageman) § §

    普通 VACUUM 仅允许使用少量共享缓冲区,以免对其他处理 造成过多影响。然而,在失效保护模式下,我们希望尽快回收事务 ID,因此 应取消该限制,使清理能尽可能快地进行。这一行为在 v18 重构期间意外失效; 现予恢复。

  • 修复并行清理工作进程中的内存泄漏(Baji Shaik) §

    并行工作进程每次生成进度报告时都会泄漏约 1kB 内存,浪费的内存在该 工作进程的整个生命周期内不断累积。

  • 在清理 GIN 索引 posting-tree 期间响应查询取消并遵守清理延迟 (Paul Kim、Alexander Korotkov) §

    常见值的 posting tree 可能很大,因此遗漏这项检查可能导致清理运行 很长时间后才注意到中断。

  • 修复 GiST 和 SP-GiST 仅索引扫描期间可能错误解码索引元组的问题 (Peter Geoghegan) §

    此错误可能导致仅索引扫描计划输出损坏的数据。唯一受影响的核心操作符类 是 GiST 的 range_ops,并且只有当范围列不是第一个索引列时才可能出错。

  • 确保批量扩展的表中新出现的最后一个块被及时加入其空闲空间映射 (Jingtang Zhang) §

    一个差一错误导致多块表扩展的最后一个块未在映射中标记为空闲。 清理最终会纠正此问题,但在此之前这部分空间无法使用。

  • 避免事务中止期间资源清理中可能发生的双重释放或无限错误恢复循环 (Tom Lane) §

  • 创建目录时,容忍同一目录被并发创建(Andrew Dunstan、Tom Lane) §

  • 修复 JIT 编译的元组解构代码,使其正确考虑虚拟生成列(David Rowley) §

  • 通过在任何被依赖对象上取得共享锁,防止创建悬空的对象依赖关系 (Bertrand Drouvot) § §

    该共享锁会与任何删除被依赖对象的尝试冲突,从而消除之前存在的竞态条件。 例如,如果一个会话删除一个在其看来为空的模式,同时另一个会话在该模式 中创建函数,此前两个事务都可能提交,并留下无效的函数定义。现在,其中 一个事务会失败。

  • 修复 SERIALIZABLE 隔离模式中冲突检测的竞态条件 (Peter Geoghegan) §

    检查最初为空的 B-树 索引时可能漏掉冲突,因错误地允许冲突事务提交而 破坏可串行性。

  • 修复 ProcSignalBarrier 代码中的竞态条件(Masahiko Sawada) §

    此错误可能导致进程卡住,通常发生在报告 still waiting for backend with PID nnnn to accept ProcSignalBarrier 之后。

  • 修复属于同一锁组的一组进程同时退出时的竞态条件(Vlad Lesin) § §

    这些错误可能导致 PANIC 中止,并出现 latch already owned 等消息。普通并行查询通常不会出现 此问题,因为领导者在看到其工作进程结束之前不会退出;但某些扩展会 触发此问题。

  • 修复表可见性映射清位操作的 WAL 日志记录 (Melanie Plageman、Andres Freund) § § §

    WAL 汇总器漏掉了这类可见性映射变更,可能导致错误的增量备份。我们也 没有在需要时记录这类可见性映射页的整页镜像,因而可能无法纠正撕裂页写入。 这可能造成后续行为异常,例如仅索引扫描返回错误结果。

  • 防止 WAL 汇总进程在时间线切换时卡住(Robert Haas) § §

  • 修复备库提升期间逻辑解码选择时间线时的竞态条件(Bertrand Drouvot) § §

    在备库上执行的逻辑解码可能会失败,并出现 requested WAL segment has already been removed 错误。 重试即可成功,因此没有永久性问题,但存在可用性隐患。

  • 避免在时间线跳转期间暴露 WAL 接收进程的完整连接字符串(Chao Li) §

    pg_stat_wal_receiver 视图应显示不含敏感数据的 脱敏连接字符串。但复用现有 WAL 接收进程时,它会短暂显示完整字符串。

  • 使用运行时检查而不只是 Asserts,验证逻辑复制期间接收的元组具有正确的 列数(Varik Matevosyan) §

    恶意或有缺陷的发布者可能发送列数不一致的数据。虽然尚未找到会因此 产生严重不良后果的场景,但额外谨慎似乎是必要的。

  • 改进构造的复制命令中字符串参数的引用处理(Tom Lane) §

    多处生成复制命令的代码在引用复制槽名称及其他需要插入命令的参数时不够 谨慎。这可能导致命令出现意外的语法错误。原则上,精心构造的复制槽名称 可能导致 SQL 注入;但这种场景在实践中似乎极不可能发生,因为只有高权限 用户才能调用复制操作,而且他们没有理由使用来自不可信来源的槽名称。

  • 修复对空预备事务的逻辑解码(Masahiko Sawada) §

    未产生任何可解码更新的预备事务可能导致向输出插件发送 COMMIT/ROLLBACK PREPARED,而之前没有发送 PREPARE。对于内置订阅者,这会破坏复制,其他插件 很可能也无法正确处理。

  • 修复备库提升后不记录 WAL 的序列损坏的问题(Fujii Masao) §

    此前,如果在主库上创建了不记录 WAL 的序列并将其复制到备库,那么提升备库后 访问该序列可能会失败,并出现 bad magic number in sequence 或相关错误。

  • 修复回退到归档后级联备库无法重新连接的问题(Marco Nenciarini) §

    回退到归档恢复后,级联备库可能因 requested starting point ... is ahead of the WAL flush position 而无法重新连接到其上游备库。

  • 防止在 WAL 重放达到一致的数据库状态之前接受热备连接(Nikhil Sontakke) §

  • 不要尝试在备库本地清除 pg_database.dathasloginevt (Ayush Tiwari) §

    事件触发器清理尝试在备库和主库上都执行该操作。它在备库上无法奏效, 而且没有必要,因为重放主库的数据库变更很快就会修复该值。

  • 避免删除过时复制槽时的竞态条件(Xuneng Zhou) §

    如果另一个会话立即复用了已删除复制槽的共享内存条目,可能会错误地 执行解锁并输出不正确的日志消息。

  • 避免删除临时复制槽时的竞态条件(Zhijie Hou) §

    释放槽的代码在释放复制槽后,还会对该槽的共享内存条目执行一些额外更新。 这并不安全,因为另一个会话可能立即复用已删除槽的共享内存条目。对于 临时槽,现跳过这些更新。

  • 修复逻辑复制表同步期间陈旧的进度报告(Shinya Kato) §

    此前,即使数据复制已经完成,订阅者中的 pg_stat_progress_copy 视图仍会把最初的 COPY 操作显示为活动状态。在同步追上发布者之前, 该陈旧条目会一直可见。

  • 在备份失败时清除基础备份进度(Chao Li) § §

    此前,失败后 pg_stat_progress_basebackup 视图会继续显示过时的进度条目,直到复制客户端断开连接。 pg_basebackup 通常会立即断开连接, 但其他客户端可能不会。

  • 修复启用 track_functions 时并发删除 pgstats 条目 可能导致的 PANIC(Sami Imseih、Michael Paquier) § § §

  • 未能为对应的共享哈希表条目获取空间后,清理已损坏的本地 pgstats 条目 (Niall Newman) §

    如果不进行清理,下次使用该本地条目时会导致空指针解引用。

  • 避免读取或写入失败后记录错误的 I/O 操作统计信息(Bertrand Drouvot) §

  • PL/Perl 中,避免处理无效的 PostgreSQL::InServer::ARRAY 对象时因解引用 NULL 指针而 崩溃(Xing Guo) §

  • PL/Python 中,正确检查处理序列和映射对象 时发生的错误(Richard Guo) §

    此前,损坏的对象或未处理的异常可能导致解引用 NULL 指针而崩溃。

  • libpq 中,执行 pqReadData() 时始终排空 SSL 或 GSS 解密缓冲区中 所有待处理的字节(Jacob Champion) § § § §

    这可以避免一种边界情况:libpq 或调用它的 应用程序等待套接字上有更多数据到达,而实际上所有数据都已经到达。

  • 改进 libpq 对内存不足情况的处理 (Anthonin Bonnefoy) §

  • 修复 libpq 的跟踪功能,使其正确打印新式 BackendKeyData 和 CancelRequest 消息(Anthonin Bonnefoy) §

  • 允许 libpq 接受超过 30000 字节的 ParameterDescription 消息(Ning Sun) §

    此前,libpq 的有效性启发规则并未把这种消息 类型视为可能很长。此限制会导致参数超过 7498 个的预备查询失败;这种 情况虽然不太可能出现,但系统确实支持。

  • 修复 ecpg 编译器中的空指针崩溃 (Jehan-Guillaume de Rorthais) §

    ecpg 无法处理这样的 DECLARE 段: 其中含有嵌套在 struct 内的 union。

  • 拒绝 ecpgGET/SET DESCRIPTOR 语句中存在多个描述符首部项(Masashi Kamura) §

    此前语法允许这种形式,但会生成有缺陷的 C 代码。现调整语法和文档, 只允许一个首部项。

  • 修复 psql 流水线模式下延迟错误的问题 (Michael Paquier) §

    在服务器响应 Sync 消息时报错的某些场景(例如延迟约束违例)中, psql 可能卡住或发生断言失败。

  • 使 psql 扩展对齐输出格式中的行宽保持一致 (Pavel Stehule) §

    当表的数据行比记录标题行窄时,将数据行加宽到与标题行一致,从而避免 输出不美观。

  • 强制执行 psql 特殊变量 WATCH_INTERVAL 的原定上限 (Sven Klemm、Daniel Gustafsson) §

    如果给出的值过大,psql 会报告错误但仍应用该设置。

  • 修复 psql\l+ 中 显示数据库大小时的权限检查(Christoph Berg) §

    底层服务器函数允许具有 pg_read_all_stats 权限的用户 查看所有数据库的大小,即使他们没有 CONNECT 权限。 但 psql 不知道这一规定,除非用户具有 CONNECT 权限,否则不会调用该函数。

  • 修复 psql\df 的 制表符补全,使其也涵盖过程(Erik Wienhold) §

  • 修复 pgbench 中的线程安全性缺陷 (Fujii Masao) §

    pgbench 使用多个线程和 --verbose-errors 选项运行时,不同线程可能尝试使用 同一个缓冲区构造错误消息,导致日志输出损坏。

  • pg_combinebackup 中,防止源文件短于预期时 出现无限循环(Peter Eisentraut) §

  • 修复 pg_createsubscriber 出错后对发布端对象的清理 (Nisha Moond) §

    pg_createsubscriber 在创建逻辑复制对象后失败时, 它应删除在发布端创建的发布和复制槽。某些错误情形未能这样做。

  • pg_recvlogical 输出文件采用源集簇的 文件组读权限(Fujii Masao) §

    文档声称 pg_recvlogical 会这样做,但它从未 实际启用组读权限。

  • 修复 pg_restore 使用 --statistics--statistics-only 时的 不一致行为(Chao Li、Michael Paquier) § §

    --schema 等其他选择性恢复选项结合使用时,这些选项 未能恢复预期项目,与使用类似选项的 pg_dump 行为不同。

  • 修复 vacuumdb --missing-stats-only,使其忽略分区表达式索引 (Baji Shaik) §

    此前,vacuumdb 总是尝试对分区表执行 ANALYZE,但这毫无作用,因为分区索引本身从不创建 统计信息,只有其叶子索引才创建。

  • contrib/amcheck 中,修复未能报告 B-树 元页的 allequalimage 标志损坏的问题(Chao Li) §

  • contrib/amcheck 中,修复验证 GIN 索引时查询生命周期内的 内存泄漏(Kirill Reshke) §

  • contrib/amcheck 中,正确处理短头部 varlena Datum(Andrey Borodin) §

    此错误可能导致验证 B-树 索引时执行多余工作,但似乎没有造成更严重的 后果。

  • contrib/btree_gist 中,修复 NaNfloat4float8 操作符类中的处理(Bill Kim、Tom Lane) §

    比较以及 GiST penalty 和 distance 函数都没有考虑 NaN,因而在遇到该值时会给出错误结果。建议在安装此 更新后对 float 列上的 btree_gist 索引重建索引, 前提是这些列中可能存在 NaN 条目。

  • contrib/btree_gist 中,修复构建 GiST 索引时对 bit/varbit 条目的排序(Tom Lane) §

    bit 类型的值被当作 bytea 排序。由于类型的表示形式不同, 虽然这不会导致明显失败,却会产生低效索引。安装此更新后,建议对 bit 列上的 btree_gist 索引重建索引。

  • contrib/btree_gist 中,修复使用不等操作符的 搜索(Ayush Tiwari) §

    对于变长数据类型,扫描非叶索引页的代码使用了错误的比较函数,导致结果 错误并可能引发崩溃。

  • contrib/dblinkcontrib/postgres_fdw 中,确保用户映射上的 use_scram_passthrough 设置优先于外部服务器上的设置 (Matheus Alcantara) § §

    此前的优先级正好相反,但这与其他外部表选项的行为不一致。

  • 拒绝将 use_scram_passthrough 设置到 contrib/dblink 外部数据包装器上(Matheus Alcantara) §

    此选项仅对外部服务器和用户映射有意义,但 dblink 错误地允许在 FDW 级别设置它(随后又忽略它)。

  • 修复以下模块中缺少防护的递归和循环: contrib/hstore_plperlcontrib/jsonb_plperlcontrib/jsonb_plpython (Aleksander Alekseev) § §

    防止处理深度嵌套的 jsonb 值时发生栈溢出,并允许中断尝试 解引用 Perl 对象引用的环状链时造成的无限循环。

  • 修复 contrib/intarray 中遗漏释放统计信息 catcache 条目的问题(Man Zeng) §

    此疏漏会导致 resource was not closed: cache pg_statistic 之类的警告。

  • contrib/ltree 中,修复比较时的整数溢出 (Ayush Tiwari) §

    包含超过约 14,653 个标签的 ltree 值会因溢出而得到错误的 比较结果。如果 B-树 索引包含这类值,它很可能已经损坏,应在安装此 更新后重建索引。

  • contrib/pgcrypto 中,避免使用 OSSLCipher 对象期间 遇到错误后因双重释放而崩溃(Yuelin Wang) §

  • 修复 contrib/pg_prewarm 的 autoprewarm 工作进程中的 越界访问(Matheus Alcantara) §

    代码试图获取数组末尾之后一个位置的值,可能导致段错误。

  • 修复 contrib/pg_surgeryheap_force_killheap_force_freeze 函数中的数组越界写入 (Michael Paquier) §

    尝试更改偏移号等于 MaxHeapTuplesPerPage 的 TID 时,会在已分配数组的 末尾之外写入一个字节,可能导致服务器崩溃。

  • contrib/pg_surgery 中,避免包含超过 64K 个元素 的 TID 数组导致无限循环(Andrey Rachitskiy) §

  • 避免 contrib/refintcheck_foreign_key() 中解引用 NULL 指针 (Ayush Tiwari) §

    在更新时级联的情况下,被引用列的 null 值会导致崩溃。这是 CVE-2026-6637 修复中的一项疏漏,但修复之前的代码也并不真正正确。

  • 修复 contrib/seg,使其正确打印带有 ~ 确定性指示符的线段(Ewan Young) §

    由于拼写错误,seg_out() 不会打印附加在线段上界的 ~ 确定性指示符。更糟的是,如果下界带有 ~ 而上界没有指示符,上界会完全不被打印,从而错误地 将该值转换为开区间。

  • 修复 contrib/xml2xpath_nodeset() 函数处理命名空间节点时的崩溃 (Andrey Chernyy、Michael Paquier) §

  • 支持使用 OpenSSL 4 构建 PostgreSQL (Daniel Gustafsson) §

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

    Alberta(America/Edmonton)将从 2026 年 11 月开始全年采用 UTC-06 (实际上就是永久 DST)。本次发布假定其 TZ 缩写从那时起为 CST。这看起来可能会改变,但尚不清楚会使用什么新缩写。

    Morocco(Africa/Casablanca)将从 2026-09-20 起改为永久 UTC+00, 不再进行夏令时转换。