发布日期:. 2021-02-11
本次发布包含来自 11.10 的多项修复。 有关 11 主版本新特性的说明,请参见 Section E.23.
对于运行 11.X 的用户,不需要执行导出/恢复。
但是,请参阅下方变更记录中的第二项,其中描述了升级后可能适合重建索引的情况。
此外,如果是从早于 11.6 的版本升级,请参见 Section E.17。
修复违反约束的错误消息中的信息泄漏(Heikki Linnakangas)
如果 UPDATE 命令尝试将某行移动到其他分区,却发现该行违反了新分区上的某个约束,并且该分区中列的物理位置与父表不同,那么错误消息可能泄露用户没有 SELECT 权限的列的内容。(CVE-2021-3393)
修复 CREATE INDEX CONCURRENTLY,使其等待并发的预备事务(Andrey Borodin)
CREATE INDEX CONCURRENTLY 等待所有并发事务完成,以便看到它们插入的行时,也必须出于相同原因等待所有预备事务完成。未能这样做意味着,预备事务插入的行可能被遗漏在新索引之外,导致依赖该索引的查询找不到这些行。对于启用了预备事务(max_prepared_transactions > 0)的安装实例,建议重建所有并发构建的索引,以防其构建时发生过此问题。
避免通过扩展查询协议执行会回滚事务的 CALL 或 DO 语句时发生崩溃(Thomas Munro,Tom Lane)
在 PostgreSQL 13 中,这种情况必然导致空指针解引用。在更早的版本中,此缺陷似乎没有可见症状,但尚不能完全确定它绝不会造成问题。
修复分区剪枝逻辑,使其处理不对称的哈希分区集合(Tom Lane)
如果哈希分区表的分区大小不相等(即模数值不同),或缺少某些余数值对应的分区,规划器的剪枝逻辑就可能错误地认定某些分区无需扫描,导致查询无法找到本应找到的行。
避免将 WHERE CURRENT OF 应用于计划中包含 MergeAppend 节点的游标时产生错误结果(Tom Lane)
这种情况不受支持(一般来说,不能保证使用 ORDER BY 的游标可以简单地用于更新);但以前的代码没有拒绝它,并可能悄然给出错误匹配。
修复将 WHERE CURRENT OF 应用于计划中包含自定义扫描节点的游标时的崩溃(David Geier)
修复规划器对在某个连接层级计算、且仅在同一层级使用的占位符的处理(Tom Lane)
这一疏漏可能导致 “failed to build any N-way joins” 规划器错误。
更谨慎地判断索引访问方法是否支持标记/恢复(Andrew Gierth)
这可以防止在罕见的边界情况下出现关于缺少支持函数的错误。
调整设置,降低大量使用并行查询时耗尽 DSM 槽的可能性(Thomas Munro)
修复对并行查询所需共享内存量的高估(Takayuki Tsunakawa)
修复 ALTER DEFAULT PRIVILEGES,使其安全地处理重复参数(Michael Paquier)
同一命令中重复的角色名或模式名可能导致 “tuple already updated by self” 错误或违反唯一约束。
在 pg_authid 变更时清除 ACL 相关缓存(Noah Misch)
此项修改确保与权限相关的判断及时反映 ALTER ROLE ... [NO] INHERIT 的结果。
防止错误处理有歧义的 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)
以前允许这样做,但之后对分区关系的操作会失败。
修复 COPY FROM 对反斜杠转义的多字节字符的处理(Heikki Linnakangas)
反斜杠后跟多字节字符时未被正确处理。在某些客户端字符编码中,这可能导致多字节字符的一部分被误认为字段分隔符或复制数据结束标记。
在不带 ANALYZE 的 EXPLAIN 中,避免预先分配执行器哈希表(Alexey Bashtanov)
修复最近在 LISTEN/NOTIFY 队列处理中引入的竞争条件(Tom Lane)
刚开始侦听的后端可能尝试读取正在被截断的 SLRU 页面,从而可能导致错误。
队列尾指针可能被设为一个与任何后端的队列位置都不相等的值,导致队列截断逻辑实际上失效。继续使用 NOTIFY 随后会产生队列填满警告,最终无法再发送任何通知,直到服务器重启。
允许 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 发送进程 进程为逻辑解码发送新快照时的内存泄漏(Amit Kapila)
修复 WAL 发送进程,使其在终止复制后接受其他命令(Jeff Davis)
确保检测热后备后端与启动(WAL 应用)进程之间的死锁(Fujii Masao)
启动进程没有运行死锁检测代码,因此当启动进程最后加入循环等待时,死锁可能永远不会被识别。
确保 postmaster 开始 “smart” 或 “fast” 关闭流程时,清理尚未处理的后台工作进程请求(Tom Lane)
以前存在一种竞争条件:如果子进程恰好在关闭前请求了后台工作进程,就可能无限期等待,导致关闭无法完成。
修复解析 recovery_target_xid 值时的可移植性问题(Michael Paquier)
目标 XID 可能有 64 位宽,但以前使用 strtoul() 解析,导致在 long 为 32 位的平台(例如 Windows)上行为异常。
避免在独立后端中尝试使用并行索引构建(Yulin Pei)
允许索引访问方法支持包含列,而不必支持多个键列(Tom Lane)
避免对具有非严格反序列化函数的聚合进行并行聚合时发生断言失败(Andrew Gierth)
核心 PostgreSQL 中不存在此类聚合函数,但 PostGIS 等某些扩展提供了此类函数。不过,在未启用断言的构建中,这一错误是无害的。
避免 pg_get_functiondef() 检查带有 TRANSFORM 选项的函数时发生断言失败(Tom Lane)
修复 PL/pgSQL CALL 语句中错误的数据结构分配(Tom Lane)
PL/pgSQL 过程中的 CALL 调用另一个具有 OUT 参数的过程时,如果被调用过程执行了 COMMIT 或 ROLLBACK,就会失败。
在 psql 中,重新允许在 \connect 命令的 connection_string 参数中包含密码(Tom Lane)
这以前是可以的,但最近的一项缺陷修复导致密码被忽略(从而提示用户输入密码)。
修复 psql 的 \help 命令中的多种缺陷(Kyotaro Horiguchi,Tom Lane)
\help 带有两个参数词时,无法仅使用第一个词找到命令说明,例如 \help reset all 本应显示 RESET 的帮助,但却没有。另外,\help 经常未在应该调用分页器时调用它,也会泄漏内存。
在 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/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 编译,使其兼容 LLVM 11 和 LLVM 12(Andres Freund)
修复 JIT 表达式编译中对布尔变量引用的潜在错误处理(Andres Freund)
尚未看到可归因于此问题的实际报告,但它似乎很可能在某些架构上造成问题。
修复使用 ICU 68 及更新版本时的编译失败(Tom Lane)
避免在创建分区索引期间,以 NULL 源指针和零计数调用 memcpy()(Álvaro Herrera)
虽然尚未发现此类调用本身会造成问题,但某些编译器假定 memcpy() 的参数永不为 NULL,这可能导致对附近代码进行错误的优化。
将时区数据文件更新到 tzdata 2021a 版,以反映俄罗斯(伏尔加格勒时区)和南苏丹的夏令时法规变更,并修正澳大利亚、巴哈马、伯利兹、百慕大、加纳、以色列、肯尼亚、尼日利亚、巴勒斯坦、塞舌尔和瓦努阿图的历史数据。
特别是,Australia/Currie 时区经过修正后,已与 Australia/Hobart 完全相同。