选择 打开 改范围 完整检索页

PostgreSQL 10.22 发布说明

E.2. 发布版本 10.22 #

发布日期:. 2022-08-11

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

PostgreSQL 社区将于 2022 年 11 月停止发布 10.X 系列的更新。建议用户尽快升级到较新的发布分支。

E.2.1. 迁移到版本 10.22

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

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

E.2.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,导致各种异常行为。 竞态条件窗口通常非常窄,但使用同步复制会使其大幅扩大, 因为等待同步副本的过程发生在该窗口中。

  • 修复在提升引用了 GROUPING 函数的子 SELECT 时出现的 variable not found in subplan target list 规划器错误 (Richard Guo)

  • 防止 pg_stat_get_subscription() 可能返回包含垃圾值的额外行(Kuntal Ghosh)

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

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

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

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

  • 避免在 XMLTABLEJSON_TABLE 结构上附加了过多列别名时崩溃(Álvaro Herrera)

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

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

  • 在反编译视图或规则时,如果 SELECT 输出列的 AS "?column?" 别名子句可能在其他地方被引用,则显示它 (Tom Lane)

    之前,这个自动生成的别名总是被隐藏的;但在某些边界情况下,这样做会导致视图或规则定义无法恢复。

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

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

  • 向事件触发器报告隐式创建的操作符族(Masahiko Sawada)

    如果 CREATE OPERATOR CLASS 导致隐式创建了一个操作符族, 该对象不会被报告给应当捕获此类事件的事件触发器。

  • 修复在备库提升期间有重启点正在运行时的控制文件更新 (Kyotaro Horiguchi)

    之前,当重启点完成时,它可能会错误地更新控制文件中的最后检查点字段, 如果服务器在下一次正常检查点完成之前崩溃,可能导致 PANIC 和重启失败。

  • 防止在逻辑复制大事务期间触发备库的 wal_receiver_timeout(Wang Wei,Amit Kapila)

    如果主库上的一个大事务没有向备库发送数据(可能是因为它修改的表都没有被发布), 备库可能会超时。通过确保在这种情况下定期发送保活消息来修复此问题。

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

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

  • 在逻辑复制中忽略物化视图堆重写所用的临时表(Euler Taveira)

    如果不加干预,FOR ALL TABLES 发布会尝试发布临时表。虽然已有启发式规则来排除这些表,但它未涵盖重写物化视图时创建的内部临时表。这使 REFRESH MATERIALIZED VIEW 期间存在发生 logical replication target relation ... does not exist 失败的风险。

  • 防止在读取无效时区缩写文件时发生打开文件泄漏(Kyotaro Horiguchi)

    这种情况可能导致无害的警告消息。

  • 允许自定义服务器参数具有为 NULL 的简短描述(Steve Chavez)

    之前,虽然扩展可以选择创建这样的设置,但某些代码路径在处理它们时会崩溃。

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

  • 移除 libpq 中不恰当的 SSL 密钥文件所有权检查 (Tom Lane)

    在之前的小版本中,我们将服务器对 SSL 私钥文件的权限检查规则复制到了 libpq 中。 但我们不应该同时复制服务器的文件所有权检查。虽然在正常使用场景下这没有问题, 但对于以 root 身份运行的客户端可能会导致意外的失败,在其他情况下也可能如此。

  • 确保 ecpg 合理地报告服务器连接丢失 (Tom Lane)

    对 libpq 生成的错误结果(例如连接丢失报告)的错误处理,会导致打印 (null) 而非有用的错误消息;在更早的版本中则会导致崩溃。

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

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

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

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

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

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

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

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

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

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

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

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

  • 调整 PL/Perl 测试用例使其能在 Perl 5.36 下工作 (Dagfinn Ilmari Mannsåker)

  • 避免在构建 PostgreSQL 时,当存在多个 OpenLDAP 安装时错误地使用过时的 libldap_r 库(Tom Lane)