发布日期:. 2024年5月9日
这个版本包含了从15.6版本中修复的各种问题。 有关主要版本15中新功能的信息,请参见第 E.8 节。
对于运行15.X版本的用户,不需要进行dump/restore操作。
然而,在系统视图pg_stats_ext
和pg_stats_ext_exprs
中发现了一个安全漏洞,
可能允许经过身份验证的数据库用户查看他们不应该看到的数据。如果这在您的安装中是一个问题,请按照下面第一个变更日志条目中的步骤进行纠正。
另外,如果您正在从早于15.6版本升级,请参见第 E.2 节。
限制pg_stats_ext
和pg_stats_ext_exprs
条目的可见性,仅限于表所有者(Nathan Bossart)
这些视图未能隐藏涉及访问用户无权读取的列的表达式的统计信息。视图列,如
most_common_vals
,可能会暴露与安全相关的数据。
这里的潜在交互作用还不完全清楚,因此为了安全起见,将这些视图中的行
仅对关联表的所有者可见。
PostgreSQL项目感谢Lukas Fittl报告了这个问题。 (CVE-2024-4317)
单独使用,这个修复只会修复在新初始化的数据库集群中的行为。如果您希望在现有集群中应用此更改,您需要执行以下操作:
在share
目录中找到fix-CVE-2024-4317.sql
SQL脚本,该目录位于PostgreSQL安装目录中
(通常类似于/usr/share/postgresql/
)。确保使用适用于
您的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;
修复INSERT
从多个VALUES
行插入到目标列,该列是数组或复合类型上的域。(Tom Lane)
这种情况要么会因为不匹配的数据类型而失败,导致令人惊讶的投诉,要么会插入意外的强制转换,可能导致奇怪的结果。
针对SELECT
权限,对目标表进行MERGE
操作时需要带有DO NOTHING
子句(Álvaro Herrera)
SELECT
权限在所有实际情况下都是必需的,但即使查询不读取目标表的任何列,也需要该权限。
这样可以避免一个边缘情况,即MERGE
不需要任何权限,即使它是一个无操作的命令,这似乎也是不可取的。
修复MERGE
中自修改元组的处理(Dean Rasheed)
如果目标行与多个源行连接,根据SQL标准要求抛出错误。(如果涉及并发更新,以前的编码可能会悄悄忽略此条件。)
此外,如果目标行已经被当前事务中的后续命令更新,由于BEFORE
触发器或查询中使用的
一个易失性函数,抛出一个非误导性的错误。
修复了在表以布尔列分区且查询中有布尔IS NOT
子句时错误修剪NULL分区的问题(David Rowley)
一个NULL值满足一个子句,比如
,因此去除包含NULL的分区会导致错误的答案。
boolcol
不是
FALSE
使ALTER FOREIGN TABLE SET SCHEMA
命令将所有拥有的序列移动到新模式中(Tom Lane)
将常规表移动到新模式会导致表拥有的任何序列也移动到该模式(以及索引和约束)。 然而,对于外部表,这一点被忽略了。
使ALTER TABLE ... ADD COLUMN
创建与其所属表具有相同持久性的身份/序列(Peter Eisentraut)
CREATE UNLOGGED TABLE
将使任何拥有的序列也变为非记录。
ALTER TABLE
忽略了这一点,因此添加的标识列将具有记录的序列,这似乎是没有意义的。
改进ALTER TABLE ... ALTER COLUMN TYPE
在存在依赖函数或发布时的错误消息(Tom Lane)
在CREATE DATABASE
中,识别策略关键字时不区分大小写,以保持与其他选项的一致性(Tomas Vondra)
修复EXPLAIN
对由位图堆扫描访问的堆页的计数(Melanie Plageman)
以前,不包含可见元组的堆页面没有被计算在内;但更一致的做法是计算位图索引扫描返回的所有页面。
修复EXPLAIN
在MERGE
中子计划的输出(Dean Rasheed)
EXPLAIN
有时无法正确显示引用计划树其他部分变量的子计划参数。
避免在删除孤立的临时表时发生死锁(Mikhail Zhilin)
如果创建临时表的会话崩溃而没有删除表,自动清理将最终尝试删除孤立的表。 然而,分配了相同临时命名空间的传入会话也会这样做。 如果临时表有依赖关系(如拥有的序列),那么在这两次清理尝试之间可能会发生死锁。
在检查每个关系的冻结XID值时避免竞争条件(Noah Misch)
VACUUM
对每个数据库的冻结XID值的计算,可能会因为另一个VACUUM
对这些值的并发更新而混淆。
修复并行清理时的缓冲区使用报告(Anthonin Bonnefoy)
并行工作者执行的缓冲区访问未计入在VERBOSE
模式中报告的统计数据中。
不允许在使用该表的外部SQL命令中将表转换为视图(Tom Lane)
避免可能的崩溃。
确保从等价类生成的连接条件在正确的计划级别应用(Tom Lane)
在PostgreSQL 16之前的版本中,生成的条件可能会在应该在外连接之上(之后)评估时被评估在外连接之下,导致查询结果不正确。在考虑连接到具有某些SELECT
分支中连接列的常量输出的UNION ALL
树时,所有版本都存在类似的风险。
防止一些窗口函数的潜在不正确优化(David Rowley)
禁用“运行条件”优化ntile()
和count()
的非常量参数。这样可以避免与子选择相关的可能的错误行为,通常导致类似于
“在子计划目标列表中找不到WindowFunc”的错误。
避免在非移动窗口帧上不必要地使用移动聚合模式(Vallimaharajan G)
当一个普通的聚合函数被用作窗口函数时,且窗口帧的起始位置被指定为UNBOUNDED PRECEDING
时,
帧的头部不会移动,因此我们不需要使用特殊的(更昂贵的)移动聚合模式。这种优化一直是有意的,但由于编码错误,它从未触发过。
避免在规划分区连接时使用已释放的数据(Tom Lane)
这通常会以崩溃或意外错误消息结束。
避免在Memoize中释放仍在使用的数据(Tender Wang,Andrei Lepikhov)
在生产版本中,这个错误通常不会引起任何问题,因为释放的数据在被使用之前很可能不会被覆盖。
修复“请求的统计种类X
尚未构建”错误消息中不正确报告的统计种类代码(David Rowley)
在FROM
中更加小心处理返回RECORD
的函数(Tom Lane)
这样的函数调用的输出列必须由AS
子句定义,该子句指定列名和数据类型。
如果实际函数输出值与之不匹配,则应在运行时抛出错误。然而,一些代码路径可能会过早地检查实际值,
如果不符合预期,可能会发出奇怪的错误或遭受断言失败。
修复关于SQL语言过程返回行类型的混淆(Tom Lane)
使用SQL语言实现的一个返回单个复合类型列的过程会导致断言失败或核心转储。
为一些递归函数添加保护性堆栈深度检查(Egor Chindyaskin)
修复date_bin()
中的四舍五入和溢出风险(Moaaz Assali)
在源时间戳早于原始时间戳且它们的差值已经是步长的整数倍的情况下,代码错误地仍然减去了步长。 同时,检测一些可能导致产生错误结果的整数溢出情况。
当将时间间隔
加到/从时间戳
中时,检测整数溢出(Joseph Koshakow)
一些应该引起超出范围错误的情况,却产生了错误的结果。
避免pg_get_expr()
中的竞争条件(Tom Lane)
如果参数引用的关系同时被删除,函数的意图是返回NULL,但有时会失败。
修复XID状态函数中对旧事务ID的检测(Karina Litskevich)
过去超过231个事务的事务ID可能被误认为是最近的,
导致pg_xact_status()
或txid_status()
的异常行为。
确保表的空闲空间映射不会返回超出表末端的页面(Ronan Dunklau)
由于freespace map没有进行WAL日志记录,在涉及操作系统崩溃、副本提升或PITR恢复的边缘情况下,这是可能的。结果将是一个“无法读取块”错误。
在WaitEventSetWait
中等待时发生错误时修复文件描述符泄漏(藤田悦郎)
避免在FDW实现异步追加但没有为Append计划节点配置任何等待条件时破坏异常堆栈(Alexander Pyhalov)
当正在重新索引时访问索引会抛出错误(Tom Lane)
以前这只是一个断言检查,但将其提升为常规运行时错误。当重新索引用户定义的索引表达式尝试访问自己的表时,这将提供一个更准确的错误消息。
确保对name
列进行的仅索引扫描返回完全填充的值(David Rowley)
索引中物理存储的值被截断,以前将该值的指针返回给调用者。在valgrind下测试时引发了投诉。 理论上可能导致崩溃,尽管没有报告过。
修复逻辑复制中决定是否需要表同步操作的竞争条件(Vignesh C)
当订阅者确定需要同步哪些表时,如果发生失效事件,则可能会被忘记,导致一些新需要同步的表可能无法及时处理。
修复了DSM分配大于4GB时的崩溃(Heikki Linnakangas)
如果无法将新服务器会话的客户端套接字设置为非阻塞模式,则断开连接(Heikki Linnakangas)
曾经在理论上我们可以使用阻塞模式的套接字;但长期以来这种方式并没有完全起作用,所以在连接开始时失败,而不是之后出现问题。
修复OpenSSL 3.0.0及更高版本的错误报告不足问题(Heikki Linnakangas, Tom Lane)
OpenSSL传递的系统报告的错误是用数字错误代码而不是可读内容报告的。
避免在libpq和ecpglib中同时调用bindtextdomain()
(Tom Lane)
虽然GNU gettext的实现似乎可以处理并发调用,但在Windows上可用的版本不行。
修复ecpg的预处理器在程序尝试重新定义在预处理器命令行上定义的宏时崩溃(Tom Lane)
在ecpg中,避免发出错误的“不支持的功能将被传递给服务器”警告(Tom Lane)
确保ecpg的intoasc()
函数的字符串结果正确地以零结尾(Oleg Tselebrovskiy)
在psql中,在查询被取消后避免泄漏查询结果(Tom Lane)
这种情况仅在取消一个使用\;
分隔符组成的查询字符串中的非最后一个查询时发生。
修复pg_dumpall,使得角色注释(如果存在)将被转储,无论
--no-role-passwords
的设置如何(Daniel Gustafsson,
Álvaro Herrera)
跳过名为.DS_Store
的文件,
在pg_basebackup,
pg_checksums,
和pg_rewind中(Daniel Gustafsson)
这样可以避免在macOS上出现问题,因为Finder可能会创建这样的文件。
修复PL/pgSQL对表达式后面的单行注释(--
风格注释)的解析(Erik Wienhold, Tom Lane)
这个错误导致在WHEN
表达式后面跟着一个注释时出现解析错误,
在PL/pgSQL CASE
语句中。
在contrib/amcheck
中,不要报告由于短头部与长头部值不匹配而导致的假匹配失败(Andrey Borodin,Michael Zhilin)
在堆元组或索引元组中,变长数据可以有短头部或长头部,这取决于制作时应用的压缩参数。 将这些情况视为等效,而不是在存在差异时报错。
修复BRIN输出函数中的错误(Tomas Vondra)
这些输出函数仅用于在contrib/pageinspect
中显示索引条目,因此错误的实际影响有限。
在contrib/postgres_fdw
中,避免发出按常数排序的请求(David Rowley)
这可能发生在涉及UNION ALL
和发出常量的子查询的情况下。按常量排序当然是无用的,
但也有被远程服务器误解的风险,导致“ORDER BY position N
is 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)