受支持版本: 14

E.18. 发布版本 14.5 #

发布日期:. 2022-08-11

本次发布包含来自 14.4 的多项修复。 有关 14 主版本新特性的说明,请参见 Section E.23

E.18.1. 迁移到版本 14.5 #

对于运行 14.X 的用户,不需要执行导出/恢复。

但是,如果是从早于 14.4 的版本升级,请参见 Section E.19

E.18.2. 变更 #

  • 不允许扩展脚本替换不属于该扩展的已有对象 (Tom Lane) §

    此更改防止扩展脚本在存在不属于该扩展的现有对象时执行 CREATE OR REPLACE。 在相同情况下,也防止执行 CREATE IF NOT EXISTS。 这防止了一种木马攻击形式,即恶意数据库用户可以成为 扩展对象的所有者,然后修改它以危害其他用户对该对象的未来使用。 作为附带的好处,它还降低了意外替换非预期对象的风险。

    PostgreSQL 项目感谢 Sven Klemm 报告此问题。 (CVE-2022-2625)

  • 修复在备库上重放 CREATE DATABASE WAL 记录的问题 (Kyotaro Horiguchi,Asim R Praveen,Paul Guo) § § § §

    备库在重放数据库创建 WAL 记录时可能遇到缺失的表空间目录。 在此补丁之前,备库在这种情况下会恢复失败; 然而,此类目录可能是合法缺失的。 创建表空间(作为普通目录),然后在重放达到一致状态后检查它是否已被删除。

  • 支持原位表空间 (Thomas Munro,Michael Paquier,Álvaro Herrera) § § §

    通常,PostgreSQL 表空间是指向其他文件系统中某个目录的符号链接。 此更改允许表空间直接就是一个普通目录。 虽然这对将表分布到不同文件系统上没有帮助,但对测试来说是一种方便的设置。 此外,为支持 CREATE DATABASE 的重放修复,这一能力是必需的;该修复会将缺失的表空间临时创建为原位表空间。

  • 修复 CREATE INDEX 中的权限检查 (Nathan Bossart,Noah Misch) §

    CVE-2022-1552 的修复导致 CREATE INDEX 在查找操作符类和其他对象时应用表所有者的权限, 而之前使用的是调用用户的权限。这破坏了导出/恢复场景, 因为 pg_dump 在重新授予权限之前 发出 CREATE INDEX

  • 在扩展查询协议中,在 CREATE DATABASE 和其他不能在事务块中运行的命令之后强制立即提交(Tom Lane) §

    如果客户端在此类命令之后没有立即发送 Sync 消息, 而是发送了另一个命令,那么该命令中的任何失败都将导致回滚前面的命令, 通常会在磁盘上留下不一致的状态(如缺失或多余的数据库目录)。 用于防止这种情况的机制在简单查询消息中的多个命令中有效, 但在一系列扩展协议消息中无效。 为了防止不一致而不破坏当前可行的使用场景, 在此类命令之后强制执行隐式提交。

  • 修复检查事务可见性时的竞态条件(Simon Riggs) §

    TransactionIdIsInProgress 可能在目标事务 被认为可见之前就报告 false,导致各种异常行为。 竞态条件窗口通常非常窄,但使用同步复制会使其大幅扩大, 因为等待同步副本的过程发生在该窗口中。

  • 修复在按包含非顶层集合返回函数的表达式排序时 生成错误计划的问题(Richard Guo,Tom Lane) § §

  • 修复扩展统计信息的错误权限检查代码 (Richard Guo) §

    如果用户对一个有扩展统计信息的表仅有部分 SELECT 权限, 某些查询会出现 unrecognized node type 错误。

  • 修复扩展统计信息机制以处理布尔值表达式上的 MCV 类型统计信息 (Tom Lane) §

    统计信息收集工作正常,但 WHERE 中包含此类表达式的查询 会出现 unknown clause type 错误。

  • 避免在 array 变量上有 MCV 类型扩展统计信息时, constant = ANY(array) 子句 导致规划器核心转储(Tom Lane) § §

  • 修复 ALTER TABLE ... ENABLE/DISABLE TRIGGER 对分区表上的触发器正确处理递归 (Álvaro Herrera,Amit Langote) § §

    在某些情况下,由于命令会尝试调整没有该触发器的子分区上的触发器, 会出现 trigger does not exist 错误。

  • 允许在 ANALYZE 计算扩展统计信息时取消操作 (Tom Lane,Justin Pryzby) §

    在统计目标较高的某些场景中,可能会花费数秒在不可取消的排序操作中。

  • 改进 jsonpath 类型的语法错误消息 (Andrew Dunstan) §

  • 确保 pg_stop_backup() 正确清理会话状态 (Fujii Masao) §

    此遗漏可能导致会话后续出现断言失败或崩溃。

  • 修复 trim_array() 以合理处理零维数组参数 (Martin Kalcher) §

  • 修复 FOR [KEY] UPDATE/SHARE 子句中的连接别名匹配 (Dean Rasheed) §

    在某些边界情况下,可能报告误导性的错误。

  • 拒绝 FROM 中列数过多的 ROW() 表达式和函数(Tom Lane) § §

    超过约 1600 列的情况不受支持,且在执行时始终会失败。 然而,一些较早的代码在查询超过 32K 列时可能被驱动到断言失败或崩溃。 增加一个解析时检查以防止此问题。

  • 修复使用 FROM 中返回复合类型的函数的视图的导出问题, 当视图创建后复合类型的列已被删除时(Tom Lane) §

    此疏忽可能导致导出/恢复 或 pg_upgrade 失败, 因为导出的视图会有过多的函数列别名。

  • 不允许在逻辑复制 walsender 中执行嵌套备份操作 (Fujii Masao) §

  • 修复逻辑复制订阅者中的内存泄漏(Hou Zhijie) §

  • 修复当目标表是分区表时逻辑复制的副本标识检查 (Shi Yu,Hou Zhijie) § §

    副本标识列必须为子分区重新识别。

  • 修复在发布者上发生模式更改后逻辑复制订阅者 未能更新缓存模式数据的问题 (Shi Yu,Hou Zhijie) § §

  • 修复 WAL 一致性检查逻辑以正确处理 BRIN_EVACUATE_PAGE 标志(Haiyang Wang) § §

  • 修复共享哈希表管理中的错误断言检查 (Thomas Munro) §

  • 避免在 min_dynamic_shared_memory 设置为非默认值时出现断言失败 (Thomas Munro) §

  • 安排在 SPI_commit() 中的提交时错误后进行清理, 而不是期望调用者来做(Peter Eisentraut,Tom Lane) § §

    正确的清理很复杂,需要使用底层设施,因此已知的调用者 没有一个做对了也不足为奇。这导致当 PL 过程 执行 COMMIT 但发生失败(如延迟约束检查)时出现异常行为。 为了改善情况,将 SPI_commit() 重新定义为 启动一个新事务,使其等价于 SPI_commit_and_chain(), 只是获得默认事务特性而不是保留先前事务的特性。 为了使此更改在 API 层面具有一定透明性, 将 SPI_start_transaction() 重新定义为空操作。 所有已知的 SPI_commit() 调用者都会立即调用 SPI_start_transaction(),因此它们不会注意到任何变化。 类似的说明适用于 SPI_rollback()

    另外修复了 PL/Python,它完全遗漏了对此类错误的任何处理, 导致跳出 Python 解释器。据报告这会导致 Python 3.11 崩溃。 较旧的 Python 版本会泄漏一些内存,但似乎在其他方面没有问题。

  • 改进 libpq 在管道模式下 对空闲状态的处理(Álvaro Herrera,Kyotaro Horiguchi) § §

    这修复了 message type 0x33 arrived from server while idle 警告,以及 PQgetResult() 可能丢失查询结束时的 NULL 结果。

  • 避免 ecpglib 在意外的操作顺序下 出现核心转储(Tom Lane) §

    某些操作如 EXEC SQL PREPARE 在建立任何数据库连接之前调用时会崩溃(而不是按预期报告错误)。

  • ecpglib 中,避免冗余的 newlocale() 调用(Noah Misch) § §

    在首次连接时每个进程分配一次 C 区域设置对象, 而不是每次查询都创建和释放区域设置对象。 这缓解了 AIX 上 libc 的内存泄漏问题, 并且可能在所有平台上提供一些性能改善。

  • psql\watch 命令中,使用 control-C 取消后回显换行符 (Pavel Stehule) §

    这防止 libedit(也可能是 libreadline) 对光标所在列的位置产生混乱。

  • 修复 pg_upgrade 以检测使用 anyarray 的函数的不可升级用法(Justin Pryzby) § §

    版本 14 将一些内置函数改为接受 anycompatiblearray 类型而不是 anyarray。 虽然这大多是透明的,但建立在这些函数之上的 用户自定义聚合和操作符必须以完全匹配的类型声明。 引用旧签名的对象的存在会导致 pg_upgrade 失败, 因此改为在开始升级之前检测并报告此类情况。

  • 修复在 pg_upgrade 使用 --clone 选项时 clone() 失败后可能报告错误的错误条件 (Justin Pryzby) §

  • 修复 contrib/pg_stat_statements 以避免在 32 位平台上处理非常大的查询文本文件时出现问题 (Tom Lane) §

  • contrib/postgres_fdw 中, 当存在 WITH CHECK OPTION 约束时 阻止批量插入(Etsuro Fujita) §

    如果一次插入多行,此类约束无法被正确检查。

  • 修复 contrib/postgres_fdw 以检测异步数据获取查询发送失败的情况(Fujii Masao) §

  • 确保 contrib/postgres_fdw 在发送 regconfig 和其他 reg* 类型的常量时 使用正确的模式限定(Tom Lane) §

  • 在 Linux 上分配动态共享内存时阻塞信号 (Thomas Munro) § § §

    这避免了信号中断 posix_fallocate() 时的问题。

  • 检测 shm_open() 的意外 EEXIST 错误(Thomas Munro) §

    这避免了在 Solaris 上可能发生的崩溃。

  • 避免在 illumos 系统上使用 signalfd()(Thomas Munro) §

    这似乎会触发挂起和内核恐慌,因此在修复可用之前避免使用该函数。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。