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

PostgreSQL 12.11 发布说明

E.12. 发布版本 12.11 #

发布日期:. 2022-05-12

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

E.12.1. 迁移到版本 12.11

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

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

E.12.2. 变更

  • 将更多操作限制在安全受限操作沙箱内 (Sergey Shinderuk,Noah Misch) § §

    自动清理、CLUSTERCREATE INDEXREINDEXREFRESH MATERIALIZED VIEWpg_amcheck 激活安全受限操作保护机制的时间过晚, 甚至在某些代码路径中根本没有激活。 在数据库中拥有创建非临时对象权限的用户可以定义一个对象, 当自动清理下次处理该对象时,或者当某个超级用户对其运行上述受影响的命令时, 该对象会以超级用户权限执行任意 SQL 代码。

    PostgreSQL 项目感谢 Alexander Lakhin 报告此问题。 (CVE-2022-1552)

  • 停止将查询提供的列别名用于引用普通表的整行变量的列 (Tom Lane) §

    整行变量(例如在 SELECT 列表顶层以外的上下文中的 tbl.*)产生的元组中的列名, 现在始终为关联的命名复合类型的列名(如果有的话)。 之前我们曾尝试使其跟踪已应用于该变量所引用的 FROM 条目的任何列别名。但这在语义上是有问题的, 因为这样变量的输出实际上根本不是它声称的复合类型。 之前处理这种不一致性的尝试产生了糟糕的结果, 甚至包括在磁盘上存储不可读的数据,因此放弃了整个想法。

    在需要重新标记这些列的情况下,一种变通方法是引入一个额外的 子 SELECT 层级,使整行变量引用 子 SELECT 的输出而非普通表。 这样变量一开始就是 record 类型,就不存在这个问题了。

  • 修复 table_to_xmlschema() 及相关函数中 timestamptztimetz 类型的不正确输出(Renan Soares Lopes) §

    这些类型的 xmlschema 输出包含了格式错误的正则表达式。

  • 避免解析器在处理零列的 VALUES 子句时发生核心转储 (Tom Lane) §

  • 修复引用外层查询级别的 GROUPING() 构造的规划器错误 (Richard Guo,Tom Lane) §

  • 修复具有可返回列和不可返回列的索引上的仅索引扫描计划生成 (Tom Lane) §

    之前的代码会尝试读取不可返回列以及可返回列。 这基本上是无害的,因为它实际上并没有对错误的值做任何处理, 但它违反了最近添加的拒绝此类计划的错误检查。

  • 避免在 EvalPlanQual 期间尝试锁定过时元组时访问不再被固定的共享缓冲区 (Tom Lane) §

    代码会在释放其 pin 之后再访问该缓冲区几次。理论上,另一个进程可能在 pin 被释放后 立即回收该缓冲区(或者更可能是尝试对其空闲空间进行碎片整理), 这很可能导致无法找到元组的较新版本。

  • 修复正在执行重新排序的 IndexScan 节点中的查询生命周期内存泄漏 (Aliaksandr Kalenik) §

  • 修复 ALTER FUNCTION 使其支持在同一命令中同时更改 函数的并行属性及其 SET 变量列表(Tom Lane) §

    如果同一命令还更新了函数的 SET 子句, 则并行属性的更改会丢失。

  • 修复尝试修改表的系统列时产生的虚假错误(Tom Lane) §

    系统应该告诉你不能这样做,但有时它会报告 no owned sequence found

  • 修复使用前导键为表达式的索引进行 CLUSTER 时表行的错误排序 (Peter Geoghegan,Thomas Munro) §

    表会使用正确的数据重建,但其顺序与索引顺序关系不大。

  • 修复删除分区索引时可能出现的死锁风险 (Jimmy Yih,Gaurab Dey,Tom Lane) §

    确保以标准顺序(先父后子,先表后索引)获取所需的表锁和索引锁。 之前 DROP INDEX 的代码处理方式不同, 因此可能与按标准顺序获取这些锁的并发查询发生死锁。

  • 修复 DROP TABLESPACE 与检查点之间的竞态条件 (Nathan Bossart) §

    DROP TABLESPACE 强制执行的检查点有时无法从表空间目录中 删除所有失效文件,导致虚假的 tablespace is not empty 错误。

  • 修复与检查点重叠的 TRUNCATE 命令之后崩溃恢复中可能出现的问题 (Kyotaro Horiguchi,Heikki Linnakangas,Robert Haas) § §

    TRUNCATE 必须确保在允许检查点完成之前, 表的磁盘文件已被截断。否则,从该检查点开始的重放可能会在 本应已移除的页面中发现意外数据,从而可能导致重放失败。

  • 修复临时对象清理期间不安全的 toast 数据访问(Andres Freund) §

    服务器进程退出期间的临时对象删除可能会失败并显示 FATAL: cannot fetch toast data without an active snapshot。这通常是无害的,因为下次使用该临时模式时会成功清理。

  • 改进 RegisterSyncRequest 中的等待逻辑(Thomas Munro) §

    如果检查点进程同步请求队列空间不足(这在实际系统中很少见, 但在使用非常小的缓冲池进行测试时很常见),我们会等待其排空。 在等待期间,我们应该将其报告为等待事件以便用户了解情况, 并且还应该监视 postmaster 是否已终止, 否则如果检查点进程已经退出,循环可能永远不会终止。

  • 修复当存在缺失的 WAL 续接记录时,备库提升期间出现的 PANIC: xlog flush request is not satisfied 失败 (Sami Imseih) §

  • 修复热备冲突处理中可能出现的自死锁问题(Andres Freund) § § §

    在不利的时序条件下,WAL 应用进程可能在等待其他进程释放缓冲区锁时卡住。

  • 确保逻辑复制应用工作进程即使在达到 max_sync_workers_per_subscription 限制时也能重启 (Amit Kapila) §

    限制检查的错误编码导致重启的工作进程立即退出, 使得工作进程数量少于应有的数量。

  • 在更新的 WAL 日志中包含未更改的副本标识键列(如果它们以行外方式存储) (Dilip Kumar,Amit Kapila) §

    否则订阅者无法看到这些值,并且将无法复制该更新。

  • 改进逻辑复制订阅者针对不支持的关系种类所给出的错误消息(Tom Lane) §

    v13 及更新版本的服务器支持发布分区表。更早的服务器版本无法订阅这类表,却给出极具误导性的错误消息:table XYZ not found on publisher。现在改为给出更切合问题的消息。

  • 禁止在 PL/Perl 函数编译期间执行 SPI 函数(Tom Lane) §

    可以让 Perl 在 PL/Perl 函数编译期间执行用户定义的代码。 但是,这类代码不应该尝试通过 SPI 调用 SQL 操作。那样做会导致崩溃, 即使不崩溃也是一个安全隐患,因为我们确实不希望在函数验证期间执行代码。 增加了一个检查以给出更友好的错误消息。

  • 使 libpq 接受 root 拥有的 SSL 私钥文件 (David Steele) § §

    此变更使 libpq 对 SSL 密钥文件的安全所有权和权限规则 与服务器自 9.6 版本以来使用的规则同步。即,在当前规则的基础上, 还允许密钥文件由 root 拥有且权限为 rw-r----- 或更严格的情况。 这对于密钥文件的系统级管理很有帮助。

  • 修复 libpqPQisBusy() 函数在连接失败后的行为(Tom Lane) §

    如果检测到写入失败,PQisBusy() 总是返回 true,这是不正确的:我们希望输入处理继续正常进行, 直到读取完服务器可用的所有内容。此错误的实际影响是, 使用 libpq 异步查询 API 的应用程序通常只有在 PQconsumeInput() 返回硬失败时才能检测到连接丢失。 通过此修复,连接丢失通常将通过错误 PGresult 对象报告, 这对大多数应用程序来说是更清晰的行为。

  • 使 pg_ctl 在等待停止/重启/提升操作时 重新检查 postmaster 是否仍然存活(Tom Lane) §

    pg_ctl 会在发送停止或提升信号时 作为副作用验证 postmaster 是否存活,但之后它只是简单地等待磁盘上的状态变化。 如果 postmaster 非正常终止且未删除其 PID 文件或更新控制文件, pg_ctl 将一直等到超时。 现在改为每隔一段时间重新检查 postmaster 进程是否仍然存在。

  • 修复 pg_waldump 中的错误处理 (Kyotaro Horiguchi,Andres Freund) § §

    在尝试读取 WAL 文件以确定 WAL 段大小时, pg_waldump 会为文件过短的情况报告不正确的错误。 此外,此错误消息及相关错误消息中报告的文件名可能是垃圾值。

  • 确保 contrib/pageinspect 函数能够处理全零页面 (Michael Paquier) §

    这是一个合理的边界情况,但该模块大多未做准备。 安排返回 null 或不返回行,视情况而定;这比抛出错误更有用。

  • contrib/pageinspect 中,增加对不正确页面特殊空间内容的防御, 收紧对正确页面大小的检查,并增加一些缺失的索引类型正确性检查 (Michael Paquier,Justin Pryzby,Julien Rouhaud) § § §

    这些变更减少了该模块在处理错误数据时崩溃的可能性。

  • contrib/postgres_fdw 中,在请求远程排序查询之前 验证 ORDER BY 子句是否可以安全传送, 并在必要时包含 USING 子句(Ronan Dunklau) §

    此修复防止了远程服务器可能按与我们意图不同的顺序排序的情况。 虽然有时这只是表面问题,但如果远程数据被用作本地执行的合并连接的输入, 则可能产生完全错误的结果。

  • 更新 JIT 代码以支持 LLVM 14 (Thomas Munro) §

  • 清理在 clang-fsanitize=undefined 检查下出现的各种失败 (Tom Lane,Andres Freund,Zhihong Yu) § § § § §

    这些变更大多只是为了形式上符合 C 和 POSIX 标准的字面要求, 不太可能对生产构建产生任何影响。

  • 修复 PL/Perl 使其能在不支持嵌套在表达式中的语句的 C 编译器上构建 (Tom Lane) §

  • 修复在 Windows 上不使用 MSVC 构建时 pg_dumpall 可能的构建失败(Andres Freund) §

  • 在 Windows 构建中,使用 gendef 代替 pexports 来构建 DEF 文件(Andrew Dunstan) §

    这使构建过程适应了最近的 MSys 工具链。

  • 防止在 MinGW 下构建的程序中对 shell 通配符模式进行额外展开 (Andrew Dunstan) §

    出于某种原因,MinGW 提供的 C 库默认会展开程序命令行参数中的 shell 通配符字符。这令人困惑,尤其是因为在 MSVC 下不会发生这种情况, 因此将其关闭。

  • 将时区数据文件更新为 tzdata 2022a 版本,包含巴勒斯坦的夏令时规则变更,以及智利和乌克兰的历史修正。 (Tom Lane) §