E.18. 发布版本 15.2 #
发布日期:. 2023-02-09
本次发布包含来自 15.1 的多项修复。有关 15 主版本新特性的说明,请参见第 E.20 节。
E.18.2. 变更 #
libpq 在 GSSAPI 传输加密初始化失败后可能泄漏内存内容(Jacob Champion)§
一个被修改的服务器,或未经身份验证的中间人,可以在建立 GSSAPI(Kerberos)传输加密期间发送一个非零终止的错误消息。libpq 随后会复制该字符串以及应用程序内存中直到下一个零字节的后续字节到其错误报告中。根据调用应用程序对错误报告的处理方式,这可能导致应用程序内存内容的泄露。由于读取超出内存末尾,还有很小的概率导致崩溃。修复方法是正确地对服务器消息进行零终止处理。(CVE-2022-41862)
修复在对分区表或继承树执行
UPDATE时,计算子表中哪些GENERATED列需要更新的问题(Amit Langote,Tom Lane)§ §此修复解决了以下问题:未能更新父表中不存在的
GENERATED列,或者其依赖关系与父列的生成表达式不同的列。修复
MERGE可能无法计算GENERATED列的问题(Dean Rasheed)§当
MERGE的第一个行级操作是UPDATE时,任何后续的INSERT操作将无法计算被认为对UPDATE操作不需要计算的GENERATED列(因为不依赖于任何UPDATE目标列)。修复
MERGE对不可达WHEN子句的检查(Dean Rasheed)§在无条件
WHEN子句之后的WHEN子句应该被拒绝为不可达,但这种情况并非总是被检测到。修复
MERGE的规则检测测试(Dean Rasheed)§MERGE不支持带规则的表;但它在曾经有规则但现在已没有规则的表上也会失败。在
MERGE中,不将DO NOTHING操作计为已处理的元组(Álvaro Herrera)§这使代码行为与文档一致。
允许
WITH RECURSIVE ... CYCLECTE 访问其输出列(Tom Lane)§从 CTE 内部引用
SET列会导致“cache lookup failed for type 0”错误。修复在对外部表执行批量插入时对待处理插入的处理(Etsuro Fujita)§ §
在某些情况下,待处理的插入未能及时刷新到 FDW,导致逻辑不一致,例如
BEFORE ROW触发器无法看到本应可以看到的行。允许在尚未(完全)有效的索引上设置
REPLICA IDENTITY(Tom Lane)§当 pg_dump 导出一个标记了
REPLICA IDENTITY的分区索引时,它生成的命令序列会在分区索引被标记为有效之前应用REPLICA IDENTITY,导致恢复失败。似乎没有很好的理由禁止按此顺序操作,因此允许这样做。在索引变为有效之前,该标记不会产生任何效果。修复在规则中从多行
VALUES列表执行INSERT时对DEFAULT标记的处理(Dean Rasheed)§在某些情况下,
DEFAULT标记不会被替换为正确的默认值表达式,导致“unrecognized node type”错误。拒绝在
jsonpath存在性检查中使用未定义的变量(Alexander Korotkov,David G. Johnston)§虽然
jsonpath匹配操作符对路径模式中的未定义变量会抛出错误,但存在性操作符却默默地将其视为匹配。修复
jsonb下标操作,使其能够处理经过 TOAST 处理的下标值(Tom Lane,David G. Johnston)§使用直接从表中获取的文本值作为
jsonb下标时很可能会失败。获取操作通常找不到任何匹配的元素。赋值操作可能会使用垃圾键存储值,不过在实际使用中,足够长以导致该问题的键可能很少见。修复并行哈希连接中的边界情况数据损坏问题(Dmitry Astapov)§
如果正在写入临时文件的大元组的最后一个块恰好是 32760 字节,由于栅栏柱错误会导致数据损坏。查询通常会在稍后以数据损坏的症状而失败。
遵循
checkpoint_completion_target的非默认设置(Bharath Rupireddy)§在
checkpoint_completion_target更改后,内部状态未被更新,可能导致检查点 I/O 执行得比预期更快或更慢,特别是在动态更改该设置时。在
recovery_target_xid模式下记录正确的结束时间戳(Tom Lane)§当基于
recovery_target_xid设置且recovery_target_inclusive=off结束恢复时,我们在“recovery stopping before ... transaction”日志消息中打印了一个不正确的时间戳(始终为 2000-01-01)。改进某些缓冲文件读取失败的错误报告(Peter Eisentraut)§
正确报告短读取,给出期望的字节数和实际读取的字节数,而不是报告一个不相关的错误代码。大多数地方已经正确处理了此问题,但一些最近编写的复制逻辑没有。
移除
int2vector和oidvector中元素数量的任意限制(Tom Lane)§这些类型的输入函数以前拒绝超过 100 个元素。随着逻辑复制列列表功能的引入,需要接受最多 1600 列的
int2vector,否则长列列表会导致逻辑复制失败。在扩展查询协议中,如果我们正在运行管道,避免在
ANALYZE之后立即提交(Tom Lane)§如果没有显式的
BEGIN TRANSACTION,ANALYZE会自行提交,但这在管道化的命令序列中不应该发生。拒绝长度错误的取消请求包(Andrey Borodin)§
即使取消请求的长度字段过小,服务器也会处理该请求。这导致读取超出已分配缓冲区的末尾。理论上这可能导致段错误,但在实际中不太可能发生,因为缓冲区需要非常接近内存末尾才会出现。更可能的结果是关于错误后端 PID 或取消码的虚假日志消息。改为对错误的长度发出报告。
修复规划器对窗口函数运行条件表达式的预处理疏忽(Richard Guo,David Rowley)§
这可能导致规划器错误,例如“WindowFunc not found in subplan target lists”。
修复在执行窗口函数运行条件表达式期间可能的悬挂指针访问(David Rowley)§
实际上,由于运行条件优化仅应用于某些恰好都返回
int8的窗口函数,这仅在 32 位构建上表现为问题。在子查询提升中增加递归和循环防护(Tom Lane)§
一个精心构造的查询可能导致深度递归和过多的时间用于尝试展平子查询。一个正确的修复对于后移来说过于侵入性,但至少我们可以增加堆栈深度检查和中断检查以允许取消查询。
修复将 Memoize 节点与按分区连接或参数化嵌套循环结合使用时的规划器问题(Richard Guo)§ §
这些错误可能导致在 Memoize 有用的上下文中未使用它,或者可能导致错误的查询计划。
修复按分区连接代码以容忍无法为每个分区生成计划的情况(Tom Lane)§
这可能导致“could not devise a query plan for the given query”错误。
限制
get_actual_variable_range执行的清理工作量(Simon Riggs)§在删除大量出现在索引末尾的元组之后立即进行的规划器运行,可能会花费大量工作来设置那些索引条目的“killed”位。通过在检查 100 个堆页面后放弃此过程来限制任何一次查询中的工作量。所有清理工作最终仍会完成,但不会出现如此大的性能波动。
防止当关系的 relkind 发生变化时统计机制混淆(Andres Freund)§
将表转换为视图可能导致崩溃或断言失败。
修复
AT TIME ZONE构造的括号不足的显示问题(Tom Lane)§如果
AT TIME ZONE的参数本身是一个表达式,这可能导致规则或视图的导出/恢复失败。防止 SQL 函数中工具语句的缓存解析树被覆盖(Tom Lane,Daniel Gustafsson)§
如果一个 SQL 语言函数在单个调用查询中多次执行同一个工具命令,可能会崩溃或报告诸如“unrecognized node type”之类的奇怪错误。
确保在执行短语匹配时可以取消全文检索查询的执行(Tom Lane)§
修复在使用非确定性排序规则对字符串进行 hash 运算时的内存泄漏(Jeff Davis)§
修复
DROP DATABASE与逻辑复制工作进程之间的死锁问题(Hou Zhijie)§此问题是由在工作进程中创建逻辑复制槽时不当选择阻塞中断引起的。在版本 15 中,这可能导致未被检测到的死锁。在版本 14 中,虽然未观察到死锁,但在等待网络 I/O 时阻塞中断仍然是不好的做法。
在复制连接尝试失败后清理 libpq 连接对象(Andres Freund)§
之前的代码泄漏了连接对象。在后台代码路径中这基本无害,因为调用进程会放弃并退出。但在诸如
CREATE SUBSCRIPTION等命令中,此类失败会导致少量会话生命周期的内存泄漏。在热备服务器中,减少跟踪主库上已知活跃 XID 的处理开销(Simon Riggs,Michail Nikolaev)§
对 KnownAssignedXids 数组清理不够积极可能导致性能下降,特别是在备库上
max_connections设置较大时。在确定最旧的目录 xmin 时忽略已失效的逻辑复制槽(Sirisha Chamarthi)§
复制槽即使在因超过
max_slot_wal_keep_size而变为失效之后,仍可能阻止系统目录中死元组的清理。因此,复制消费者的故障可能导致无限增长的目录膨胀。在逻辑解码中,当检测到事务已崩溃时通知远程节点(Hou Zhijie)§
在服务器重启后,我们将重新流式传输重启前不久发生的事务的变更。其中一些事务可能从未完成;当我们发现某个事务未完成时,我们在本地丢弃了相关的解码状态,但忽略了通知订阅者。这导致订阅者保留无用的流式文件,直到下次重启。
修复逻辑解码中使用未初始化内存的问题(Masahiko Sawada)§
在某些情况下,恢复逻辑解码可能会尝试重新使用已释放的 XID 数据,导致不可预测的行为。
在逻辑解码上下文创建期间更新共享状态时获取自旋锁(Masahiko Sawada)§
我们在更新两阶段事务的数据时忽略了获取适当的锁,这可能允许其他进程看到不一致的数据。
修复 pgoutput 复制插件,使其不发送未列在表的复制列列表中的列(Hou Zhijie)§
UPDATE和DELETE事件没有注意配置的列列表,因此发送了比预期更多的数据。当接收者是我们内置的逻辑复制代码时这不会造成问题,但它可能会使其他接收者混淆,并且在任何情况下都浪费了网络带宽。避免在 WAL 重放 hash 索引页面分裂操作期间出现罕见的“failed to acquire cleanup lock”恐慌(Robert Haas)§
在 WAL 重放期间设置堆页面的 all-visible 位时推进页面的 LSN(Jeff Davis)§
未能这样做会导致备库上的页面可能与主库不同,并违反了关于 LSN 何时更改的其他预期。就 PostgreSQL 本身而言,这似乎只是一个理论上的隐患,但可能影响第三方工具。
修复
int64_div_fast_to_numeric()以适用于更广范围的输入(Dean Rasheed)§该函数对其第二个参数的某些值表现异常。核心 PostgreSQL 中没有此类用法,但这对外部模块来说显然是一个隐患,因此予以修复。
修复
WaitEventSet逻辑中的潜在缓冲区溢出问题(Thomas Munro)§基于
epoll和kqueue的实现,在其内部缓冲区大小与调用者输出缓冲区大小不同时,可能向内核请求过多的事件。该情况在已发布的 PostgreSQL 版本中尚未出现,但此错误对外部模块和未来的错误修复构成隐患。避免在 32 位构建中访问共享内存时出现名义上的未定义行为(Andres Freund)§
clang 的未定义行为检测器对使用对齐不足的指针发出了警告。这在非调试构建中不太可能造成问题,但为了测试目的值得修复。
修复 BRIN minmax-multi 操作符类中的断言失败(Tomas Vondra)§
该断言过于严格,因此此错误在非断言构建中是无害的。
移除无用的 RESULT-RTE 优化逻辑中的错误断言(Tom Lane)§
修复 ACL 检查中缓存查找失败消息的复制粘贴错误(Justin Pryzby)§
原则上这些错误应该永远不会触发。但如果触发了,其中一些会报告错误类型的对象。
修复 pg_basebackup 中非常大的表空间映射文件可能损坏的问题(Antonin Houska)§
避免 pg_dump 在
--if-exists模式下的无害警告(Tom Lane)§如果
public模式有一个非默认的所有者,则使用 pg_dump 的--if-exists选项会产生警告消息“warning: could not find where to insert IF EXISTS in statement "-- *not* dropping schema, since initdb creates it"”。不过导出输出是正确的。修复 psql 的
\sf和\ef命令以处理具有 SQL 标准函数体的 SQL 语言函数(Tom Lane)§当函数体使用新式语法时,这些命令错误识别了函数体的起始位置。
修复
ALTER FUNCTION/PROCEDURE/ROUTINE...SET SCHEMA的 Tab 补全(Dean Rasheed)§更新
contrib/pageinspect以将其磁盘访问函数标记为PARALLEL RESTRICTED(Tom Lane)§这避免了在使用这些函数之一检查临时表时可能出现的失败,因为会话的临时表无法从并行工作进程访问。
修复
contrib/seg在输入数字超过 127 位时不再崩溃或输出垃圾数据(Tom Lane)§修复在 Microsoft Visual Studio 2013 上的构建问题(Tom Lane)§
之前的补丁假设所有相关平台都有
snprintf(),但 MSVC 2013 尚未完全支持。在该平台上恢复使用sprintf()。修复在使用 Strawberry Perl 时用 MSVC 构建 PL/Perl 的编译失败问题(Andrew Dunstan)§
修复用 MSVC 构建的 PL/Perl 与用 gcc 构建的 Perl 库之间的不匹配问题(Andrew Dunstan)§
此类组合之前可能导致“loadable library and perl binaries are mismatched”错误。
抑制来自 Perl 头文件的编译器警告(Andres Freund)§
我们首选的编译器选项会对 Perl 头文件最近版本中出现的构造引发警告。在使用 gcc 时,我们可以用 pragma 来抑制这些警告。
修复 pg_waldump 在不丢弃未使用的 static-inline 函数的编译器上的构建问题(Tom Lane)§
将时区数据文件更新为 tzdata 2022g 版本,包含格陵兰和墨西哥的夏令时法规变更,以及加拿大北部、哥伦比亚和新加坡的历史修正。(Tom Lane)§
值得注意的是,一个新的时区 America/Ciudad_Juarez 从 America/Ojinaga 中分离出来。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.