E.13. 发布版本 16.3 #
发布日期:. 2024-05-09
本次发布包含来自 16.2 的多项修复。有关 16 主版本新特性的说明,请参见第 E.16 节。
E.13.1. 迁移到版本 16.3 #
对于运行 16.X 的用户,不需要执行导出/恢复。
但是,在系统视图 pg_stats_ext
和 pg_stats_ext_exprs 中发现了一个安全漏洞,可能允许已认证的数据库用户查看他们不应看到的数据。如果你的安装受此影响,请按照下面第一个变更日志条目中的步骤进行修复。
此外,如果你从早于 16.2 的版本升级,请参见第 E.14 节。
E.13.2. 变更 #
将
pg_stats_ext和pg_stats_ext_exprs条目的可见性限制为表所有者(Nathan Bossart)§这些视图未能隐藏涉及访问用户没有权限读取的列的表达式统计信息。视图列如
most_common_vals可能暴露安全相关的数据。这里的潜在交互尚不完全清楚,因此为了安全起见,使这些视图中的行仅对关联表的所有者可见。PostgreSQL 项目感谢 Lukas Fittl 报告此问题。(CVE-2024-4317)
仅凭此修复本身只会修复新初始化的数据库集簇中的行为。如需在现有集簇中应用此更改,需要执行以下步骤:
在 PostgreSQL 安装的
share目录(通常位于类似/usr/share/postgresql/的位置)中找到 SQL 脚本fix-CVE-2024-4317.sql。确保使用适合你的 PostgreSQL 主版本的脚本。如果未看到此文件,则说明你的版本不受影响(只有 v14–v16 受影响),或者你的小版本太旧,尚未包含此修复。在集簇的每个数据库中,以超级用户身份运行
fix-CVE-2024-4317.sql脚本。在 psql 中,命令如下:\i /usr/share/postgresql/fix-CVE-2024-4317.sql
(根据需要调整文件路径)。任何错误可能表明你使用了错误版本的脚本。多次运行该脚本不会有害。
不要忘记包含
template0和template1数据库,否则以后创建的数据库仍然存在该漏洞。要修复template0,你需要临时允许它接受连接。执行:ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
然后在修复
template0后,执行以下命令撤销:ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
修复从多个
VALUES行INSERT到目标列为数组或复合类型上的域时的问题(Tom Lane)§这类情况会以数据类型不匹配的意外错误失败,或者插入可能导致奇怪结果的意外强制转换。
要求对带有
DO NOTHING子句的MERGE的目标表具有SELECT权限(Álvaro Herrera)§在所有实际情况中都需要
SELECT权限,但即使查询不读取目标表的任何列也要求该权限。这避免了MERGE完全不需要任何权限的边缘情况,即使它是一个不做任何事情的命令,这也是不可取的。修复
MERGE中对自修改元组的处理(Dean Rasheed)§如果目标行与多个源行连接,按照 SQL 标准的要求抛出错误。(之前的代码在涉及并发更新时可能会静默忽略此条件。)此外,如果目标行已被当前事务中的后续命令更新(由于
BEFORE触发器或查询中使用的易变函数),则抛出一个不会产生误导的错误。修复当表按布尔列分区且查询含有布尔
IS NOT子句时,对 NULL 分区的不正确修剪(David Rowley)§NULL 值满足诸如
之类的子句,因此修剪掉包含 NULL 的分区会产生不正确的结果。boolcolIS NOT FALSE使
ALTER FOREIGN TABLE SET SCHEMA将所拥有的序列移到新模式中(Tom Lane)§将常规表移到新模式会导致该表所拥有的序列也被移到该模式中(连同索引和约束)。但对于外部表,这一点被遗漏了。
使
ALTER TABLE ... ADD COLUMN创建的标识 /serial 序列与其所属表具有相同的持久性(Peter Eisentraut)§CREATE UNLOGGED TABLE会使所拥有的序列也成为不记录 WAL 的。ALTER TABLE遗漏了这一考虑,导致添加的标识列会有一个日志序列,这看起来毫无意义。改进当存在依赖的函数或发布时
ALTER TABLE ... ALTER COLUMN TYPE的错误消息(Tom Lane)§ §在
CREATE DATABASE中,以大小写不敏感的方式识别策略关键字,以与其他选项保持一致(Tomas Vondra)§修复
EXPLAIN对位图堆扫描访问的堆页面的计数(Melanie Plageman)§之前,不包含可见元组的堆页面不被计数;但计算位图索引扫描返回的所有页面似乎更一致。
修复
EXPLAIN对MERGE中子计划的输出(Dean Rasheed)§EXPLAIN有时无法正确显示引用计划树其他部分中变量的子计划参数。避免在移除孤立临时表时出现死锁(Mikhail Zhilin)§
如果创建临时表的会话在未移除该表的情况下崩溃,autovacuum 最终会尝试移除该孤立的表。然而,被分配了相同临时命名空间的新传入会话也会尝试这样做。如果临时表有依赖项(如拥有的序列),这两个清理尝试之间可能会产生死锁。
修复带有
DISABLE_PAGE_SKIPPING选项的VACUUM中可见性映射状态的更新(Heikki Linnakangas)§由于一个疏忽,此模式导致所有堆页面被标记为脏页,产生过多的 I/O。此外,不正确设置的可见性映射位不会被清除。
避免在检查每个关系的冻结 XID 值时出现竞态条件(Noah Misch)§
VACUUM从每个关系的值计算每个数据库的冻结 XID 值时,可能会被另一个VACUUM对这些值的并发更新所混淆。修复并行 vacuum 的缓冲区使用报告(Anthonin Bonnefoy)§
并行工作进程执行的缓冲区访问没有被计入
VERBOSE模式下报告的统计信息中。确保从等价类生成的连接条件在正确的计划层级应用(Tom Lane)§
在 PostgreSQL 16 之前的版本中,生成的条件可能在外连接下方被评估,而实际上应在外连接上方(之后)评估,导致不正确的查询结果。所有版本在考虑连接到具有部分
SELECT分支中连接列为常量输出的UNION ALL树时都有类似的隐患。修复在规划带有
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”之类的错误。避免在非移动窗口帧中不必要地使用移动聚合模式(Vallimaharajan G)§
当普通聚合作为窗口函数使用,且窗口帧起始指定为
UNBOUNDED PRECEDING时,帧的头部无法移动,因此我们不需要使用特殊的(且更昂贵的)移动聚合模式。这个优化一直是预期的,但由于编码错误从未被触发。避免在 GEQO 下规划按分区连接时使用已释放的数据(Tom Lane)§
这通常会以崩溃或意外的错误消息告终。
避免在 Memoize 中释放仍在使用的数据(Tender Wang,Andrei Lepikhov)§
在生产构建中,此错误通常不会造成任何问题,因为被释放的数据在被使用之前极有可能不会被覆盖。
修复“requested statistics kind
Xis not yet built”错误消息中不正确报告的统计类型代码(David Rowley)§对“catcache list”对象使用 hash 表代替线性搜索(Tom Lane)§
此更改解决了在具有数千个角色的安装中某些操作报告的性能问题。
更加小心地处理
FROM中返回RECORD的函数(Tom Lane)§ §此类函数调用的输出列必须由指定列名和数据类型的
AS子句来定义。如果实际的函数输出值不匹配,应在运行时抛出错误。然而,某些代码路径会过早检查实际值,如果不符合预期可能会发出奇怪的错误或触发断言失败。修复 SQL 语言过程的返回行类型混淆(Tom Lane)§
以 SQL 语言实现的返回单个复合类型列的过程会导致断言失败或核心转储。
为一些递归函数增加保护性栈深度检查(Egor Chindyaskin)§
修复
date_bin()中的舍入错误和溢出隐患(Moaaz Assali)§在源时间戳在原点时间戳之前且两者差值恰好是步长的整数倍的情况下,代码错误地仍然减去了步长。此外,检测了一些会产生不正确结果的整数溢出情况。
检测在
timestamp上加减interval时的整数溢出(Joseph Koshakow)§某些应该导致超出范围错误的情况反而产生了不正确的结果。
避免
pg_get_expr()中的竞态条件(Tom Lane)§如果参数引用的关系被并发删除,函数的意图是返回 NULL,但有时会失败。
修复 XID 状态函数中对旧事务 ID 的检测(Karina Litskevich)§
距今超过 231 个事务的事务 ID 可能被误识别为近期的,导致
pg_xact_status()或txid_status()出现异常行为。确保表的空闲空间映射不会返回超出表末尾的页面(Ronan Dunklau)§
由于空闲空间映射不写入 WAL 日志,在涉及操作系统崩溃、副本提升或 PITR 恢复的边缘情况下这是可能的。结果将会是“could not read block”错误。
修复在
WaitEventSetWait中等待时抛出错误导致的文件描述符泄漏(Etsuro Fujita)§避免在 FDW 实现了异步追加但未为 Append 计划节点配置任何等待条件时损坏异常栈(Alexander Pyhalov)§
如果在重建索引期间访问索引,则抛出错误(Tom Lane)§
之前这只是一个断言检查,现在将其提升为常规运行时错误。当重建索引的用户定义索引表达式尝试访问其自身的表时,这将提供一个更有针对性的错误消息。
确保对
name列的仅索引扫描返回完整填充的值(David Rowley)§物理存储在索引中的值是被截断的,之前会将指向该值的指针返回给调用者。这在 valgrind 下测试时引发了告警。理论上可能导致崩溃,但尚未收到相关报告。
修复在使复制槽失效时可能导致报告不正确冲突原因的竞争条件(Bertrand Drouvot)§
修复逻辑复制中判断是否需要表同步操作时的竞态条件(Vignesh C)§
在订阅者确定哪些表需要同步时到达的失效事件会被遗忘,因此新需要同步的表可能不会被及时处理。
修复大于 4GB 的 DSM 分配时的崩溃(Heikki Linnakangas)§
如果新服务器会话的客户端套接字无法被设置为非阻塞模式则断开连接(Heikki Linnakangas)§
曾经在理论上可以使用阻塞模式的套接字来运行;但这在很长时间以来就已经不能完全工作了,所以在连接开始时失败而不是稍后出现异常行为。
修复 OpenSSL 3.0.0 及更高版本中不充分的错误报告(Heikki Linnakangas,Tom Lane)§
通过 OpenSSL 传递的系统报告错误是用数字错误代码而非可读内容报告的。
修复 Windows 上
getaddrinfo()错误报告的线程安全性(Thomas Munro)§多线程的 libpq 客户端程序在网络查找失败后可能获得不正确或损坏的错误消息。
避免在 libpq 和 ecpglib 中并发调用
bindtextdomain()(Tom Lane)§ §虽然 GNU gettext 的实现似乎可以处理并发调用,但 Windows 上可用的版本不行。
在 ecpg 中,避免发出错误的“unsupported feature will be passed to server”警告(Tom Lane)§
确保 ecpg 的
intoasc()函数的字符串结果正确以零结尾(Oleg Tselebrovskiy)§在 initdb 的
-c选项中,大小写不敏感地匹配参数名(Tom Lane)§服务器对参数名的处理是大小写不敏感的,因此此代码也应如此。这避免了在生成的
postgresql.conf文件中放入冗余条目。在 psql 中,避免在查询被取消后泄漏查询结果(Tom Lane)§
这仅在取消由
\;分隔符组成的查询字符串中的非最后一个查询时发生。修复 pg_dumpall,使角色注释(如果存在)无论
--no-role-passwords的设置如何都会被导出(Daniel Gustafsson,Álvaro Herrera)§在 pg_basebackup、pg_checksums 和 pg_rewind 中跳过名为
.DS_Store的文件(Daniel Gustafsson)§这避免了在 macOS 上的问题,因为 Finder 可能会创建此类文件。
修复 PL/pgSQL 对表达式后跟单行注释(
--风格注释)的解析(Erik Wienhold,Tom Lane)§此错误导致当此类注释跟在 PL/pgSQL
CASE语句中的WHEN表达式之后时会出现解析错误。在
contrib/amcheck中,不要由于短头部与长头部值的差异而报告虚假的不匹配失败(Andrey Borodin,Michael Zhilin)§ §堆元组或索引元组中的可变长度数据项可以有短头部或长头部,这取决于其创建时应用的压缩参数。将这些情况视为等价的,而不是在存在差异时报告错误。
修复 BRIN 输出函数中的错误(Tomas Vondra)§ §
这些输出函数仅用于在
contrib/pageinspect中显示索引条目,因此这些错误在实际中影响有限。在
contrib/postgres_fdw中,避免发出按常量排序的请求(David Rowley)§这可能发生在涉及
UNION ALL和常量输出子查询的情况下。按常量排序当然是无用的,但还有被远程服务器误解的风险,导致“ORDER BY positionNis not in select list”错误。使
contrib/postgres_fdw将远程会话的时区设置为GMT而不是UTC(Tom Lane)§在实际用途中这应该产生相同的结果。然而,
GMT由服务器中的硬编码代码识别,而UTC则从时区数据库中查找。因此在远程服务器的时区数据库缺少条目的不太可能的情况下,旧代码可能失败。在
contrib/xml2中,避免使用在较新版本的 libxml2 中已弃用的库函数(Dmitry Koval)§修复与 LLVM 18 的不兼容性(Thomas Munro,Dmitry Dolgov)§
允许
make check在 musl C 库下工作(Thomas Munro,Bruce Momjian,Tom Lane)§
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.