发布日期:. 2026-08-13
本次发布包含自 18.4 以来的多种修复。关于大版本 18 中的新特性,请参见Section E.6。
注意:由于在封版后发现了一个回归问题,18.5 从未发布。
对于正在运行 18.X 的用户,无需进行转储/恢复。
不过,下面的前三个安全条目描述了一些配置调整和数据清理操作,在更新之后您可能需要执行它们。
此外,如果您有任何 GIN 索引,请参见下面关于这些索引所属表的
reltuples 值可能已损坏的更新日志条目。
此外,如果您使用了 contrib/btree_gist
或 contrib/ltree,则可能需要重建使用这些扩展创建的索引;详情参见下面的相关条目。
此外,如果您正在从早于 18.2 的版本升级,请参见Section E.4。
将逻辑解码输出插件限制为由新服务器参数
output_plugin_libraries
所指定的集合(Jacob Champion)
§
§
之前,复制用户可以为逻辑解码选择任何可加载的库,从而可能被利用来进行各种攻击。为了在不破坏既有可用配置的前提下收紧这一权限,此版本引入了允许使用的输出插件白名单。
默认情况下,只有作为
PostgreSQL
一部分发布的输出插件(pgoutput 和 test_decoding)会被包含在
output_plugin_libraries 中。依赖其他输出插件的安装必须在更新服务器之后自行添加它们,例如:
output_plugin_libraries = 'pgoutput, test_decoding, my_trusted_decoder'
此外,当从版本 17 及更高版本进行迁移时,如果新集簇上的
output_plugin_libraries
参数不允许旧集簇上逻辑复制槽所使用的插件,则
pg_upgrade --check 将会失败。在执行
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 现在将无法解密以这种方式受到影响的消息。为了允许取回此类数据,为
pgp_pub_decrypt()
和 pgp_sym_decrypt()
新增了一个选项
ignore-cipher-failure。设置
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)
对运行 EXECUTE 或 FETCH 的门户的输出行类型进行交叉检查(Robert Haas)
§
EXECUTE 和 FETCH
使用两个门户:一个外层门户用于语句本身,另一个内层门户运行代表该语句执行的查询。之前有可能让这两个门户声明的行类型互不一致,从而导致服务器内存泄露和任意代码执行。
PostgreSQL 项目感谢 Ben Morris (in collaboration with Claude and Anthropic Research) 和 Peter Geoghegan 报告了此问题。(CVE-2026-16239)
修复 to_char() 中时区缩写过长导致的缓冲区越界问题(Tom Lane)
§
这很容易使服务器崩溃,并且已有报告称存在可导致任意代码执行的攻击利用。
PostgreSQL 项目感谢 Hcamael、Amjad Shahzad、Tan Zhen of AntAISecurityLab、Tomer Fichman、Zheng Yu、Amy Burnett (OpenAI Codex Security)、Rick de Jager、Heewon Song、Sylvie Mayer、Aleksander Alekseev 和 Hillai Ben Sasson 报告了此问题。(CVE-2026-14669)
修复正则表达式 match/split 函数中的缓冲区越界问题(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)
强化 tsvector 和 tsquery 相关代码以防御过长的值(包括单个词位以及整个 vector/query 的长度)(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 (in collaboration with Claude and Anthropic Research) 报告了此问题。(CVE-2026-15741)
在以前未能进行检查的地方检查数据类型上的 USAGE 权限(Nathan Bossart)
§
§
§
CREATE TYPE AS RANGE 没有进行检查,ALTER 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 认证密钥看起来更真实(Nathan Bossart) §
如果对一个不存在的角色或没有 SCRAM 密钥的角色尝试 SCRAM 登录,我们仍会生成一个模拟密钥并照常进行认证握手,以避免向攻击者泄露这些事实。但之前的模拟密钥是用固定的迭代次数生成的,这本身就可能构成一种可被观察到的响应差异。现在改用配置设置
scram_iterations,使模拟密钥看起来更像该安装中真正的密钥。
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/Perl 以防御被“绑定”的 Perl 数组和哈希(Tom Lane) §
一个行为不像常规对象的被绑定对象可能导致内存被覆写,或者构造出损坏的结果数组(这很可能在之后引发问题)。
PostgreSQL 项目感谢 Hcamael 报告了此问题。(CVE-2026-14670)
修复 PL/Perl 和 PL/Tcl 中内存分配计算里的整数溢出(Heikki Linnakangas) §
这与 CVE-2026-6473 属于同一类问题,只是发生在代码的不同部分,并以相同的方式修复。
PostgreSQL 项目感谢 the 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/fuzzystrmatch 的
levenshtein() 和
levenshtein_less_equal() 函数中的整数溢出(Nathan Bossart)
§
向这些函数传递很大的开销值可能导致整数溢出,从而产生无意义的结果,并且在某些情况下甚至会导致越界写入。
PostgreSQL 项目感谢 Ben Morris (in collaboration with Claude and Anthropic Research) 报告了此问题。(CVE-2026-15742)
修复 contrib/pg_stat_statements 中的缓冲区越界(Álvaro Herrera)
§
查询归一化没有准确计算归一化后的字符串所需的空间量。
PostgreSQL 项目感谢 Sajeeb Lohani (with 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)
§
并行 worker 可能会对其处理的行数报告一个未初始化的值,导致
reltuples
出现虚假值,甚至可能是 Infinity 或 NaN。这样的值可能导致后续的
autovacuum 和 autoanalyze
操作永远不会判定该表需要被处理。若是如此,这种情况将不会自愈。需要用一次手工的
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) § §
之前,如果运行时分区剪枝判定一个分区目标表的某些分区无需扫描,而该表又拥有任何外部表分区,则很可能发生崩溃或错误行为。
修复在拥有 BEFORE UPDATE 触发器的表上执行带
RETURNING OLD 的 UPDATE
时遗漏并发更新的问题(Dean Rasheed)
§
如果目标行被并发更新,那么在隔离级别
READ COMMITTED 下,RETURNING
中的任何 OLD
值都应反映更新后的行。但如果存在触发器,则会返回过时的值(尽管触发器本身以及最终的输出行看到的都是正确的值)。
修复存在多个连接键和大量 NULL 值时的哈希连接性能问题(David Rowley) §
以 NULL 为键的元组不应被插入到哈希表中,因为它们永远不会与其他元组匹配。如果 NULL 位于非最后的连接列中,代码就会把这一点弄错,当很多输入行包含 NULL 时,哈希表会变得相当臃肿。
修复在 RETURNING 表达式中对带括号的
OLD/NEW 的解析(Marko Grujic)
§
诸如 (old).colname 和 (old).* 之类的表达式被错误地处理,实际上被转换成了
NEW 引用。
修复规划器对
表达式的可空性与严格性检查(Ayush Tiwari)
§
value IN
(array)
只有当已知数组操作数非空时,这些检查才应当成功,但这一考量被遗漏了,使得本不应被应用的优化得到了应用。如果数组实际上为空,这可能造成错误的查询答案。
修复不正确的连接消除逻辑(Matheus Alcantara、Richard Guo) § §
在一些边界情况下,来自外连接可空一侧的常量输出值在本应被替换为 NULL 的时候可能没有被替换。
在连接消除期间更彻底地清理 PlaceHolderVars(Richard Guo、Arne Roland) § §
此修复纠正了多种可能触发断言失败或导致错误计划的边界情况。
为容器数据类型(数组、复合类型、范围)上的相等比较的可哈希性补充被遗漏的检查(Andrei Lepikhov、Tom Lane) §
规划器在决定可以使用基于哈希的计划类型之前,必须验证容器的组件类型是否可哈希。这一步骤在某些地方被遗漏了,导致在执行时发生“无法识别哈希函数”错误。
避免把 WHERE 子句下推越过具有不同等价规则的分组步骤(Richard Guo)
§
对于由非确定性排序规则所分组的分组列进行测试,只有当该测试是使用同一排序规则进行的比较时,将其下推才是安全的。否则它可能会过滤掉一些本会被分组所合并的行。
修复带有 EXCLUDE 子句或缺少
ORDER BY 的 COUNT 窗口函数被错误优化的问题(Chengpeng Yan、David Rowley)
§
这些窗口函数在本不应被视为单调函数时被当成了单调的,从而可能计算出错误的结果。
避免在规划器查找 "char" 类型列的统计信息时发生“排序规则 0 的缓存查找失败”错误(Feng Wu)
§
修复 ALTER COLUMN ... DROP EXPRESSION 在存在多级分区时无法工作的问题(Alberto Piai)
§
修复挂接作为排除约束的索引分区的问题(Japin Li) §
值得一提的是,这一疏漏破坏了分区排除约束的转储/恢复。
防止通过 ALTER CONSTRAINT 对分区的
NOT NULL 约束设置 NO INHERIT(Andreas Karlsson)
§
分区表上的 NOT NULL 约束应当被所有分区所继承,因此绝不能把它们标记为
NO INHERIT。这一规则在约束创建时会被正确地强制执行,但
ALTER TABLE ... ALTER CONSTRAINT 却没有这样做。
禁止把规则重命名为 _RETURN(Tom Lane)
§
该名称保留给视图的 ON SELECT 规则使用,但
ALTER RULE 允许把其他规则重命名为
_RETURN,从而在之后引发麻烦。
修复 DROP OWNED BY 中角色成员身份授权缺失锁释放的问题(Jeff Davis)
§
这一疏忽会导致发出一条警告消息,随后成员身份授权上的锁会一直保留到事务结束。
修复反解析 SQL/JSON 聚集时 EXPLAIN 失败的问题(Richard Guo)
§
某些计划结构会导致出现“无效的 JsonConstructorExpr 底层节点类型”错误。
修复将 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)
§
特别是,对于不是可打印 ASCII 的权重字符,以八进制形式(\)报告它们,就像 nnncharout() 渲染的那样。这避免了可能生成编码无效的错误消息。
在 uuidv7() 中拒绝超出范围的时间戳位移值(Baji Shaik)
§
位移值不能大到产生超出 v7 UUID 所能表示范围的时间戳。以前会生成一个垃圾 UUID 值。
修复 xpath() 对命名空间节点的错误处理(Michael Paquier)
§
§
此修复避免了意外的“无法复制节点”错误。
修复 jsonpath 的 .decimal 方法,使其不会因精度或标度不正确而抛出硬错误(Ewan Young)
§
§
静默模式本应抑制这些错误,但未能做到。
修复当 IS JSON 或类似结构具有属于字符串类别、但缺少到 text 类型的转换的参数时的空指针崩溃(Ayush Tiwari)
§
核心 PostgreSQL 中没有这样的数据类型,但使用某些扩展类型可以触发该问题。
确保 SQL/JSON 的 ON EMPTY / ON ERROR DEFAULT 值被强制转换为正确的 typmod(Ewan Young)
§
例如,numeric 目标列所声明的精度和标度没有应用到默认值上。
避免在将最小可能的 money 值除以 -1 时出现依赖机器的行为(Andrey Rachitskiy)
§
修复在为文本搜索词典创建缓存条目的中途发生内存耗尽失败之后的崩溃(Tom Lane) §
修复处理不正确的 ispell/hunspell 词典文件时的内存安全缺陷(Andrey Rachitskiy) §
防止访问其他会话的临时表(Jim Jones, Daniil Davydov, Alexander Korotkov) § §
一些代码路径未能防止这种情况,从而导致悄无声息的错误(不一致)结果。
防止在访问临时表期间出现“没有可用的空本地缓冲区”错误(Melanie Plageman) §
限制流式读取机制允许使用的本地缓冲区数量。以前,较大的 effective_io_concurrency 值可能允许单个流使用全部缓冲区,从而导致失败。
修复自动清理处理数据库的顺序(Rustam Khamidullin) §
它无意中按得分从低到高的顺序处理数据库,而本应按相反的顺序进行。
恢复 VACUUM 的回卷失效保护模式下对共享缓冲区池的完全使用(Melanie Plageman)
§
§
普通 VACUUM 被限制为只能使用少量共享缓冲区,以免对其他处理造成太大影响。但在失效保护模式下,我们希望尽快回收事务 ID,因此应当放弃该限制,让清理尽可能快地进行。这一行为在 v18 的重构期间被意外破坏;现将其恢复。
修复并行清理工作进程中的内存泄漏(Baji Shaik) §
并行工作进程发出的进度报告每次泄漏约 1kB,这些浪费会在工作进程的整个生命周期内不断累积。
在 GIN 索引 posting 树清理期间,正确响应查询取消和清理延迟(Paul Kim, Alexander Korotkov) §
高频值的 posting 树可能很大,因此这个被遗漏的检查可能让清理运行很长时间后才注意到中断。
修复在 GiST 和 SP-GiST 仅索引扫描期间索引元组可能被错误解码的问题(Peter Geoghegan) §
该错误可能导致仅索引扫描计划输出损坏的数据。唯一受影响的核心操作符类是 GiST 的 range_ops,并且仅当 range 列不是索引的第一列时它才可能出错。
确保批量扩展后的表的最后一个新块被及时加入其空闲空间映射(Jingtang Zhang) §
一个差一错误导致多块表扩展的最后一个块没有在映射中被标记为空闲。该问题最终会被清理所纠正,但在此期间这些空间不会被使用。
避免在事务中止期间的资源清理中出现可能的重复释放或无限错误恢复循环(Tom Lane) §
在创建目录时容忍同一目录被并发创建(Andrew Dunstan, Tom Lane) §
修复 JIT 编译的元组解构代码,使其能正确处理虚拟生成列(David Rowley) §
通过对任何被依赖的对象获取共享锁来防止创建悬空的对象依赖(Bertrand Drouvot) § §
共享锁会与任何删除被依赖对象的尝试发生冲突,从而消除以前存在的竞态条件。例如,如果一个会话删除某个模式(在它看来该模式是空的),与此同时另一个会话在该模式中创建函数,那么以前两个事务都可能提交,留下一个无效的函数定义。现在,两个事务中必有一个会失败。
修复 SERIALIZABLE 隔离模式冲突检测中的竞态条件(Peter Geoghegan)
§
在检查初始为空的 B 树索引时可能漏检冲突,由于不适当地允许冲突的事务提交,可能导致可串行化失效。
修复 ProcSignalBarrier 代码中的竞态条件(Masahiko Sawada) §
该错误可能导致进程卡住,通常是在报告了“仍在等待 PID 为 nnnn 的后端接受 ProcSignalBarrier” 之后。
修复属于同一锁组的一组进程同时退出时的竞态条件(Vlad Lesin) § §
这些错误可能导致 PANIC 中止,并伴随诸如“闩锁已被占用”之类的消息。在常规并行查询中通常不会出现该问题,因为领导者进程在看到其工作进程完成之前不会退出;但一些扩展会碰到这个问题。
修复对清除表可见性映射中的位的操作进行预写式日志(WAL)记录的问题(Melanie Plageman, Andres Freund) § § §
这类 VM 更改会被 WAL 汇总器遗漏,可能导致不正确的增量备份。我们还未能在需要时记录此类 VM 页面的全页映像,可能使撕裂页写入得不到纠正。这可能在以后引发异常行为,例如仅索引扫描产生错误的结果。
修复备用服务器提升期间逻辑解码中时间线选择的竞态问题(Bertrand Drouvot) § §
在备用服务器上执行的逻辑解码可能因“请求的 WAL 段已被移除”错误而失败。重试一次就会成功,因此并没有永久性问题,但存在可用性风险。
避免在时间线跳转期间暴露 WAL 接收器的完整连接串(Chao Li) §
pg_stat_wal_receiver 视图应当显示脱敏版本的连接串,不包含敏感数据。但在复用现有 WAL 接收器时,它会短暂地显示完整字符串。
使用运行时检查而不仅是断言,来验证逻辑复制期间接收到的元组的列数是否正确(Varik Matevosyan) §
恶意的或有缺陷的发布者可能发送不一致的列数。虽然我们找不到会造成严重不良影响的场景,但额外的谨慎似乎是必要的。
清理构造的复制命令内字符串参数的加引号处理(Tom Lane) §
生成复制命令的各处,对于需要插入到这些命令中的复制槽名称及其他参数的加引号处理不够严谨。这可能导致这些命令中出现意外的语法错误。原则上,精心构造的复制槽名称可能导致 SQL 注入;但这种场景在实践中似乎极不可能发生,因为复制操作只能由高权限用户调用,而且他们没有理由使用来自不可信来源的槽名称。
修复空预备事务的逻辑解码(Masahiko Sawada) §
未产生任何可解码更新的预备事务可能导致向输出插件发送 COMMIT/ROLLBACK PREPARED 而其前面没有 PREPARE。对内置订阅者来说这会破坏复制,其他插件多半也无法接受。
修复备用服务器提升后非日志序列损坏的问题(Fujii Masao) §
以前,如果一个非日志序列在主服务器上创建并被复制到备用服务器,那么在提升备用服务器之后访问该序列可能因“序列中的魔数错误”或相关错误而失败。
修复归档回退之后级联备用服务器重新连接失败的问题(Marco Nenciarini) §
在回退到归档恢复之后,级联备用服务器可能无法重新连接到其上游备用服务器,并出现“请求的起始点 ... 超前于 WAL 刷新位置”错误。
防止在 WAL 重放达到一致的数据库状态之前接受热备连接(Nikhil Sontakke) §
不要尝试在备用服务器上本地清除 pg_database.dathasloginevt(Ayush Tiwari)
§
事件触发器清理曾尝试在备用服务器以及主服务器上执行该操作。这在备用服务器上行不通,而且也没有必要,因为重放主服务器的数据库更改很快就会修复它。
避免在删除过时复制槽时出现竞态条件(Xuneng Zhou) §
如果另一个会话立即复用了被删除槽的共享内存条目,就可能出现不正确的解锁操作和日志消息。
避免在删除临时复制槽时出现竞态条件(Zhijie Hou) §
释放槽的代码在释放槽之后,还会对复制槽的共享内存条目执行一些额外的更新。这是不安全的,因为另一个会话可能立即复用被删除槽的共享内存条目。对于临时槽,跳过这些更新。
修复逻辑复制表同步期间的过期进度报告(Shinya Kato) §
以前,订阅者中的 pg_stat_progress_copy 视图会继续将初始 COPY 操作显示为活动状态,即使数据复制已经完成。该过期条目会一直可见,直到同步赶上发布者为止。
以前,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 对象时发生空指针解引用崩溃(Xing Guo)
§
在 PL/Python 中,处理序列和映射对象时正确检查错误(Richard Guo) §
以前,损坏的对象或未处理的异常可能导致空指针解引用崩溃。
在 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 段时会失败。
在 ecpg 的 GET/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 的 Tab 补全,使其也考虑过程(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 中,修复未能报告 btree 元页面的 allequalimage 标志损坏的问题(Chao Li)
§
在 contrib/amcheck 中,修复验证 GIN 索引时查询生命期内的内存泄漏(Kirill Reshke)
§
在 contrib/amcheck 中,正确处理短头部的 varlena 数据值(Andrey Borodin)
§
这个错误可能导致在验证 btree 索引时做多余的工作,但看起来并没有造成更严重的后果。
在 contrib/btree_gist 中,修复
float4 和 float8 运算符类中对
NaN 的处理(Bill Kim, Tom Lane)
§
比较运算以及 GiST 惩罚和距离函数都没有考虑 NaN,在收到 NaN 时会给出错误的答案。建议在安装此更新之后,如果这些浮点列中有存在 NaN 条目的任何可能性,就重建这些列上的 btree_gist 索引。
在 contrib/btree_gist 中,修复 GiST 索引构建期间对 bit/varbit 条目的排序(Tom Lane)
§
位串类型的值被当作 bytea 来排序,这虽然没有导致任何明显的故障,但由于这两种类型的表示方式不同,会产生低效的索引。建议在安装此更新之后,重建 bit 列上的 btree_gist 索引。
在 contrib/btree_gist 中,修复使用不等于运算符的搜索(Ayush Tiwari)
§
对于变长数据类型,扫描非叶子索引页的代码使用了错误的比较函数,导致错误的结果,还可能导致崩溃。
在 contrib/dblink 和 contrib/postgres_fdw 中,确保用户映射上的 use_scram_passthrough 设置优先于外部服务器上的设置(Matheus Alcantara)
§
§
以前的优先级顺序正好相反,但这与其他外部表选项的行为不一致。
拒绝在 contrib/dblink 的外部数据包装器上设置 use_scram_passthrough(Matheus Alcantara)
§
该选项只在外部服务器和用户映射上才有意义,但 dblink 错误地允许在 FDW 层级上也设置它(然后又将其忽略)。
修复 contrib/hstore_plperl、contrib/jsonb_plperl 和 contrib/jsonb_plpython 中未加防护的递归和循环(Aleksander Alekseev)
§
§
防止在处理深度嵌套的 jsonb 值时发生栈溢出,并允许中断因尝试解引用 Perl 对象引用的循环链而产生的无限循环。
修复 contrib/intarray 中统计信息目录缓存条目未释放的问题(Man Zeng)
§
这一疏忽会导致类似“资源未关闭:缓存 pg_statistic” 的警告。
在 contrib/ltree 中,修复比较中的整数溢出(Ayush Tiwari)
§
包含大约超过 14,653 个标签的 ltree 值会因溢出而得到错误的比较结果。如果 btree 索引中包含这样的值,它很可能已经损坏,应当在安装此更新后重建索引。
在 contrib/pgcrypto 中,避免在使用 OSSLCipher 对象时遇到错误后发生重复释放而崩溃(Yuelin Wang)
§
修复 contrib/pg_prewarm 的 autoprewarm 工作进程中的越界访问(Matheus Alcantara)
§
该代码试图从数组末尾之后的一个位置获取值,存在导致段错误的风险。
修复 contrib/pg_surgery 的 heap_force_kill 和 heap_force_freeze 函数中的数组越界(Michael Paquier)
§
尝试修改偏移号等于 MaxHeapTuplesPerPage 的 TID 时,会在所分配数组的末尾之外多写一个字节,可能使服务器崩溃。
在 contrib/pg_surgery 中,避免元素数超过 64K 的 TID 数组导致无限循环(Andrey Rachitskiy)
§
避免 contrib/refint 的 check_foreign_key() 中出现空指针解引用(Ayush Tiwari)
§
在更新级联的情形下,被引用列的空值会导致崩溃。这是对 CVE-2026-6637 的修复中的一个疏忽,但之前的代码其实也并不正确。
修复 contrib/seg 对带有 ~ 确定性指示符的段的打印(Ewan Young)
§
由于一处笔误,seg_out() 没有打印附加在段的上边界上的 ~ 确定性指示符。更糟的是,如果下边界带有 ~ 而上边界没有指示符,则上边界根本不会被打印,从而错误地把该值变成一个开区间。
修复 contrib/xml2 的 xpath_nodeset() 函数中命名空间节点导致的崩溃(Andrey Chernyy, Michael Paquier)
§
支持使用 OpenSSL 4 构建 PostgreSQL(Daniel Gustafsson) §
将时区数据文件更新到 tzdata 的 2026c 版本(Tom Lane) §
从 2026 年 11 月开始,艾伯塔省(America/Edmonton)将全年使用 UTC-06(实际上就是永久夏令时)。本发布假定从那时起其时区缩写将是 CST。这种情况似乎很可能会改变,但目前还不清楚会使用什么新的缩写。
摩洛哥(Africa/Casablanca)将于 2026-09-20 起永久使用 UTC+00,不再进行夏令时切换。