发布日期:. 2023年2月9日
这个版本包含了从15.1版本中修复的各种问题。 有关主要版本15中的新功能信息,请参见第 E.8 节。
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 ... 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
标记不会被正确替换为适当的默认值表达式,
导致“未识别的节点类型”错误。
拒绝在jsonpath
存在检查中使用未定义的变量(Alexander Korotkov, David G. Johnston)
当jsonpath
匹配操作符在路径模式中引用了未定义的变量时,会抛出错误,
而存在性操作符则会将其视为匹配。
修复jsonb
下标处理,以处理被分片的下标值(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
,我们在“在...事务之前停止恢复”日志消息中打印了一个不正确的时间戳(始终为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”。
修复在执行窗口函数运行条件表达式期间可能出现的悬空指针访问(David Rowley)
实际上,由于运行条件优化仅适用于某些窗口函数,这些函数恰好都返回int8
,
这只在32位构建中表现为问题。
在子查询提取中添加递归和循环防御(Tom Lane)
一个人为的查询可能导致深度递归和花费不合理的时间来尝试展平子查询。对此的适当修复似乎对于一个回溯补丁来说过于侵入性, 但我们至少可以添加堆栈深度检查和中断检查,以允许取消查询。
修复了将Memoize节点与分区连接或参数化嵌套循环结合时的规划器问题(Richard Guo)
这些错误可能导致在可能有用的情况下不使用Memoize,或者可能导致错误的查询计划。
修复按分区连接代码,以容忍不能对每个分区生成计划的情况(Tom Lane)
这可能导致“无法为给定查询设计查询计划”错误。
限制由get_actual_variable_range
(Simon Riggs)执行的清理工作量。
在删除大量出现在索引末尾的元组后发生的Planner运行可能会花费大量工作来设置这些索引条目的“已删除”位。 通过在检查100个堆页面后放弃这个过程来限制任一查询中所做的工作量。所有的清理最终仍会发生,但不会有如此大的性能波动。
防止统计机制在关系的relkind发生变化时混淆(Andres Freund)
将表转换为视图可能导致崩溃或断言失败。
修复AT TIME ZONE
构造中括号不足的显示问题(Tom Lane)
这可能导致规则或视图中AT TIME ZONE
的参数本身是一个表达式而导致的dump/restore失败。
防止SQL函数中utility语句的缓存解析树被覆盖(Tom Lane,Daniel Gustafsson)
如果一个SQL语言函数在单个调用查询中执行相同的实用命令超过一次,它可能会崩溃或报告诸如“未识别的节点类型”等奇怪错误。
确保在执行全文搜索查询时可以取消,同时执行短语匹配(Tom Lane)
修复在具有不确定性排序的字符串哈希中的内存泄漏(Jeff Davis)
修复DROP DATABASE
和逻辑复制工作进程之间的死锁(侯志杰)
这是由于在worker中创建逻辑复制插槽时阻止中断的不明智选择造成的。在版本15中,这可能导致无法检测到的死锁。在版本14中,尚未观察到死锁,但在等待网络I/O时阻止中断仍然是一个坏主意。
在失败的复制连接尝试之后清理libpq连接对象 (Andres Freund)
之前的编码泄漏了连接对象。在后台代码路径中,这是相当无害的,因为调用进程会放弃并退出。
但在诸如CREATE SUBSCRIPTION
之类的命令中,这样的失败会导致一个小的会话生命周期内存泄漏。
在热备用服务器中,减少跟踪已知在主服务器上活动的XIDs的处理工作(Simon Riggs,Michail Nikolaev)
对KnownAssignedXids数组的清理不够积极可能导致性能不佳,特别是在备用机上将max_connections
设置为较大值时。
在确定最旧的catalog xmin时忽略无效的逻辑复制插槽(Sirisha Chamarthi)
复制槽即使在因超过max_slot_wal_keep_size
而失效后,
也可以防止系统目录中死元组的清理。因此,复制消费者的故障可能导致目录
无限增大。
在逻辑解码中,当检测到事务崩溃时,通知远程节点(侯志杰)
在服务器重新启动后,我们将重新流式传输在重新启动前发生的事务更改。这些事务中有一些可能从未完成; 当我们意识到其中一个没有完成时,我们会在本地丢弃相关的解码状态,但我们忽略了告诉订阅者。 这导致订阅者保留无用的流式传输文件,直到下次重新启动。
修复逻辑解码中未初始化内存的使用(Masahiko Sawada)
在某些情况下,逻辑解码的恢复可能尝试重新使用已经被释放的XID数据,导致行为不可预测。
在逻辑解码上下文创建期间更新共享状态时获取自旋锁(Masahiko Sawada)
在更新有关两阶段事务的数据时,我们忽略了获取适当的锁,这可能导致其他进程看到不一致的数据。
修复pgoutput复制插件,不发送未在表的复制列列表中列出的列 (侯志杰)
UPDATE
和DELETE
事件没有注意到配置的列列表,
因此发送了比预期更多的数据。当接收方是我们内置的逻辑复制代码时,这不会造成问题,
但可能会使其他接收方感到困惑,并且无论如何都浪费了网络带宽。
避免在哈希索引页面拆分操作的WAL重放期间发生罕见的“未能获取清理锁”的panic错误(Robert Haas)
在WAL重放期间设置堆页面的全可见位时,推进堆页面的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)
这个断言过于严格,所以在非断言构建中这个错误是无害的。
移除无用的结果运行时错误优化逻辑中的错误断言(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
的TAB补全... SET SCHEMA
(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)
这样的组合以前可能会出现“可加载库和perl二进制文件不匹配”的错误。
抑制Perl头文件中的编译器警告(Andres Freund)
我们首选的编译器选项会引发关于最近版本Perl头文件中出现的构造的警告。 当使用gcc时,我们可以通过一个编译指示来抑制这些警告。
修复pg_waldump在不丢弃未使用的静态内联函数的编译器上构建的问题(Tom Lane)
更新时区数据文件至tzdata 发布2022g版本,以适应格陵兰和墨西哥的夏令时法律变化, 以及对加拿大北部、哥伦比亚和新加坡的历史更正。
值得注意的是,一个新的时区America/Ciudad_Juarez已经从America/Ojinaga中分离出来。