E.22. 发布版本 13.2 #
发布日期:. 2021-02-11
本次发布包含来自 13.1 的多项修复。有关 13 主版本新特性的说明,请参见第 E.24 节。
E.22.1. 迁移到版本 13.2
对于运行 13.X 的用户,不需要执行导出/恢复。
但是,请参阅下方变更记录中的第一项,其中说明了可能需要更新已存储的视图。另外,也请参阅第三项和第四项,其中描述了升级后可能适合重建索引的情况。
E.22.2. 变更
修复某些连接查询中未检查逐列
SELECT权限的问题(Tom Lane)§在涉及连接的某些情况下,解析器未能将查询读取的所有列都记录到用于权限检查的列使用位图中。虽然执行器仍会要求某种
SELECT权限才能运行查询,但这意味着,仅对表中一列拥有SELECT权限的用户,仍可以通过特意构造的查询读取该表的所有列。受此问题影响的已存储视图会具有不完整的列使用位图,因此即使更新后,仍无法对该视图正确执行权限检查。在依靠列级权限保障安全的安装环境中,建议对所有用户定义的视图执行
CREATE OR REPLACE,使它们重新解析。PostgreSQL 项目感谢 Sven Klemm 报告此问题。(CVE-2021-20229)
修复违反约束的错误消息中的信息泄漏(Heikki Linnakangas)§
如果
UPDATE命令尝试将某行移动到其他分区,却发现该行违反了新分区上的某个约束,并且该分区中列的物理位置与父表不同,那么错误消息可能泄露用户没有SELECT权限的列的内容。(CVE-2021-3393)修复向 GiST 索引插入时对并发页面分裂的不正确检测(Heikki Linnakangas)§
并发插入可能使条目被放到错误的页面中,导致索引损坏。建议重建所有经历过并发插入的 GiST 索引。
修复
CREATE INDEX CONCURRENTLY,使其等待并发的预备事务(Andrey Borodin)§CREATE INDEX CONCURRENTLY等待所有并发事务完成,以便看到它们插入的行时,也必须出于相同原因等待所有预备事务完成。未能这样做意味着,预备事务插入的行可能被遗漏在新索引之外,导致依赖该索引的查询找不到这些行。对于启用了预备事务(max_prepared_transactions> 0)的安装实例,建议重建所有并发构建的索引,以防其构建时发生过此问题。修复 hash 聚合节点将部分元组溢写到磁盘时可能产生错误查询结果的问题(Tom Lane)§
重新读入元组时,聚合分组值可能被替换为空值,从而导致错误结果。
修复增量排序中的边界情况(Neil Chen)§
如果一个排序批次的最后一个元组恰好是下一组已排序元组中的第一个元组,代码就会处理错误。这可能导致“retrieved too many tuples in a bounded sort”错误消息,或悄然产生错误的排序结果。
避免通过扩展查询协议执行会回滚事务的
CALL或DO语句时发生崩溃(Thomas Munro,Tom Lane)§在 PostgreSQL 13 中,这种情况必然导致空指针解引用。在更早的版本中,此缺陷似乎没有可见症状,但尚不能完全确定它绝不会造成问题。
避免分区表上的
BEFORE UPDATE触发器产生不必要的错误(Álvaro Herrera)§只要
BEFORE UPDATE FOR EACH ROW触发器以任何方式修改了行,就会阻止UPDATE在需要时将该行移动到另一个分区;但这一限制已经没有必要。修复分区剪枝逻辑,使其处理不对称的 hash 分区集合(Tom Lane)§
如果 hash 分区表的分区大小不相等(即模数值不同),或缺少某些余数值对应的分区,规划器的剪枝逻辑就可能错误地认定某些分区无需扫描,导致查询无法找到本应找到的行。
避免将
WHERE CURRENT OF应用于计划中包含 MergeAppend 节点的游标时产生错误结果(Tom Lane)§这种情况不受支持(一般来说,不能保证使用
ORDER BY的游标可以简单地用于更新);但以前的代码没有拒绝它,并可能悄然给出错误匹配。修复将
WHERE CURRENT OF应用于计划中包含自定义扫描节点的游标时的崩溃(David Geier)§修复规划器对求值应因外连接而延迟的占位符的错误处理(Tom Lane)§
这尤其会发生在包含对外连接输出的横向引用的简单子查询中。此错误可能产生格式错误的计划。已知情况会触发“failed to assign all NestLoopParams to plan nodes”错误,但也可能有其他症状。
修复规划器在移除无用 RESULT RTE 时对占位符的处理(Tom Lane)§
这一疏漏可能导致“no relation entry for relid
N”规划器错误。修复规划器对在某个连接层级计算、且仅在同一层级使用的占位符的处理(Tom Lane)§
这一疏漏可能导致“failed to build any
N-way joins”规划器错误。规划 Gather Merge 操作时考虑未排序的子路径(James Coleman)§
可以通过增加显式 Sort 节点来使用此类路径,在某些情况下,这会产生更好的计划。
尝试并行化排序时,不考虑涉及并行受限函数或集合返回函数的
ORDER BY表达式(James Coleman)§ §这些情况无法安全地下推到工作进程,但增量排序特性意外地让我们考虑了它们。
更谨慎地判断索引访问方法是否支持标记/恢复(Andrew Gierth)§
这可以防止在罕见的边界情况下出现关于缺少支持函数的错误。
修复对并行查询所需共享内存量的高估(Takayuki Tsunakawa)§
修复
ALTER DEFAULT PRIVILEGES,使其安全地处理重复参数(Michael Paquier)§同一命令中重复的角色名或模式名可能导致“tuple already updated by self”错误或违反唯一约束。
在
pg_authid变更时清除 ACL 相关缓存(Noah Misch)§此项修改确保与权限相关的判断及时反映
ALTER ROLE ... [NO] INHERIT的结果。修复无法检测当前事务中重写的表上的“snapshot too old”情况的问题(Kyotaro Horiguchi,Noah Misch)§
只有当
wal_level设为minimal,且重写由ALTER TABLE SET TABLESPACE执行时,才存在这一隐患。修复对当前事务中创建或重写的表执行
CREATE PUBLICATION时不应发生的失败(Kyotaro Horiguchi)§只有当
wal_level设为minimal时,才存在这一隐患。防止错误处理有歧义的
CREATE TABLE LIKE子句(Tom Lane)§初步创建新表后,会重新检查
LIKE子句,以处理索引等对象的导入。这次重新检查有可能找到另一个同名表,从而导致意外行为;例如,新表是一个与LIKE目标同名的临时表时就会如此。调整
CREATE TABLE LIKE中的操作顺序,在构建外键约束之前克隆索引(Tom Lane)§这修复了外层
CREATE TABLE中声明的自引用外键约束依赖于来自LIKE子句的索引的情况。禁止对系统目录执行
CREATE STATISTICS(Tomas Vondra)§禁止将继承子表转换为视图(Tom Lane)§
确保为已删除关系分配的磁盘空间在提交时及时释放(Thomas Munro)§
以前,如果删除的关系跨越多个 1GB 段,只有第一个段会立即被截断。其他段只是被解除链接;只要其他后端仍打开着这些文件,内核就不能释放其存储空间。
防止删除被分区关系引用、但未用于任何实际存储的表空间(Álvaro Herrera)§
以前允许这样做,但之后对分区关系的操作会失败。
修复
CLUSTER的进度报告(Matthias van de Meent)§修复
COPY FROM对反斜杠转义的多字节字符的处理(Heikki Linnakangas)§反斜杠后跟多字节字符时未被正确处理。在某些客户端字符编码中,这可能导致多字节字符的一部分被误认为字段分隔符或复制数据结束标记。
在不带
ANALYZE的EXPLAIN中,避免预先分配执行器 hash 表(Alexey Bashtanov)§修复最近在
LISTEN/NOTIFY队列处理中引入的竞争条件(Tom Lane)§刚开始侦听的后端可能尝试读取正在被截断的 SLRU 页面,从而可能导致错误。
允许
jsonb连接操作符处理所有 JSON 数据类型组合(Tom Lane)§我们可以连接两个 JSON 对象或两个 JSON 数组。对于其他情况,将非数组输入包装为单元素数组,再进行数组连接。以前,某些输入组合遵循此规则,而其他组合却会无端报错。
修复解析 BRE 模式正则表达式中的
*量词时使用未初始化值的问题(Tom Lane)§此错误可能使量词表现为非贪婪模式,即表现得像完整正则表达式中的
*?量词。修复 numeric
power()在指数恰好为INT_MIN(-2147483648)时的行为(Dean Rasheed)§ §以前会产生没有有效数字的结果。
修复
substring()函数中的整数溢出情况(Tom Lane,Pavel Stehule)§如果指定的起始索引与长度相加时发生整数溢出,
substring()就会行为异常:要么对本应成功的情况抛出虚假的“negative substring length”错误,要么未能指出长度为负(而在大多数情况下返回整个字符串)。防止因错误检测 SLRU 日志的回卷点而可能造成的数据丢失(Noah Misch)§
回卷点通常位于页面中间,必须将其取整到页边界,但以前没有正确做到这一点。只有当安装实例距离 SLRU 溢出不到一页时,才可能出现问题,而这在正常运行的系统中不太可能发生。如果确实发生,会表现为后续出现“apparent wraparound”或“could not access status of transaction”错误。
修复 WAL 读取逻辑,使其正确处理时间线切换(Kyotaro Horiguchi,Fujii Masao)§ §
以前,如果启用了 WAL 归档,备库可能无法跟随运行在更新时间线上的主库,并出现“requested WAL segment has already been removed”等错误。
修复 WAL 发送进程进程为逻辑解码发送新快照时的内存泄漏(Amit Kapila)§
修复逻辑复制期间通过分区关系的根表发送行变更时,WAL 发送进程进程中的关系缓存泄漏(Amit Langote,Mark Zhao)§
修复 WAL 发送进程,使其在终止复制后接受其他命令(Jeff Davis)§
确保检测热备后端与启动(WAL 应用)进程之间的死锁(Fujii Masao)§
启动进程没有运行死锁检测代码,因此当启动进程最后加入循环等待时,死锁可能永远不会被识别。
修复删除引用 HOT 链的索引条目时可能无法检测恢复冲突的问题(Peter Geoghegan)§ §
代码未能遍历 HOT 链,因此可能计算出过旧的 XID 视界,导致热备中的冲突处理不正确。此缺陷的实际影响有限;在大多数情况下,附近的其他操作仍会找到正确的 XID 视界。
确保
krb_server_keyfile的非空值始终覆盖服务器环境中KRB5_KTNAME的任何设置(Tom Lane)§以前,哪个设置优先取决于客户端是否请求 GSS 加密。
在连接无法匹配
pg_hba.conf条目的服务器日志消息中,包含 GSS 加密是否已启用的详细信息(Kyotaro Horiguchi,Tom Lane)§如果存在
hostgssenc或hostnogssenc条目,这些信息就与问题有关。修复服务器 GSS 加密支持中的多种问题(Tom Lane)§
移除 GSS 加密连接只能使用 GSS 认证这一无意义的限制。在连接授权日志消息中添加 GSS 加密信息。计算所需共享内存大小时,计入与 GSS 相关的空间(这一遗漏可能在
max_connections设置很高时引发问题)。避免在报告不可恢复的 GSS 加密错误时可能出现的无限递归。确保 postmaster 开始“smart”或“fast”关闭流程时,清理尚未处理的后台工作进程请求(Tom Lane)§
以前存在一种竞争条件:如果子进程恰好在关闭前请求了后台工作进程,就可能无限期等待,导致关闭无法完成。
修复解析
recovery_target_xid值时的可移植性问题(Michael Paquier)§目标 XID 可能有 64 位宽,但以前使用
strtoul()解析,导致在long为 32 位的平台(例如 Windows)上行为异常。避免在独立后端中尝试使用并行索引构建(Yulin Pei)§
允许索引访问方法支持内含列,而不必支持多个键列(Tom Lane)§
进行基础备份时,如果不需要备份清单,则避免执行任何 SHA256 代码(Michael Paquier)§
使用以 FIPS 模式运行的 OpenSSL 时,SHA256 hash 会被拒绝,从而导致错误。此项修改使这类平台上也能进行基础备份,只需指定
--no-manifest。避免对具有非严格反序列化函数的聚合进行并行聚合时发生断言失败(Andrew Gierth)§
核心 PostgreSQL 中不存在此类聚合函数,但 PostGIS 等某些扩展提供了此类函数。不过,在未启用断言的构建中,这一错误是无害的。
避免
pg_get_functiondef()检查带有TRANSFORM选项的函数时发生断言失败(Tom Lane)§修复 PL/pgSQL
CALL语句中错误的数据结构分配(Tom Lane)§ §PL/pgSQL 过程中的
CALL调用另一个具有 OUT 参数的过程时,如果被调用过程执行了COMMIT或ROLLBACK,就会失败。在 libpq 中,不要在尝试 GSS 加密之后跳过 SSL 尝试(Tom Lane)§
如果已成功建立 GSS 加密连接,但随后在认证期间失败,我们会回退到未加密连接,而非接着尝试 SSL 加密连接。这可能导致意外的连接失败,或在期望加密连接时却悄然获得未加密连接。幸运的是,只有客户端和服务器都持有同一 Kerberos 基础设施中的有效票据时,GSS 加密才能成功。在要求使用 SSL 加密的环境中,这种情况似乎不太可能成立。
使 libpq 的
PQconndefaults()函数报告正确的channel_binding默认值(Daniele Varrazzo)§在 psql 中,重新允许在
\connect命令的connection_string参数中包含密码(Tom Lane)§这以前是可以的,但最近的一项缺陷修复导致密码被忽略(从而提示用户输入密码)。
在 psql 的
\d命令中,不要截断列默认值的显示(Tom Lane)§以前,它们会被任意截断为 128 个字符。
修复 psql 的
\help命令中的多种缺陷(Kyotaro Horiguchi,Tom Lane)§\help带有两个参数词时,无法仅使用第一个词找到命令说明,例如\help reset all本应显示RESET的帮助,但却没有。另外,\help经常未在应该调用分页器时调用它,也会泄漏内存。修复 pg_dump 对继承生成列的转储(Peter Eisentraut)§
以前的行为会在恢复期间产生无害的错误。
在 pg_dump 中,确保恢复脚本以发布所有者的身份运行
ALTER PUBLICATION ADD TABLE命令,并同样以分区索引所有者的身份运行ALTER INDEX ATTACH PARTITION命令(Tom Lane)§ §以前,这些命令由启动恢复脚本的角色运行;这通常能够正常工作,但在边界情况下,该角色可能没有足够权限。
修复 pg_dump,使其处理扩展初始权限中的
WITH GRANT OPTION(Noah Misch)§如果扩展脚本创建一个对象,并授予其带转授权选项的权限,而用户之后撤销了这些权限,pg_dump 就会生成不正确的 SQL 来重现这种情况。(目前,即使有扩展这样做,数量也很少。)
在 pg_rewind 中,确保回退备库时计入所有 WAL(Ian Barwick,Heikki Linnakangas)§ § §
在 pgbench 中,禁止变量名以数字开头(Fabien Coelho)§
这可以避免尝试在时间戳字面值中替换变量,因为时间戳可能包含
12:34这样的字符串。在某些客户端程序的连接失败错误消息中报告正确的数据库名称(Álvaro Herrera)§
如果数据库名称采用默认值,而非通过命令行给出,pg_dumpall、pgbench、oid2name 和 vacuumlo 就会在连接失败后产生误导性的错误消息。
修复
contrib/auto_explain中的内存泄漏(Japin Li)§生成
EXPLAIN输出时消耗的内存,直到当前事务结束(对于顶层语句)或外层语句结束(对于嵌套语句)才会释放。启用log_nested_statements时,这尤其容易造成问题。在
contrib/postgres_fdw中,避免删除用户映射或外部服务器对象时泄漏已打开的远程服务器连接(Bharath Rupireddy)§依赖已删除用户映射或外部服务器的打开连接已无法再被引用,但以前仍会将它们保留到本地会话结束。
修复
contrib/postgres_fdw中错误的断言(Etsuro Fujita)§在
contrib/pgcrypto中,检查 OpenSSL EVP 函数返回的错误(Michael Paquier)§我们并不真正预期这里会出现错误,但此项修改消除了静态分析工具的警告。
使
contrib/pg_prewarm在预热完成前数据库集簇被关闭时更加稳健(Tom Lane)§以前,autoprewarm 会只用截至当时已成功加载的块号重写其状态文件,因而可能在很大程度上使下次启动时的预热功能失效。现在改为在初始加载过程完成前,禁止更新状态文件。
在
contrib/pg_trgm的 GiST 索引支持中,避免恰好对两个索引项调用 picksplit 这一罕见情况下的崩溃(Andrew Gierth,Alexander Korotkov)§修复
contrib/pg_prewarm和contrib/postgres_fdw中错误的超时计算(Alexey Kondratov,Tom Lane)§contrib/pg_prewarm的 autoprewarm 父进程中的主循环,将所需睡眠时间低估为实际值的千分之一,导致 CPU 消耗远高于预期。等待远程服务器返回结果时,contrib/postgres_fdw则将所需超时时间高估为实际值的 1000 倍(不过,60 秒的上限缓解了这一错误)。这两个错误都源于将秒和微秒错误地转换为毫秒。引入新的 API
TimestampDifferenceMilliseconds(),使今后更容易正确完成这一转换。改进 configure 在 macOS 上选择
PG_SYSROOT的启发式方法(Tom Lane)§ §当 Xcode 比底层操作系统更新时,新方法更有可能产生理想结果。选择与操作系统版本不匹配的 sysroot,可能生成无法工作的可执行文件。
在 macOS 上构建时,在链接步骤和编译步骤中都指定
-isysroot(James Hilliard)§这同样可以改善 Xcode 与操作系统版本不同步时的结果。
修复 JIT 表达式编译中对布尔变量引用的潜在错误处理(Andres Freund)§
尚未看到可归因于此问题的实际报告,但它似乎很可能在某些架构上造成问题。
修复使用 ICU 68 及更新版本时的编译失败(Tom Lane)§
避免在创建分区索引期间,以 NULL 源指针和零计数调用
memcpy()(Álvaro Herrera)§虽然尚未发现此类调用本身会造成问题,但某些编译器假定
memcpy()的参数永不为 NULL,这可能导致对附近代码进行错误的优化。将时区数据文件更新到 tzdata 2021a 版,以反映俄罗斯(Volgograd 时区)和南苏丹的夏令时法规变更,并修正澳大利亚、巴哈马、伯利兹、百慕大、加纳、以色列、肯尼亚、尼日利亚、巴勒斯坦、塞舌尔和瓦努阿图的历史数据。(Tom Lane)§
特别是,Australia/Currie 时区经过修正后,已与 Australia/Hobart 完全相同。