发布日期:. 2023-02-09
本次发布包含来自 15.1 的多项修复。 有关 15 主版本新特性的说明,请参见 Section E.18。
libpq 在 GSSAPI 传输加密初始化失败后可能泄漏内存内容(Jacob Champion) §
被修改的服务器或未经认证的中间人攻击者可以在建立 GSSAPI(Kerberos)传输加密期间发送一个未以零字节终止的错误消息。libpq 随后会将该字符串及其后续应用程序内存中直到下一个零字节的内容一起复制到其错误报告中。 取决于调用应用程序如何处理错误报告,这可能导致应用程序内存内容的泄漏。 由于读取超出内存末尾,也有很小的概率导致崩溃。通过正确地以零字节终止服务器消息来修复此问题。 (CVE-2022-41862)
修复在分区表或继承树上执行 UPDATE 时,计算子表中哪些 GENERATED 列需要更新的问题(Amit Langote,Tom Lane) § §
此修复解决了无法更新父表中不存在的 GENERATED 列,或依赖关系与父列的生成表达式不同的 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 ... CYCLE CTE 访问其输出列(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 下标访问在处理 toasted 下标值时的问题(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) §
修复使用非确定性排序规则对字符串进行哈希时的内存泄漏(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 重放哈希索引页面分裂操作期间罕见的 “failed to acquire cleanup lock” panic(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 分离出来。