↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档版本对比

POSTGRESQL · VERSION COMPARE

PostgreSQL 12.21 的版本变更

本次发布的完整功能、修复与兼容性说明,以及它们在其他版本中的关联记录。

查看该版本全部变更
查看该版本全部变更

从起始版本之后,看到目标版本为止。大版本名称代表该系列首个正式版本。

收录 PostgreSQL 9.0 起的 17 个大版本、352 份发布说明;数据更新于 2026-09-26。

本次发布的全部变更

12.21

2024-11-14

导出 JSON
34项变更功能、修复与改进
1次版本发布按发行版本归档
4个 CVE本版说明中提及的漏洞编号

12.21 历史版本维护截止 2024-11-21

本版提及的安全记录 4 个 CVE
本版发布说明提及的 CVE,可能包含已有漏洞的后续修复
CVE / 问题严重程度修复版本
CVE-2024-10979

防止受信任的 PL/Perl 代码更改环境变量

8.812.21
CVE-2024-10978

修复 SET SESSION AUTHORIZATION 与 SET ROLE 之间意外的交互

4.212.21
CVE-2024-10976

确保当 RLS 应用于非顶级表引用时,缓存的执行计划被标记为依赖于调用角色

4.212.21
CVE-2024-10977

使 libpq 丢弃在 SSL 或 GSS 协议协商期间收到的错误消息

3.112.21

PostgreSQL 12.21

升级与兼容性说明

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

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

安全相关确保当 RLS 应用于非顶级表引用时,缓存的执行计划被标记为依赖于调用角色

变更

确保当 RLS 应用于非顶级表引用时,缓存的执行计划被标记为依赖于调用角色(Nathan Bossart)§

如果查询中的 CTE、子查询、子链接、安全调用者视图或强制类型转换投影引用了具有行级安全策略的表,我们忽略了将结果执行计划标记为可能依赖于执行它的角色。这可能导致同一会话中后续的查询执行使用错误的执行计划,然后返回或隐藏本应被隐藏或返回的行。

PostgreSQL 项目感谢 Wolfgang Walther 报告此问题。(CVE-2024-10976)

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

安全相关使 libpq 丢弃在 SSL 或 GSS 协议协商期间收到的错误消息

变更

使 libpq 丢弃在 SSL 或 GSS 协议协商期间收到的错误消息(Jacob Champion)§

在加密协商完成之前收到的错误消息可能是由中间人注入的,而不是真正的服务器输出。报告该消息会带来各种安全隐患;例如,该消息可能伪造查询结果,粗心的用户可能会误以为是正确的输出。最好的方案似乎是丢弃这类数据,仅依赖 libpq 自身对连接失败的报告。

PostgreSQL 项目感谢 Jacob Champion 报告此问题。(CVE-2024-10977)

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

安全相关修复 SET SESSION AUTHORIZATION 与 SET ROLE 之间意外的交互

变更

修复 SET SESSION AUTHORIZATION 与 SET ROLE 之间意外的交互(Tom Lane)§ §

SQL 标准要求 SET SESSION AUTHORIZATION 具有执行 SET ROLE NONE 的副作用。我们对此的实现有缺陷,导致两个设置之间产生了超出预期的交互。值得注意的是,回滚一个执行了 SET SESSION AUTHORIZATION 的事务会将 ROLE 恢复为 NONE,即使之前并非如此,因此有效用户 ID 现在可能与事务之前不同。在函数 SET 子句中临时设置 session_authorization 也有类似的效果。一个相关的错误是,如果并行工作进程检查 current_setting('role'),它会看到 none,即使它应该看到其他值。

PostgreSQL 项目感谢 Tom Lane 报告此问题。(CVE-2024-10978)

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

安全相关防止受信任的 PL/Perl 代码更改环境变量

变更

防止受信任的 PL/Perl 代码更改环境变量(Andrew Dunstan,Noah Misch)§ § § §

操纵进程环境变量(如 PATH)的能力会给攻击者提供执行任意代码的机会。因此,“受信任的” PL 不应提供这样的能力。为修复 plperl,将 %ENV 替换为一个绑定的 hash,该 hash 会拒绝任何修改尝试并发出警告。不受信任的 plperlu 保留更改环境的能力。

PostgreSQL 项目感谢 Coby Abrams 报告此问题。(CVE-2024-10979)

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进如果要附加的表具有引用该分区表的外键,则禁止 ALTER TABLE ATTACH PARTITION

变更

如果要附加的表具有引用该分区表的外键,则禁止 ALTER TABLE ATTACH PARTITION(Álvaro Herrera)§ §

这种配置不被支持,其他创建方式已经会失败。

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进当查询中键列的排序规则与分区键的排序规则不匹配时,不使用分区级连接或分组

变更

当查询中键列的排序规则与分区键的排序规则不匹配时,不使用分区级连接或分组(Jian He,Webbo Han)§ §

这样的执行计划可能产生不正确的结果。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进允许取消大型 hash 索引构建第二阶段的操作

变更

允许取消大型 hash 索引构建第二阶段的操作(Pavel Borisov)§

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复 COPY (query) TO ... 中的断言失败或令人困惑的错误消息,当 query 被 DO INSTEAD NOTIFY 规则重写时

变更

修复 COPY (query) TO ... 中的断言失败或令人困惑的错误消息,当 query 被 DO INSTEAD NOTIFY 规则重写时(Tender Wang,Tom Lane)§

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复并行哈希连接中倾斜数据的检测

变更

修复并行哈希连接中倾斜数据的检测(Thomas Munro)§

在对哈希连接的内侧进行重新分区(因为某个分区累积了过多元组)之后,我们会检查该分区的所有元组是否都进入了同一个子分区,这表明它们都具有相同的 hash 值,进一步重新分区无法改善情况。此检查在某些情况下出现故障,允许重复进行无效的重新分区,最终导致资源耗尽错误。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复提交可串行化事务时的竞态条件

变更

修复提交可串行化事务时的竞态条件(Heikki Linnakangas)§

对最近提交的事务的错误处理可能导致断言失败或 “could not access status of transaction” 错误。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复 COMMIT PREPARED 中导致产生孤立 2PC 文件的竞态条件

变更

修复 COMMIT PREPARED 中导致产生孤立 2PC 文件的竞态条件(wuchengwen)§

并发的 PREPARE TRANSACTION 可能导致 COMMIT PREPARED 不删除已完成事务的磁盘上两阶段状态文件。虽然没有立即的不良影响,但随后的崩溃恢复可能因 “could not access status of transaction” 而失败,需要手动删除孤立文件才能恢复服务。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进避免在 VACUUM FULL 期间跳过无效 toast 索引后发生无效内存访问

变更

避免在 VACUUM FULL 期间跳过无效 toast 索引后发生无效内存访问(Tender Wang)§

在此代码路径中,跟踪尚待重建索引的列表未被正确更新,可能导致后续的断言失败或崩溃。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复“就地”目录更新可能丢失的问题

变更

修复“就地”目录更新可能丢失的问题(Noah Misch)§ § § § § § §

普通行更新会写入行的新版本以保留事务的回滚能力。然而,某些系统目录更新是有意设计为非事务性的,并通过对行的就地更新来完成。这些补丁修复了可能导致就地更新效果丢失的竞态条件。例如,可能会忘记已将 pg_class.relhasindex 设置为 true,从而阻止新索引的更新,进而导致索引损坏。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进在恢复结束时重置目录缓存

变更

在恢复结束时重置目录缓存(Noah Misch)§

这可以防止由于使用目录缓存中的陈旧数据而导致就地目录更新丢失的场景。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进避免在持有中断抑制时使用并行查询

变更

避免在持有中断抑制时使用并行查询(Francesco Degrassi,Noah Misch,Tom Lane)§ §

这种情况在正常情况下不会发生,但可以通过测试场景达到,例如使用 SQL 语言函数作为 B-树支持函数(这对于生产使用来说太慢了)。如果确实发生,将导致无限期等待。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进防止在过度深层嵌套的 XML 输入中 libxml2 的栈溢出(Tom Lane,致谢 Nick Wellnhofer)

变更

防止在过度深层嵌套的 XML 输入中 libxml2 的栈溢出(Tom Lane,致谢 Nick Wellnhofer)§

使用 xmlXPathCtxtCompile() 而非 xmlXPathCompile(),因为后者在 2.13.4 之前的 libxml2 版本中未能保护自身免受递归到栈溢出的影响。

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复 EXPLAIN 中的 “failed to find plan for subquery/CTE” 错误

变更

修复 EXPLAIN 中的 “failed to find plan for subquery/CTE” 错误(Richard Guo,Tom Lane)§

当试图打印子查询的 RECORD 类型输出的字段引用,而该子查询已从执行计划中完全优化掉时(至少在具有常量为假的 WHERE 条件时可能发生),就会出现这种情况。执行计划中不再有任何内容可以标识原始字段名,因此回退到对第 N 个记录列打印 fN。(如果记录输出来自 ROW() 构造器,这实际上也是正确的做法。)

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进在更改生成列的类型时,禁止使用 USING 子句

变更

在更改生成列的类型时,禁止使用 USING 子句(Peter Eisentraut)§

生成列已经有一个指定列内容的表达式,因此包含 USING 没有意义。

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进在 pg_cursors 视图中忽略尚未定义的 Portal

变更

在 pg_cursors 视图中忽略尚未定义的 Portal(Tom Lane)§

用户定义的检查该视图的代码可能在新游标正在设置时被调用,如果发生这种情况,将导致空指针解引用。通过将该视图定义为排除未完全设置的游标来避免此问题。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进减少逻辑解码的内存消耗

变更

减少逻辑解码的内存消耗(Masahiko Sawada)§

使用较小的默认块大小来存储逻辑复制期间接收的元组数据。这减少了内存浪费,据报告在处理长时间运行的事务时内存浪费会很严重,甚至导致内存不足错误。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进重新禁用无状态(TLSv1.2)会话票证的发送

变更

重新禁用无状态(TLSv1.2)会话票证的发送(Daniel Gustafsson)§

之前为防止发送有状态(TLSv1.3)会话票证所做的更改,意外地重新启用了无状态会话票证的发送。因此,虽然我们打算防止客户端认为支持 TLS 会话恢复,但某些客户端仍然这样认为了。

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进避免在删除具有大量 ACL(权限)条目的数据库时出现 “wrong tuple length” 错误

变更

避免在删除具有大量 ACL(权限)条目的数据库时出现 “wrong tuple length” 错误(Ayush Tiwari)§ §

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进允许在并行工作进程中调整 session_authorization 和 role 设置

变更

允许在并行工作进程中调整 session_authorization 和 role 设置(Tom Lane)§

我们的代码打算允许可修改的服务器设置通过函数 SET 子句来设置,但在并行工作进程中不允许其他方式。这两个设置的 SET 子句却失败了。

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复当 CALL 位于 PL/pgSQL 的 EXCEPTION 块中时,从 CALL 语句参数列表中调用的稳定函数的行为

变更

修复当 CALL 位于 PL/pgSQL 的 EXCEPTION 块中时,从 CALL 语句参数列表中调用的稳定函数的行为(Tom Lane)§

与我们之前季度发布中的类似修复一样,这种情况允许此类函数被传递错误的快照,导致它们看到自外部事务开始以来修改的行的过时值。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进以与其他整数值选项相同的方式解析 libpq 的 keepalives 连接选项

变更

以与其他整数值选项相同的方式解析 libpq 的 keepalives 连接选项(Yuto Sasaki)§

此处使用的代码拒绝选项值中的尾部空白,与其他情况不同。这在 ecpg 的使用中被证明是有问题的。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复 ecpglib 中解析不正确日期时间输入时的越界读取

变更

修复 ecpglib 中解析不正确日期时间输入时的越界读取(Bruce Momjian,Pavel Nekrasov)§

有可能试图读取常量数组起始位置之前的位置。不过实际影响似乎很小。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进在 pg_rewind 的调试输出中包含源时间线历史

变更

在 pg_rewind 的调试输出中包含源时间线历史(Heikki Linnakangas)§

这本来就是设计意图,但由于编码错误,源历史总是打印为空。

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进避免尝试在 vacuumdb 和并行 reindexdb 中重新索引临时表和索引

变更

避免尝试在 vacuumdb 和并行 reindexdb 中重新索引临时表和索引(VaibhaveS,Michael Paquier,Fujii Masao,Nathan Bossart)§ §

重新索引其他会话的临时表是不可能的,但在某些代码路径中缺少跳过它们的检查,导致了不必要的失败。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进允许在 contrib/pageinspect 和 contrib/pgstattuple 的相关函数中检查序列关系

变更

允许在 contrib/pageinspect 和 contrib/pgstattuple 的相关函数中检查序列关系(Nathan Bossart,Ayush Vatsa)§ §

过去这是允许的,但在引入表的非默认访问方法时被破坏了。

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复 ARM64 平台上不正确的 LLVM 生成代码

变更

修复 ARM64 平台上不正确的 LLVM 生成代码(Thomas Munro,Anthonin Bonnefoy)§

在 ARM 平台上使用 JIT 编译时,生成的代码无法支持超过 32 位的重定位距离,使得在大内存系统上不巧的代码放置可能导致服务器崩溃。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复一些假设进程启动时间(表示为 time_t)能够放入 long 值的地方

变更

修复一些假设进程启动时间(表示为 time_t)能够放入 long 值的地方(Max Johnson,Nathan Bossart)§

在 long 为 32 位的平台上(尤其是 Windows),此代码会在 2038 年之后失败。大多数失败似乎仅影响外观,但值得注意的是,pg_ctl start 会挂起。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进防止在构建 PostgreSQL RPM 包时出现 “nothing provides perl(PostgreSQL::Test::Utils)” 错误

变更

防止在构建 PostgreSQL RPM 包时出现 “nothing provides perl(PostgreSQL::Test::Utils)” 错误(Noah Misch)§

关联记录(2)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

BUG 修复修复在 Windows 上使用 Strawberry Perl 构建的问题

变更

修复在 Windows 上使用 Strawberry Perl 构建的问题(Andrew Dunstan)§

关联记录(4)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

其他改进将时区数据文件更新为 tzdata 2024b 版本

变更

将时区数据文件更新为 tzdata 2024b 版本(Tom Lane)§ §

此 tzdata 版本将旧的 System-V 兼容性区域名称更改为与对应地理区域重复;例如 PST8PDT 现在是 America/Los_Angeles 的别名。主要可见后果是,对于标准化时区引入之前的时间戳,该区域被认为代表命名位置的本地平均太阳时。例如,在 PST8PDT 中,timestamptz 输入如 1801-01-01 00:00 之前会被渲染为 1801-01-01 00:00:00-08,但现在会被渲染为 1801-01-01 00:00:00-07:52:58。

另外,包含墨西哥、蒙古和葡萄牙的历史修正。值得注意的是,Asia/Choibalsan 现在是 Asia/Ulaanbaatar 的别名而非独立区域,主要是因为这些区域之间的差异被发现是基于不可靠的数据。

关联记录(5)

“同一变更”有完整对应证据;“相关提交”可能包含多个独立事项、部分回补或后续调整,各版本说明分别保留。

这份对比如何生成?

对比以 PostgreSQL 发行说明为依据,汇总起始版本之后、目标版本及之前的变更,支持同一大版本内的小版本更新,以及跨大版本升级。跨大版本时,旧分支的维护记录只纳入到下一大版本首次发布之日,所有记录均不晚于目标版本的发布日期。大版本名称(如 18)指首个正式版本(18.0);测试版与开发快照会单独标注。

条目正文来自本站中文手册,版本清单、条目覆盖与提交依据逐一核对上游英文原文。每条变更保留完整说明与原文链接;分类用于辅助浏览,具体影响、适用条件与升级操作请阅读条目正文和各版本的升级说明。

同一修复可能回补到多个版本分支。对比会保守合并可确认相同的条目,并保留各分支完整说明;已知由起始版本包含的修复会排除。一条说明包含多个独立修复时,只有全部已包含才排除。大版本新功能不因与旧版补丁存在提交关联而合并,不能确认相同的条目继续保留。这是发行说明的累计差异,不能覆盖二进制程序之间的每一处代码变化。

CVE 独立依据 PostgreSQL 官方安全公告与漏洞记录计算:起始版本受影响、目标版本已修复或不受影响的漏洞才计入,按编号去重。目标版本仍受影响的漏洞另行提示;安全变更条数与 CVE 数量分别统计。

交互参考 pgversions.com 与 pgversionreport,内容来自 PostgreSQL 发行说明。更多历史资料见发行说明归档。