发布日期:. 2022-08-11
本次发布包含来自 10.21 的多项修复。 有关 10 主版本新特性的说明,请参见 Section E.24.
PostgreSQL 社区将于 2022 年 11 月停止发布 10.X 系列的更新。建议用户尽快升级到较新的发布分支。
不允许扩展脚本替换不属于该扩展的已有对象 (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)
在某些边界情况下,可能报告误导性的错误。
避免在 XMLTABLE 或 JSON_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)