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

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

文档版本比较

POSTGRESQL · VERSION COMPARE

PostgreSQL 16.3 发布变化

此版本的完整功能、修复与兼容性说明,以及其他版本的关联记录。

此版本的完整变化
此版本的完整变化

包括起始版本之后至目标版本的变化。大版本号表示该分支的首个版本。

完整发布变化

16.3

2024-05-09

导出 JSON ↓
57项变化功能、修复、改进
1个版本按版本分组
1CVE独立漏洞编号

16.3stable支持截止 2028-11-09

安全变化
CVE / 问题严重程度修复版本所选版本状态
CVE-2024-4317

将 pg_stats_ext 和 pg_stats_ext_exprs 条目的可见性限制为表所有者

16.3已记录修复

PostgreSQL 16.3

迁移与兼容性

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

但是,在系统视图 pg_stats_ext 和 pg_stats_ext_exprs 中发现了一个安全漏洞,可能允许已认证的数据库用户查看他们不应看到的数据。如果你的安装受此影响,请按照下面第一个变更日志条目中的步骤进行修复。

此外,如果你从早于 16.2 的版本升级,请参见第 E.14 节。

安全将 pg_stats_ext 和 pg_stats_ext_exprs 条目的可见性限制为表所有者

变更

将 pg_stats_ext 和 pg_stats_ext_exprs 条目的可见性限制为表所有者(Nathan Bossart)§

这些视图未能隐藏涉及访问用户没有权限读取的列的表达式统计信息。视图列如 most_common_vals 可能暴露安全相关的数据。这里的潜在交互尚不完全清楚,因此为了安全起见,使这些视图中的行仅对关联表的所有者可见。

PostgreSQL 项目感谢 Lukas Fittl 报告此问题。(CVE-2024-4317)

仅凭此修复本身只会修复新初始化的数据库集簇中的行为。如需在现有集簇中应用此更改,需要执行以下步骤:

  1. 在 PostgreSQL 安装的 share 目录(通常位于类似 /usr/share/postgresql/ 的位置)中找到 SQL 脚本 fix-CVE-2024-4317.sql。确保使用适合你的 PostgreSQL 主版本的脚本。如果未看到此文件,则说明你的版本不受影响(只有 v14–v16 受影响),或者你的小版本太旧,尚未包含此修复。

  2. 在集簇的每个数据库中,以超级用户身份运行 fix-CVE-2024-4317.sql 脚本。在 psql 中,命令如下:

    \i /usr/share/postgresql/fix-CVE-2024-4317.sql
    

    (根据需要调整文件路径)。任何错误可能表明你使用了错误版本的脚本。多次运行该脚本不会有害。

  3. 不要忘记包含 template0 和 template1 数据库,否则以后创建的数据库仍然存在该漏洞。要修复 template0,你需要临时允许它接受连接。执行:

    ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
    

    然后在修复 template0 后,执行以下命令撤销:

    ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
    
关联记录 (2)
问题修复修复从多个 VALUES 行 INSERT 到目标列为数组或复合类型上的域时的问题

变更

修复从多个 VALUES 行 INSERT 到目标列为数组或复合类型上的域时的问题(Tom Lane)§

这类情况会以数据类型不匹配的意外错误失败,或者插入可能导致奇怪结果的意外强制转换。

关联记录 (4)
改进要求对带有 DO NOTHING 子句的 MERGE 的目标表具有 SELECT 权限

变更

要求对带有 DO NOTHING 子句的 MERGE 的目标表具有 SELECT 权限(Álvaro Herrera)§

在所有实际情况中都需要 SELECT 权限,但即使查询不读取目标表的任何列也要求该权限。这避免了 MERGE 完全不需要任何权限的边缘情况,即使它是一个不做任何事情的命令,这也是不可取的。

关联记录 (1)
问题修复修复 MERGE 中对自修改元组的处理

变更

修复 MERGE 中对自修改元组的处理(Dean Rasheed)§

如果目标行与多个源行连接,按照 SQL 标准的要求抛出错误。(之前的代码在涉及并发更新时可能会静默忽略此条件。)此外,如果目标行已被当前事务中的后续命令更新(由于 BEFORE 触发器或查询中使用的易变函数),则抛出一个不会产生误导的错误。

关联记录 (1)
问题修复修复当表按布尔列分区且查询含有布尔 IS NOT 子句时,对 NULL 分区的不正确修剪

变更

修复当表按布尔列分区且查询含有布尔 IS NOT 子句时,对 NULL 分区的不正确修剪(David Rowley)§

NULL 值满足诸如 boolcol IS NOT FALSE 之类的子句,因此修剪掉包含 NULL 的分区会产生不正确的结果。

关联记录 (4)
改进使 ALTER FOREIGN TABLE SET SCHEMA 将所拥有的序列移到新模式中

变更

使 ALTER FOREIGN TABLE SET SCHEMA 将所拥有的序列移到新模式中(Tom Lane)§

将常规表移到新模式会导致该表所拥有的序列也被移到该模式中(连同索引和约束)。但对于外部表,这一点被遗漏了。

关联记录 (4)
改进使 ALTER TABLE ... ADD COLUMN 创建的标识/serial 序列与其所属表具有相同的持久性

变更

使 ALTER TABLE ... ADD COLUMN 创建的标识/serial 序列与其所属表具有相同的持久性(Peter Eisentraut)§

CREATE UNLOGGED TABLE 会使所拥有的序列也成为不记录 WAL 的。ALTER TABLE 遗漏了这一考虑,导致添加的标识列会有一个日志序列,这看起来毫无意义。

关联记录 (1)
改进改进当存在依赖的函数或发布时 ALTER TABLE ... ALTER COLUMN TYPE 的错误消息

变更

改进当存在依赖的函数或发布时 ALTER TABLE ... ALTER COLUMN TYPE 的错误消息(Tom Lane)§ §

关联记录 (2)
改进在 CREATE DATABASE 中,以大小写不敏感的方式识别策略关键字,以与其他选项保持一致

变更

在 CREATE DATABASE 中,以大小写不敏感的方式识别策略关键字,以与其他选项保持一致(Tomas Vondra)§

关联记录 (1)
问题修复修复 EXPLAIN 对位图堆扫描访问的堆页面的计数

变更

修复 EXPLAIN 对位图堆扫描访问的堆页面的计数(Melanie Plageman)§

之前,不包含可见元组的堆页面不被计数;但计算位图索引扫描返回的所有页面似乎更一致。

关联记录 (4)
问题修复修复 EXPLAIN 对 MERGE 中子计划的输出

变更

修复 EXPLAIN 对 MERGE 中子计划的输出(Dean Rasheed)§

EXPLAIN 有时无法正确显示引用计划树其他部分中变量的子计划参数。

关联记录 (1)
问题修复避免在移除孤立临时表时出现死锁

变更

避免在移除孤立临时表时出现死锁(Mikhail Zhilin)§

如果创建临时表的会话在未移除该表的情况下崩溃,autovacuum 最终会尝试移除该孤立的表。然而,被分配了相同临时命名空间的新传入会话也会尝试这样做。如果临时表有依赖项(如拥有的序列),这两个清理尝试之间可能会产生死锁。

关联记录 (4)
问题修复修复带有 DISABLE_PAGE_SKIPPING 选项的 VACUUM 中可见性映射状态的更新

变更

修复带有 DISABLE_PAGE_SKIPPING 选项的 VACUUM 中可见性映射状态的更新(Heikki Linnakangas)§

由于一个疏忽,此模式导致所有堆页面被标记为脏页,产生过多的 I/O。此外,不正确设置的可见性映射位不会被清除。

改进避免在检查每个关系的冻结 XID 值时出现竞态条件

变更

避免在检查每个关系的冻结 XID 值时出现竞态条件(Noah Misch)§

VACUUM 从每个关系的值计算每个数据库的冻结 XID 值时,可能会被另一个 VACUUM 对这些值的并发更新所混淆。

关联记录 (4)
问题修复修复并行 vacuum 的缓冲区使用报告

变更

修复并行 vacuum 的缓冲区使用报告(Anthonin Bonnefoy)§

并行工作进程执行的缓冲区访问没有被计入 VERBOSE 模式下报告的统计信息中。

关联记录 (1)
问题修复确保从等价类生成的连接条件在正确的计划层级应用

变更

确保从等价类生成的连接条件在正确的计划层级应用(Tom Lane)§

在 PostgreSQL 16 之前的版本中,生成的条件可能在外连接下方被评估,而实际上应在外连接上方(之后)评估,导致不正确的查询结果。所有版本在考虑连接到具有部分 SELECT 分支中连接列为常量输出的 UNION ALL 树时都有类似的隐患。

关联记录 (4)
问题修复修复在规划带有 ORDER BY 或 DISTINCT 选项的聚合函数时出现的 “could not find pathkey item to sort” 错误

变更

修复在规划带有 ORDER BY 或 DISTINCT 选项的聚合函数时出现的 “could not find pathkey item to sort” 错误(David Rowley)§

这与 16.1 中应用的修复类似,但它解决的是并行计划中的问题。

改进防止某些窗口函数的可能不正确的优化

变更

防止某些窗口函数的可能不正确的优化(David Rowley)§

禁用对带有非常量参数的 ntile() 和 count() 的“运行条件”优化。这避免了子查询可能导致的异常行为,通常会产生诸如 “WindowFunc not found in subplan target lists” 之类的错误。

关联记录 (1)
改进避免在非移动窗口帧中不必要地使用移动聚合模式

变更

避免在非移动窗口帧中不必要地使用移动聚合模式(Vallimaharajan G)§

当普通聚合作为窗口函数使用,且窗口帧起始指定为 UNBOUNDED PRECEDING 时,帧的头部无法移动,因此我们不需要使用特殊的(且更昂贵的)移动聚合模式。这个优化一直是预期的,但由于编码错误从未被触发。

关联记录 (4)
改进避免在 GEQO 下规划按分区连接时使用已释放的数据

变更

避免在 GEQO 下规划按分区连接时使用已释放的数据(Tom Lane)§

这通常会以崩溃或意外的错误消息告终。

关联记录 (4)
改进避免在 Memoize 中释放仍在使用的数据

变更

避免在 Memoize 中释放仍在使用的数据(Tender Wang,Andrei Lepikhov)§

在生产构建中,此错误通常不会造成任何问题,因为被释放的数据在被使用之前极有可能不会被覆盖。

关联记录 (2)
问题修复修复 “requested statistics kind X is not yet built” 错误消息中不正确报告的统计类型代码

变更

修复 “requested statistics kind X is not yet built” 错误消息中不正确报告的统计类型代码(David Rowley)§

关联记录 (4)
改进对“catcache list”对象使用 hash 表代替线性搜索

变更

对“catcache list”对象使用 hash 表代替线性搜索(Tom Lane)§

此更改解决了在具有数千个角色的安装中某些操作报告的性能问题。

改进更加小心地处理 FROM 中返回 RECORD 的函数

变更

更加小心地处理 FROM 中返回 RECORD 的函数(Tom Lane)§ §

此类函数调用的输出列必须由指定列名和数据类型的 AS 子句来定义。如果实际的函数输出值不匹配,应在运行时抛出错误。然而,某些代码路径会过早检查实际值,如果不符合预期可能会发出奇怪的错误或触发断言失败。

关联记录 (4)
问题修复修复 SQL 语言过程的返回行类型混淆

变更

修复 SQL 语言过程的返回行类型混淆(Tom Lane)§

以 SQL 语言实现的返回单个复合类型列的过程会导致断言失败或核心转储。

关联记录 (4)
改进为一些递归函数增加保护性栈深度检查

变更

为一些递归函数增加保护性栈深度检查(Egor Chindyaskin)§

关联记录 (4)
问题修复修复 date_bin() 中的舍入错误和溢出隐患

变更

修复 date_bin() 中的舍入错误和溢出隐患(Moaaz Assali)§

在源时间戳在原点时间戳之前且两者差值恰好是步长的整数倍的情况下,代码错误地仍然减去了步长。此外,检测了一些会产生不正确结果的整数溢出情况。

关联记录 (2)
改进检测在 timestamp 上加减 interval 时的整数溢出

变更

检测在 timestamp 上加减 interval 时的整数溢出(Joseph Koshakow)§

某些应该导致超出范围错误的情况反而产生了不正确的结果。

关联记录 (4)
改进避免 pg_get_expr() 中的竞态条件

变更

避免 pg_get_expr() 中的竞态条件(Tom Lane)§

如果参数引用的关系被并发删除,函数的意图是返回 NULL,但有时会失败。

关联记录 (4)
问题修复修复 XID 状态函数中对旧事务 ID 的检测

变更

修复 XID 状态函数中对旧事务 ID 的检测(Karina Litskevich)§

距今超过 231 个事务的事务 ID 可能被误识别为近期的,导致 pg_xact_status() 或 txid_status() 出现异常行为。

关联记录 (4)
改进确保表的空闲空间映射不会返回超出表末尾的页面

变更

确保表的空闲空间映射不会返回超出表末尾的页面(Ronan Dunklau)§

由于空闲空间映射不写入 WAL 日志,在涉及操作系统崩溃、副本提升或 PITR 恢复的边缘情况下这是可能的。结果将会是 “could not read block” 错误。

关联记录 (2)
问题修复修复在 WaitEventSetWait 中等待时抛出错误导致的文件描述符泄漏

变更

修复在 WaitEventSetWait 中等待时抛出错误导致的文件描述符泄漏(Etsuro Fujita)§

关联记录 (4)
问题修复避免在 FDW 实现了异步追加但未为 Append 计划节点配置任何等待条件时损坏异常栈

变更

避免在 FDW 实现了异步追加但未为 Append 计划节点配置任何等待条件时损坏异常栈(Alexander Pyhalov)§

关联记录 (2)
改进如果在重建索引期间访问索引,则抛出错误

变更

如果在重建索引期间访问索引,则抛出错误(Tom Lane)§

之前这只是一个断言检查,现在将其提升为常规运行时错误。当重建索引的用户定义索引表达式尝试访问其自身的表时,这将提供一个更有针对性的错误消息。

关联记录 (4)
改进确保对 name 列的仅索引扫描返回完整填充的值

变更

确保对 name 列的仅索引扫描返回完整填充的值(David Rowley)§

物理存储在索引中的值是被截断的,之前会将指向该值的指针返回给调用者。这在 valgrind 下测试时引发了告警。理论上可能导致崩溃,但尚未收到相关报告。

关联记录 (4)
问题修复修复在使复制槽失效时可能导致报告不正确冲突原因的竞争条件

变更

修复在使复制槽失效时可能导致报告不正确冲突原因的竞争条件(Bertrand Drouvot)§

问题修复修复逻辑复制中判断是否需要表同步操作时的竞态条件

变更

修复逻辑复制中判断是否需要表同步操作时的竞态条件(Vignesh C)§

在订阅者确定哪些表需要同步时到达的失效事件会被遗忘,因此新需要同步的表可能不会被及时处理。

关联记录 (1)
问题修复修复大于 4GB 的 DSM 分配时的崩溃

变更

修复大于 4GB 的 DSM 分配时的崩溃(Heikki Linnakangas)§

关联记录 (4)
改进如果新服务器会话的客户端套接字无法被设置为非阻塞模式则断开连接

变更

如果新服务器会话的客户端套接字无法被设置为非阻塞模式则断开连接(Heikki Linnakangas)§

曾经在理论上可以使用阻塞模式的套接字来运行;但这在很长时间以来就已经不能完全工作了,所以在连接开始时失败而不是稍后出现异常行为。

关联记录 (4)
问题修复修复 OpenSSL 3.0.0 及更高版本中不充分的错误报告

变更

修复 OpenSSL 3.0.0 及更高版本中不充分的错误报告(Heikki Linnakangas,Tom Lane)§

通过 OpenSSL 传递的系统报告错误是用数字错误代码而非可读内容报告的。

关联记录 (4)
问题修复修复 Windows 上 getaddrinfo() 错误报告的线程安全性

变更

修复 Windows 上 getaddrinfo() 错误报告的线程安全性(Thomas Munro)§

多线程的 libpq 客户端程序在网络查找失败后可能获得不正确或损坏的错误消息。

改进避免在 libpq 和 ecpglib 中并发调用 bindtextdomain()

变更

避免在 libpq 和 ecpglib 中并发调用 bindtextdomain()(Tom Lane)§ §

虽然 GNU gettext 的实现似乎可以处理并发调用,但 Windows 上可用的版本不行。

关联记录 (4)
问题修复修复 ecpg 的预处理器在程序尝试重新定义在预处理器命令行上定义的宏时崩溃的问题

变更

修复 ecpg 的预处理器在程序尝试重新定义在预处理器命令行上定义的宏时崩溃的问题(Tom Lane)§ § §

关联记录 (4)
改进在 ecpg 中,避免发出错误的 “unsupported feature will be passed to server” 警告

变更

在 ecpg 中,避免发出错误的 “unsupported feature will be passed to server” 警告(Tom Lane)§

关联记录 (4)
改进确保 ecpg 的 intoasc() 函数的字符串结果正确以零结尾

变更

确保 ecpg 的 intoasc() 函数的字符串结果正确以零结尾(Oleg Tselebrovskiy)§

关联记录 (4)
改进在 initdb 的 -c 选项中,大小写不敏感地匹配参数名

变更

在 initdb 的 -c 选项中,大小写不敏感地匹配参数名(Tom Lane)§

服务器对参数名的处理是大小写不敏感的,因此此代码也应如此。这避免了在生成的 postgresql.conf 文件中放入冗余条目。

问题修复在 psql 中,避免在查询被取消后泄漏查询结果

变更

在 psql 中,避免在查询被取消后泄漏查询结果(Tom Lane)§

这仅在取消由 \; 分隔符组成的查询字符串中的非最后一个查询时发生。

关联记录 (1)
问题修复修复 pg_dumpall,使角色注释(如果存在)无论 --no-role-passwords 的设置如何都会被导出

变更

修复 pg_dumpall,使角色注释(如果存在)无论 --no-role-passwords 的设置如何都会被导出(Daniel Gustafsson,Álvaro Herrera)§

关联记录 (4)
改进在 pg_basebackup、 pg_checksums 和 pg_rewind 中跳过名为 .DS_Store 的文件

变更

在 pg_basebackup、 pg_checksums 和 pg_rewind 中跳过名为 .DS_Store 的文件(Daniel Gustafsson)§

这避免了在 macOS 上的问题,因为 Finder 可能会创建此类文件。

关联记录 (1)
问题修复修复 PL/pgSQL 对表达式后跟单行注释(-- 风格注释)的解析

变更

修复 PL/pgSQL 对表达式后跟单行注释(-- 风格注释)的解析(Erik Wienhold,Tom Lane)§

此错误导致当此类注释跟在 PL/pgSQL CASE 语句中的 WHEN 表达式之后时会出现解析错误。

关联记录 (4)
改进在 contrib/amcheck 中,不要由于短头部与长头部值的差异而报告虚假的不匹配失败

变更

在 contrib/amcheck 中,不要由于短头部与长头部值的差异而报告虚假的不匹配失败(Andrey Borodin,Michael Zhilin)§ §

堆元组或索引元组中的可变长度数据项可以有短头部或长头部,这取决于其创建时应用的压缩参数。将这些情况视为等价的,而不是在存在差异时报告错误。

关联记录 (4)
问题修复修复 BRIN 输出函数中的错误

变更

修复 BRIN 输出函数中的错误(Tomas Vondra)§ §

这些输出函数仅用于在 contrib/pageinspect 中显示索引条目,因此这些错误在实际中影响有限。

关联记录 (2)
改进在 contrib/postgres_fdw 中,避免发出按常量排序的请求

变更

在 contrib/postgres_fdw 中,避免发出按常量排序的请求(David Rowley)§

这可能发生在涉及 UNION ALL 和常量输出子查询的情况下。按常量排序当然是无用的,但还有被远程服务器误解的风险,导致 “ORDER BY position N is not in select list” 错误。

关联记录 (4)
改进使 contrib/postgres_fdw 将远程会话的时区设置为 GMT 而不是 UTC

变更

使 contrib/postgres_fdw 将远程会话的时区设置为 GMT 而不是 UTC(Tom Lane)§

在实际用途中这应该产生相同的结果。然而,GMT 由服务器中的硬编码代码识别,而 UTC 则从时区数据库中查找。因此在远程服务器的时区数据库缺少条目的不太可能的情况下,旧代码可能失败。

关联记录 (4)
改进在 contrib/xml2 中,避免使用在较新版本的 libxml2 中已弃用的库函数

变更

在 contrib/xml2 中,避免使用在较新版本的 libxml2 中已弃用的库函数(Dmitry Koval)§

关联记录 (4)
问题修复修复与 LLVM 18 的不兼容性

变更

修复与 LLVM 18 的不兼容性(Thomas Munro,Dmitry Dolgov)§

关联记录 (4)
改进允许 make check 在 musl C 库下工作

变更

允许 make check 在 musl C 库下工作(Thomas Munro,Bruce Momjian,Tom Lane)§

关联记录 (4)
如何生成比较结果?

比较依据起始版本之后至目标版本的 PostgreSQL 发布说明。经核实的回补重复项会谨慎合并,保留每条原始说明;相关提交可能涉及独立变化,仍作为不同记录保留。

发布快照: 2026-09-26 · 安全快照: 2026-09-26

内容来自 PostgreSQL 发布说明。交互方式参考 pgversions.com 与 pgversionreport.