E.1. 版本 14.7
- E.1.1. 迁移到版本 14.7
- E.1.2. 变化
发布日期: 2023-02-09
此版本包含 14.6 中的各种修复。有关主要版本 14 中的新功能的信息,请参阅第 E.8 节(https://www.postgresql.org/docs/14/release-14.html)。
E.1.1. 迁移到版本 14.7
运行 14.X 的用户不需要转储/恢复。
但是,如果您要从早于 14.4 的版本升级,请参阅第 E.4 节(https://www.postgresql.org/docs/14/release-14-4.html)。
E.1.2. 变化
GSSAPI 传输加密启动失败后,libpq可能会泄漏内存内容 (Jacob Champion)
修改后的服务器或未经身份验证的中间人可以在设置 GSSAPI (Kerberos) 传输加密期间发送非零终止错误消息。然后libpq将复制该字符串,以及应用程序内存中的后续字节,直到下一个零字节,到它的错误报告中。根据调用应用程序对错误报告的处理方式,这可能会导致应用程序内存内容泄露。也有小概率因为读取超出内存末尾而导致崩溃。通过正确地以零终止服务器消息来修复。(CVE-2022-41862)
修复在分区表或继承树上需要更新子表中哪些
GENERATED
列的计算UPDATE
(Amit Langote,Tom Lane)这修复了无法更新
GENERATED
父表中不存在的列,或者具有与父列的生成表达式不同的依赖关系的列。允许
WITH RECURSIVE ... CYCLE
CTE 访问其输出列 (Tom Lane)SET
从 CTE 中对该列的引用将失败,并显示“类型 0 的缓存查找失败”。修复对外部表进行批量插入时挂起插入的处理 (Etsuro Fujita)
在某些情况下,挂起的插入没有足够快地刷新到 FDW,导致逻辑不一致,例如
BEFORE ROW
触发器没有看到它们应该能够看到的行。允许
REPLICA IDENTITY
在(还)无效的索引上设置 (Tom Lane)当pg_dump转储标记为 的分区索引时
REPLICA IDENTITY
,它会生成一个在分区索引被标记为有效之前应用的命令序列REPLICA IDENTITY
,从而导致恢复失败。似乎没有很好的理由禁止按该顺序执行此操作,因此请允许它。在索引生效之前,标记无论如何都不会生效。修复从多行列表
DEFAULT
执行规则中标记的处理(Dean Rasheed)INSERT
VALUES
在某些情况下,
DEFAULT
标记不会被正确的默认值表达式替换,从而导致“无法识别的节点类型”错误。拒绝在存在性检查中使用未定义的变量
jsonpath
(Alexander Korotkov,David G. Johnston)当
jsonpath
匹配运算符为路径模式中的未定义变量抛出错误时,存在运算符会默默地将其视为匹配项。修复
jsonb
下标以处理烘烤后的下标值(Tom Lane,David G. Johnston)使用直接从表中获取的文本值作为
jsonb
下标很可能会失败。提取通常找不到任何匹配的元素。赋值可以使用垃圾键存储值,尽管长度足以导致该问题的键在该领域可能很少见。修复并行散列连接中的边缘情况数据损坏 (Dmitry Astapov)
如果写入临时文件的大元组的最后一块恰好是 32760 字节,它会由于 fencepost 错误而损坏。查询通常稍后会因数据损坏症状而失败。
checkpoint_completion_target
尊重(Bharath Rupireddy)的非默认设置更改后内部状态未更新
checkpoint_completion_target
,可能导致执行检查点 I/O 比预期更快或更慢,特别是如果即时更改该设置。在模式中记录正确的结束时间戳
recovery_target_xid
(Tom Lane)当基于=
recovery_target_xid
的设置结束恢复时,我们在“ recovery stopping before ... transaction ”日志消息中打印了一个不正确的时间戳(始终为 2000-01-01)。recovery_target_inclusive
off
改进一些缓冲文件读取失败的错误报告(Peter Eisentraut)
正确报告短读,给出所需和实际读取的字节数,而不是报告不相关的错误代码。大多数地方已经做到了这一点,但一些最近编写的复制逻辑却没有。
ANALYZE
在扩展查询协议中,避免在我们运行管道后立即提交(Tom Lane)如果没有明确的
BEGIN TRANSACTION
,ANALYZE
会自行提交,这不应该发生在一系列流水线命令中。拒绝长度错误的取消请求包 (Andrey Borodin)
服务器将处理取消请求,即使它的长度字太小。这导致读取超出分配缓冲区的末尾。理论上这可能会导致段错误,但在实践中似乎不太可能发生,因为缓冲区必须非常接近内存末尾。更有可能的结果是关于错误的后端 PID 或取消代码的虚假日志消息。相反,抱怨错误的长度。
在子查询上拉中添加递归和循环防御 (Tom Lane)
人为设计的查询可能导致深度递归和不合理的时间花费在尝试展平子查询上。一个适当的修复似乎对回补丁来说是过度侵入的,但我们至少可以添加堆栈深度检查和中断检查以允许取消查询。
将 Memoize 节点与分区连接或参数化嵌套循环组合时修复规划器问题 (Richard Guo)
这些错误可能会导致在有用的上下文中不使用 Memoize,或者可能导致错误的查询计划。
修复分区连接代码以容忍无法为每个分区生成计划 (Tom Lane)
这可能会导致“无法为给定查询设计查询计划”错误。
get_actual_variable_range
限制由(Simon Riggs)完成的清理工作量在删除索引末尾出现的大量元组后立即运行 Planner 可能会花费大量工作来为这些索引条目设置“ killed ”位。通过在检查 100 个堆页面后放弃此过程来限制在任何一个查询中完成的工作量。所有清理工作最终仍会进行,但不会出现如此大的性能问题。
修复结构的括号显示
AT TIME ZONE
(Tom Lane)这可能会导致规则或视图的转储/恢复失败,其中的参数
AT TIME ZONE
本身就是一个表达式。防止为 SQL 函数中的实用程序语句破坏缓存的解析树(Tom Lane,Daniel Gustafsson)
如果 SQL 语言函数在单个调用查询中多次执行相同的实用程序命令,它可能会崩溃或报告奇怪的错误,例如“无法识别的节点类型”。
确保在执行短语匹配时可以取消全文搜索查询的执行 (Tom Lane)
修复具有不确定排序规则的散列字符串中的内存泄漏 (Jeff Davis)
修复
DROP DATABASE
和逻辑复制worker进程之间的死锁(侯志杰)这是由于在 worker 中创建逻辑复制槽时阻止中断的不明智选择造成的。在版本 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
. 因此,复制消费者的故障可能导致无限大的目录膨胀。逻辑解码中,检测到交易崩溃时通知远程节点(侯志杰)
服务器重启后,我们将重新传输重启前不久发生的事务更改。其中一些交易可能从未完成;当我们意识到我们没有在本地丢弃相关的解码状态时,我们忽略了将其告知订阅者。这导致订户在下次重新启动之前保留无用的流文件。
修复逻辑解码中未初始化内存的使用(Masahiko Sawada)
在某些情况下,恢复逻辑解码可能会尝试重新使用已经释放的 XID 数据,从而导致不可预测的行为。
在散列索引页面拆分操作的 WAL 重放期间避免罕见的“无法获取清理锁”恐慌 (Robert Haas)
在 WAL 重放期间设置其所有可见位时推进堆页面的 LSN (Jeff Davis)
如果不这样做,备用服务器上的页面可能与主服务器上的页面不同,并且违反了关于 LSN 何时更改的其他一些预期。就PostgreSQL本身而言,这似乎只是理论上的危险,但它可能会扰乱第三方工具。
防止不安全地使用关系缓存条目的
rd_smgr
指针 (Amul Sul)rd_smgr
通过将对它的所有使用包装在一个函数中,该函数将在需要时重新计算它,从而删除在一系列操作中保持有效的各种假设。这可以防止在此类系列的中途发生意外缓存刷新时发生错误。修复
int64_div_fast_to_numeric()
以适用于更广泛的输入 (Dean Rasheed)该函数在其第二个参数的某些值上表现不佳。核心PostgreSQL中不存在这样的用法,但它显然对外部模块有危害,所以修复。
修复逻辑中潜在的缓冲区溢出问题
WaitEventSet
(Thomas Munro)如果内部缓冲区的大小与调用者的输出缓冲区的大小不同,基于
epoll
-based 和kqueue
-based 的实现可能会向内核请求太多事件。在已发布的PostgreSQL版本中不知道会发生这种情况,但此错误对外部模块和未来的错误修复是一种危害。在 32 位构建中访问共享内存时避免名义上未定义的行为 (Andres Freund)
clang 的 undefined-behavior sanitizer 抱怨使用了一个没有对齐的指针。这不太可能在非调试构建中引起问题,但出于测试目的值得修复。
修复 BRIN minmax-multi 操作类中的断言失败 (Tomas Vondra)
断言过于严格,所以这个错误在非断言构建中是无害的。
删除 useless-RESULT-RTE 优化逻辑中的错误断言 (Tom Lane)
修复 ACL 检查的缓存查找失败消息中的复制粘贴错误 (Justin Pryzby)
原则上永远不应该达到这些错误。但如果是的话,他们中的一些人报告了错误的对象类型。
在pg_dump中,避免在我们锁定要检查的表之前调用不安全的服务器函数(Tom Lane,Gilles Darold)
pg_dump使用某些服务器功能,如果检查同时删除的表,这些功能可能会失败。通过确保在深入查询表的属性之前获得访问共享锁来避免此类故障,并且我们不会将此类函数应用于我们根本不打算转储的表。
修复psql的
\sf
和\ef
命令以处理具有SQL标准函数体的 SQL 语言函数(Tom Lane)这些命令在使用新式语法时错误地识别了函数体的开始。
修复选项卡完成
ALTER FUNCTION/PROCEDURE/ROUTINE
...SET SCHEMA
(Dean Rasheed)修复
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时,我们可以使用 pragma 来抑制这些警告。
修复pg_waldump以构建在不丢弃未使用的静态内联函数的编译器上 (Tom Lane)
将时区数据文件更新到tzdata版本 2022g,以了解格陵兰和墨西哥的 DST 法律变更,以及加拿大北部、哥伦比亚和新加坡的历史更正。
值得注意的是,新时区 America/Ciudad_Juarez 已从 America/Ojinaga 中分离出来。
文章来源:https://www.postgresql.org/docs/14/release-14-7.html