发布日期:. 2024-08-08
此版本包含从16.3修复的各种问题。 有关16的主要版本中新功能的信息,请参阅 第 E.9 节。
防止在pg_dump期间执行未经授权的代码 (Masahiko Sawada) §
能够创建和删除非临时对象的攻击者可能会注入SQL代码,这些代码将由
并发的pg_dump会话以运行
pg_dump的角色权限执行(通常是超级用户)。
该攻击涉及用一个视图或外部表替换序列或类似对象,从而执行恶意代码。
为了防止这种情况,引入了一个新的服务器参数
restrict_nonsystem_relation_kind
,它可以禁用非内置视图的扩展
以及对外部表的访问,并教会pg_dump在可用时设置它。
请注意,只有当pg_dump和它正在转储的服务器
都足够新以包含此修复时,才能防止该攻击。
PostgreSQL项目感谢 Noah Misch 报告了此问题。 (CVE-2024-7348)
避免合并右反连接计划中的错误结果 (Richard Guo) §
如果已知内部关系具有唯一的连接键,当外部关系中存在重复的连接键时, 合并可能会出现异常行为。
防止在VACUUM
中出现无限循环
(Melanie Plageman)
§
当一个带有旧运行事务的断开连接的备用服务器重新连接到主服务器时,
主服务器上的VACUUM
可能会对哪些元组是可移除的感到困惑,
从而导致无限循环。
修复在将表作为分区附加后出现的故障,如果该表之前有继承子表 (Álvaro Herrera) §
修复ALTER TABLE DETACH PARTITION
在涉及不一致的基于索引的约束
情况下的问题(Álvaro Herrera, Tender Wang)
§
§
当一个分区表有一个未与约束关联的索引,但某个分区有一个等效的与约束
关联的索引时,分离该分区会出现异常,导致前分区的约束具有不正确的
coninhcount
值。这将在对该约束进行任何
进一步操作时引发问题。
修复在ALTER TABLE DETACH PARTITION CONCURRENTLY
期间的分区修剪设置
(Álvaro Herrera)
§
§
执行器假设在对分区表的查询从规划到执行之间,不会有分区被分离。
自从引入DETACH PARTITION
的CONCURRENTLY
选项后,这种假设不再成立,这使得在使用该选项时,查询执行可能会暂时失败。
正确更新分区表的
pg_class
.reltuples
字段为零,当其最后一个子分区被删除后 (Noah Misch)
§
第一次在这样的分区表上执行ANALYZE
时,必须同时更新
relhassubclass
,这导致reltuples
的更新丢失。
修复对过程的多态输出参数的处理 (Tom Lane) § §
SQL CALL
语句未能解析此类参数的正确数据类型,
导致出现诸如“无法显示类型为 anyelement 的值”之类的错误,
甚至直接崩溃。(但CALL
在
PL/pgSQL中正常工作。)
修复从CALL
语句的参数列表中调用的稳定函数的行为
(Tom Lane)
§
如果CALL
位于一个原子上下文中
(例如,有一个外部事务块),这些函数会被传递错误的快照,
导致它们看到自外部事务开始以来被修改的行的过时值。
修复 ISO-8601 “扩展”时间格式的输入,适用于
类型time
和timetz
(Tom Lane)
§
重新允许类似T12:34:56
的情况。
检测money
计算中的整数溢出
(Joseph Koshakow)
§
以前,money
类型的算术函数都没有检查溢出,因此在溢出
的情况下,它们会默默地给出错误的答案。
修复在round(numeric)
和trunc(numeric)
中对scale参数过于激进的限制(Dean Rasheed)
§
这些函数将其比例参数限制在+/-2000之间,但在某些情况下,
可能需要更大的值;在这种情况下,函数会返回错误的结果。
因此,将其限制在numeric
类型的实际允许范围内。
修复pg_size_pretty()
函数在应用于最小可能
bigint
值时的结果 (Joseph Koshakow)
§
防止pg_sequence_last_value()
在备用服务器上的未记录序列
和其他会话的临时序列上失败(Nathan Bossart)
§
使其在这些情况下返回NULL,而不是抛出错误。
修复websearch_to_tsquery()
中忽略的操作符解析
(Tom Lane)
§
根据手册,websearch_to_tsquery()
输入中的标点符号会被忽略,
除了破折号和引号的特殊情况。然而,出现在or
之前的括号和
其他一些字符可能会导致or
被视为数据词,而不是预期的
OR
运算符。
检测在计算新数组维度时的另一个整数溢出情况 (Joseph Koshakow) §
拒绝将数组维度[-2147483648:2147483647]
应用于一个空数组。
这与CVE-2023-5869密切相关,但似乎无害,因为数组最终仍然是空的。
修复不可移植的strnxfrm()
用法 (Jeff Davis)
§
一些用于非确定性排序规则的代码路径可能会失败,并出现类似 “pg_strnxfrm() 返回了意外的结果”的错误。
检测到另一个新的目录缓存条目在解压其字段时变得过时的情况 (Noah Misch) §
在扩展目录元组中的外部字段时发生的就地更新可能会被遗漏,
导致目录缓存条目缺少就地更改但未被标记为过时。这种情况
仅可能发生在pg_database
目录中,
因此影响范围较小,但可能会导致异常行为。
正确检查由INSERT
... DEFAULT
目标视图列的可更新性 (Tom Lane)
§
如果这样的列是不可更新的,我们应该报告一个错误。但这个检查被遗漏了,
后续代码会报告一个无用的错误,例如“属性编号
N
在视图目标列表中未找到”。
避免因不正确的递归查询而报告无用的内部错误(Tom Lane) §
调整错误检查的顺序,以便在WITH RECURSIVE
查询在
UNION
的第二部分中没有自引用但在其他地方(例如
ORDER BY
)有一个自引用时,抛出一个针对性的错误。
在ALTER TABLE SET LOGGED|UNLOGGED
期间锁定拥有的序列
(Noah Misch)
§
这些命令会随着表一起更改表所拥有序列的持久性,但它们在执行此操作时未能
获取序列的锁。这可能导致丢失并发nextval()
调用的效果。
如果排队的AFTER
触发器不再存在,则不要抛出错误
(Tom Lane)
§
事务可以执行一个操作,将一个延迟的AFTER
触发器排队等待
后续执行,然后在触发器执行之前将其删除。以前,这会导致奇怪的错误,
例如“无法找到触发器NNNN
”。
如果触发器在本应执行时已不存在,默默地不执行任何操作似乎更好。
修复在删除表时未能移除pg_init_privs
条目
的问题,这些条目与列级权限相关(Tom Lane)
§
如果一个扩展在其创建的表上授予了一些列级别的权限,那么在删除 该扩展后,相关的目录条目会保留。这在表的OID被重新用于另一个 关系之前是无害的,但一旦发生这种情况,它可能会干扰 pg_dump为该关系导出的内容。
修复在所需索引具有表达式或谓词时为ON CONFLICT
选择仲裁者索引的问题 (Tom Lane)
§
如果一个使用ON CONFLICT
的查询通过可更新视图访问目标表,
它可能会失败,并显示“没有与ON CONFLICT规范匹配的唯一或排除约束”,
即使确实存在一个匹配的索引。
拒绝使用ALTER TABLE
修改其他会话的临时表
(Tom Lane)
§
权限检查通常会阻止这种情况的发生,但通过修改父表(其子表是另一个会话的临时表), 仍有可能导致这种情况。如果我们发现这样的子表属于另一个会话,则抛出错误。
修复在CREATE TABLE LIKE STATISTICS
中对表达式的扩展统计信息
的处理(Tom Lane)
§
CREATE
命令未能将统计表达式中的列引用调整为新表可能不同的
列编号。这导致了无效的统计对象,可能在后续引发问题。一个典型的需要重新
编号列的场景是源表包含一些已删除的列。
修复无法重新计算从MIN()
或MAX()
聚合生成的子查询的问题(Tom Lane)
§
在某些情况下,外部查询某一行计算的聚合结果可能会被后续行重复使用,
而实际上不应该这样。这种情况仅在外部查询使用
DISTINCT
并通过哈希聚合实现时被观察到,
但也可能存在其他情况。
再次禁止在位置参数中使用下划线 (Erik Wienhold) §
从v16版本开始,我们允许整数字面量包含下划线。
这一更改导致像$1_234
这样的输入被视为单个标记,
但它并未正确工作。似乎更好地回到原始定义,其中参数符号仅为
$
后跟数字。
避免在JIT内联的后端函数抛出错误时崩溃 (Tom Lane) §
错误状态可能包括指向动态加载模块的指针,该模块包含JIT编译代码 (用于错误位置字符串)。在某些代码路径中,模块可能在错误报告 被处理之前被卸载,导致在访问位置字符串时发生SIGSEGV。
应对libxml2版本2.13.x中的行为变化 (Erik Wienhold,Tom Lane) §
值得注意的是,我们现在抑制了“块不平衡”错误, 除非这是唯一报告的错误。这是为了使错误报告在2.13.x和 早期libxml2版本之间保持一致。 在早期版本中,该消息几乎总是多余的或完全不正确的,因此 2.13.x大大减少了报告该消息的情况。
修复在启动热备服务器时处理预备事务的子事务问题 (Heikki Linnakangas) §
当从关闭检查点WAL记录开始回放备用时,在主库上已准备但尚未提交的事务 会被正确理解为仍在进行中。但是,已准备事务的子事务(由保存点或 PL/pgSQL异常块创建)未被考虑在内,并会被 视为已中止。如果稍后提交了已准备事务,这将导致不一致。
防止逻辑复制槽的错误初始化 (Masahiko Sawada) §
在某些情况下,复制槽在WAL流中的起始点可能会设置在事务内, 导致断言失败或解码结果不正确。
避免在复制槽创建和删除期间出现“只能删除统计信息一次” 错误(Floris Van Nee) §
修复逻辑复制WAL发送器中的资源泄漏问题 (侯志杰) §
当发布对分区表的更改时,如果分区的行类型与分区表的物理类型不同, walsender 进程会发生内存泄漏。
避免在处理通知或sinval中断后发生内存泄漏 (Tom Lane) §
这些事件的处理函数可能会将当前内存上下文切换到TopMemoryContext, 导致在错误设置被替换之前分配的任何数据出现会话生命周期的泄漏。 与(至少)传入查询的编码转换和附加到Bind消息的参数相关的泄漏是可观察到的。
防止用于统计的共享内存块的引用计数泄漏(Anthonin Bonnefoy) §
一个新的后端进程附加到统计共享内存时增加了其引用计数,但在退出时未能 减少计数。在创建了232个会话后,引用计数会溢 出为零,导致所有后续后端进程启动失败。
防止在截断multixact SLRU日志时发生死锁和断言失败 (Heikki Linnakangas) §
一个试图删除 SLRU 段的进程可能会与检查点进程发生死锁。
避免可能遗漏Windows套接字上的输入结束事件 (Thomas Munro) §
Windows 在远程端断开连接后仅报告一次 FD_CLOSE 事件。如果时机不巧, 我们可能会错过该报告并无限期等待,或者至少等到超时,期望有更多输入。
修复在JSON解析错误报告中因不完整字节序列导致的缓冲区过度读取 (Jacob Champion) §
当最后的字节包含一个不完整的多字节字符时,有可能会从输入缓冲区的末尾 走出几字节。虽然通常无害,但原则上这可能会导致崩溃。
禁用OpenSSL创建有状态的TLS会话票据 (Daniel Gustafsson) § § §
这避免了可能出现的客户端故障,这些客户端认为收到会话票据意味着 支持TLS会话恢复。
在重新规划PL/pgSQL“简单表达式”时, 检查它是否仍然简单(Tom Lane) §
某些相当人为的情况,例如删除一个被引用的函数并将其重新创建为一个聚合,可能会导致令人惊讶的失败, 比如“意外的计划节点类型”。
修复PL/pgSQL对包含下划线的整数范围的处理 (Erik Wienhold) §
从v16版本开始,我们允许整数字面量包含下划线,
但PL/pgSQL未能处理诸如
FOR i IN 1_001..1_003
之类的示例。
修复递归RECORD
返回的
PL/Python函数 (Tom Lane)
§
如果我们递归调用同一个函数,并传递一个不同的列定义列表
(AS
子句),它将会失败,因为内部调用会覆盖外部调用
对于返回行类型的定义。
不要在递归触发器调用期间破坏PL/Python的
TD
字典
(Tom Lane)
§
如果一个PL/Python语言触发器导致
另一个触发器被调用,内层触发器创建的TD
字典
会覆盖外层触发器的TD
字典。
修复PL/Tcl在返回元组的函数结果中报告无效列表 语法的问题(Erik Wienhold,Tom Lane) §
这种情况可能会导致崩溃,或者发出误导性的上下文信息,这些信息实际上 是指之前的Tcl错误。
避免在libpq中非线程安全地使用
strerror()
(Peter Eisentraut)
§
OpenSSL返回的某些错误消息可能会在多线程应用程序中变得混乱。
避免在pg_dump进行二进制升级时发生内存泄漏 (Daniel Gustafsson) §
确保pg_restore
-l
正确报告依赖的TOC条目 (Tom Lane)
§
如果指定了-l
并与选择性恢复选项(例如-n
或
-N
)一起使用,则依赖的目录条目(例如注释)将从列表中省略,
即使实际恢复会选择它们。
允许contrib/pg_stat_statements
区分出现在SQL语言函数中的
实用语句 (Anthonin Bonnefoy)
§
SQL语言函数执行器未能传递为实用程序计算的查询ID
(非SELECT
/INSERT
/UPDATE
/
DELETE
/MERGE
)语句。
避免“光标只能向前扫描”错误
出现在contrib/postgres_fdw
中 (Etsuro Fujita)
§
如果远程服务器是v15或更高版本,并且外部表映射到一个非简单的远程视图, 则可能会发生此错误。
在contrib/postgres_fdw
中,不要将
FETCH FIRST WITH TIES
子句发送到远程服务器
(Japin Li)
§
远程服务器可能不会实现此条款,或者可能会以与我们本地不同的方式解释, 因此不要冒险尝试远程执行。
避免与系统提供的<regex.h>
头文件冲突
(Thomas Munro)
§
这修复了在 macOS 15 及更高版本上的编译失败问题。
修复在 Memoize 成本估算中无害的断言失败 (David Rowley) §
修复在REINDEX CONCURRENTLY
应用于SP-GiST索引时出现的
无害断言失败问题(Tom Lane)
§