E.6. 发布版本 12.17 #
发布日期:. 2023-11-09
本次发布包含来自 12.16 的多项修复。有关 12 主版本新特性的说明,请参见第 E.23 节。
E.6.1. 迁移到版本 12.17
对于运行 12.X 的用户,不需要执行导出/恢复。
但是,如果使用 GiST 索引,可能适合重建这些索引;请参阅下方变更记录中的第四项。
此外,如果是从早于 12.16 的版本升级,请参见第 E.7 节。
E.6.2. 变更
修复
DISTINCT"any"聚合函数中对未知类型参数的处理(Tom Lane)§此错误导致
text类型的值在运行时被解释为unknown类型的值(即以零终止的字符串)。这可能导致泄露text值之后的服务器内存。PostgreSQL 项目感谢 Jingzhou Fu 报告此问题。(CVE-2023-5868)
检测计算新数组维度时的整数溢出(Tom Lane)§
当向超出当前数组边界的数组下标赋予新元素时,在极端情况下可能发生未检测到的整数溢出。可能利用内存越界写入来执行任意代码,也可能泄露服务器内存。
PostgreSQL 项目感谢 Pedro Gallegos 报告此问题。(CVE-2023-5869)
防止
pg_signal_backend角色向后台工作进程和自动清理进程发送信号(Noah Misch,Jelte Fennema-Nio)§ §文档说明
pg_signal_backend不能向超级用户拥有的进程发送信号。但它能够向这些后台进程发送信号,因为它们公布的角色 OID 为零。现在将此视为表示超级用户所有权。取消这些进程类型之一的安全影响就核心代码而言相当小(我们只会启动另一个),但扩展可能添加更容易受影响的后台工作进程。同时确保在这些进程中正确设置
is_superuser参数。对于该疏忽,目前没有已知的具体安全后果,但对于某些扩展来说可能是重要的。PostgreSQL 项目感谢 Hemanth Sandrana 和 Mahendrakar Srinivasarao 报告此问题。(CVE-2023-5870)
修复 GiST 索引构建中递归页面分裂时的错误行为(Heikki Linnakangas)§
修复了一个页面下行链接位置被错误跟踪的情况,并引入了一些逻辑来允许从此类情况中恢复,而不是静默地执行错误操作。此错误可能导致后续索引搜索返回不正确的结果。建议在安装此更新后重建所有 GiST 索引。
修复具有多个分区键的 hash 分区表的分区步骤生成和运行时分区剪枝(David Rowley)§ §
某些涉及其中一个分区键上
IS NULL条件的情况可能导致崩溃。修复 B-树标记/恢复处理 ScalarArrayOpExpr 子句时的边界情况(Peter Geoghegan)§
将索引扫描恢复到先前标记的位置时,如果扫描恰好前进到 ScalarArrayOpExpr(即
indexcol = ANY(ARRAY[]))子句的匹配末尾,代码可能会遗漏必要的设置步骤。这可能导致漏掉一些应当被获取的行。修复当集合返回函数反复返回零行时的查询内内存泄漏(Tom Lane)§
修复将
cursor_to_xmlschema()应用于非数据返回 Portal 时的崩溃(Boyu Yang)§将
pgrowlocks()应用于分区表时,抛出预期的错误(David Rowley)§之前会抛出一个不切题的错误“only heap AM is supported”。
在各种 SQL 函数中更妥善地处理无效索引(Noah Misch)§
如果将
pgstatindex()、pgstatginindex()、pgstathashindex()或pgstattuple()应用于无效索引,现在会报告错误。如果将brin_desummarize_range()、brin_summarize_new_values()、brin_summarize_range()或gin_clean_pending_list()应用于无效索引,则除了报告一条调试级别的消息外不做任何操作。之前这些函数会尝试处理该索引,并可能根据失败的CREATE INDEX遗留的内容而以奇怪的方式失败。避免在
to_tsvector()处理长输入时过早的内存分配失败(Tom Lane)§修复
tsvectorrecv()中构造的tsvector的过度分配(Denis Erokhin)§如果传入的向量包含位置数据,二进制接收函数会在完成的
tsvector中留下浪费的空间(大约等于位置数据的大小)。在极端情况下,这可能导致对于发出时在长度限制内的向量产生“maximum total lexeme length exceeded”失败。无论如何都可能导致磁盘空间浪费。修复
gtsvector_picksplit()中的不正确编码(Alexander Lakhin)§这可能导致
tsvector列上 GiST 索引的页面分裂决策不佳。修复
COMMIT AND CHAIN/ROLLBACK AND CHAIN在存在未释放的保存点时无法正常工作的问题(Liu Xiang,Tom Lane)§它们将某个先前事务的属性传播到新事务,而不是传播当前事务的属性。
避免在
EXPLAIN中,当标记为由EXPLAIN显示的参数具有 NULL 启动时值时发生崩溃(Xing Guo,Aleksander Alekseev,Tom Lane)§没有内置参数符合此描述,但扩展可以定义此类参数。
确保在删除
ON COMMIT DROP临时表时拥有快照(Tom Lane)§这可以防止当临时表的某些目录条目的字段宽度足够大而需要 toast 时(例如非常复杂的
CHECK条件)可能出现的异常行为。避免在
system()刚刚 fork 的子进程中对关闭信号的不当响应(Nathan Bossart)§ §此修复避免了一个竞争条件:由
system()fork 出来但尚未 exec 目标子程序的子进程可能接收并处理原本发给父服务器进程的信号。这将导致重复的清理操作,后果不佳。处理前端程序中
pg_control的撕裂读取(Thomas Munro)§在某些文件系统上,当服务器并发写入
pg_control时,读取该文件可能不是原子操作。这可以通过无效的 CRC 来检测。现在在报告错误之前会重试几次以查看文件是否变为有效。避免在相关 SQL 函数中对
pg_control的撕裂读取(Thomas Munro)§在读取
pg_control之前获取适当的锁,以确保获得该文件的一致视图。避免计算后端活动字符串数组大小时的整数溢出(Jakub Wartak)§
在 64 位机器上,我们允许
track_activity_query_size的值大到足以在乘以允许的连接数时导致 32 位溢出。然而,实际分配每个后端本地数组的代码对此不够谨慎,导致数组分配不正确。跟踪缓存的
CALL语句的依赖关系,并在需要时重新规划(Tom Lane)§DDL 命令,例如替换已内联到
CALL参数中的函数,可能需要重新规划已被 PL/pgSQL 缓存的CALL。之前这不会发生,导致异常行为或诸如“cache lookup failed”之类的奇怪错误。在检查来自外层查询级别的
RECORD类型 Var 时正确跟踪嵌套深度(Richard Guo)§此疏忽可能导致断言失败、核心转储或“bogus varno”错误。
避免逆解析包含对复合常量字段引用的视图时出现“record type has not been registered”错误(Tom Lane)§
允许从
RECORD类型的ROW()表达式中提取字段(Tom Lane)§知道我们将这些字段命名为
f1、f2等的 SQL 代码,可以使用这些名称从表达式中提取字段。此项修改最初在版本 13 中完成,现在反向移植到更早的分支,以支持一个相关缺陷的测试。修复
RECORD类型缓存管理中的错误处理缺陷(Thomas Munro)§在恰好错误的时刻发生内存不足错误可能留下不一致的状态,导致无限循环。
修复在同一会话中出错后重试逻辑解码时的断言失败(Hou Zhijie)§
在读取 WAL 时将内存不足失败视为致命错误(Michael Paquier)§
之前这会被视为无效数据条件,导致得出已到达 WAL 末尾的错误结论,这是不正确的,并可能导致不一致的 WAL 重放。
修复由于尝试基于伪造的 WAL 记录长度字段分配内存而可能导致的恢复失败(Thomas Munro,Michael Paquier)§ §
确保备库模式的 WAL 恢复在发现无效页面头部时报告错误(Yugo Nagata,Kyotaro Horiguchi)§
避免对在解析分析过程中不接受有意义处理的工具语句进行计划缓存重新验证(Tom Lane)§
除了节省一些开销外,这还可以防止在缓存失效后对于不能设置快照的语句(如
SET TRANSACTION ISOLATION LEVEL)发生失败。在使用期间将按引用传递的
attmissingval值保存在长生命周期的上下文中(Andrew Dunstan)§这避免了当元组槽的生命周期超过用于构造其值的元组描述符时可能出现的悬挂指针使用。
在
ALTER ROLE之后重新计算search_path的有效值(Jeff Davis)§ §这确保在重命名角色后,特殊字符串
$user的含义会被重新确定。修复
GenericXLogFinish中的操作顺序(Jeff Davis)§此代码在将更改的缓冲区标记为脏之前就写入了 WAL,违反了崩溃安全所需的条件。核心代码没有使用此函数,但扩展会使用(例如
contrib/bloom)。移除 PL/Python 异常处理中的不正确断言(Alexander Lakhin)§
修复 pg_restore,使选择性恢复能够同时包含所选表的表级和列级 ACL(Euler Taveira,Tom Lane)§
之前,如果两种类型都存在,只会恢复表级 ACL。
在 pg_upgrade 中增加对
abstime、reltime和tinterval数据类型使用的检查(Álvaro Herrera)§ §这些过时的数据类型已在 PostgreSQL 版本 12 中移除,因此在声称旧数据库可以升级之前,需要确保其中不存在这些类型。
避免在 pg_basebackup 中生成无效的临时槽名(Jelte Fennema)§
这仅在服务器连接通过 pgbouncer 时被观察到。
避免在 Windows 上 pgbench 中出现虚假的“too many client connections”错误(Noah Misch)§
在
contrib/amcheck中,不将被中断的页面删除报告为损坏(Noah Misch)§此修复防止了“the first child of leftmost target page is not leftmost of its level”、“block NNNN is not leftmost”或“left link/right link pair in index XXXX not in agreement”的误报。这些误报出现在 amcheck 在未完成的 B-树索引页面删除之后且
VACUUM清理之前运行时。修复
contrib/btree_gin在interval列上的索引在执行使用<或<=操作符的索引扫描时的失败(Dean Rasheed)§这样的索引扫描无法返回所有应返回的条目。
消除在最新 macOS 上的各种编译时警告(Tom Lane)§ §
Xcode 15(随 macOS Sonoma 发布)改变了链接器的行为方式,在构建 PostgreSQL 时导致许多重复库警告。这些警告是无害的,但很烦人,因此避免两次引用相同的库。同时移除了
-multiply_defined suppress链接器选项的使用,该选项显然长期以来一直没有实际作用,而现在使用它会引发警告。从默认时区缩写列表中移除
PHOT(凤凰群岛时间)(Tom Lane)§此缩写在默认列表中的存在可能导致在最新的 Debian 和 Ubuntu 发行版上出现失败,因为它们不再默认安装底层的 tzdb 条目。由于这是一个为总人口约二十几人的区域编造的缩写,不太可能有人会需要它。如果确有需要,可以通过自定义缩写文件将其恢复。