发布说明

PostgreSQL 16.3

E.11. 发布版本 16.3 #

发布日期:. 2024-05-09

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

E.11.1. 迁移到版本 16.3 #

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

但是,在系统视图 pg_stats_extpg_stats_ext_exprs 中发现了一个安全漏洞, 可能允许已认证的数据库用户查看他们不应看到的数据。 如果你的安装受此影响,请按照下面第一个变更日志条目中的步骤进行修复。

此外,如果你从早于 16.2 的版本升级, 请参见 Section E.12

E.11.2. 变更 #

  • 限制 pg_stats_extpg_stats_ext_exprs 条目的可见性, 仅对表所有者可见(Nathan Bossart) §

    这些视图未能隐藏涉及访问用户没有读取权限的列的表达式统计信息。 诸如 most_common_vals 之类的视图列 可能暴露安全相关的数据。此处的潜在交互尚未完全明确, 因此为安全起见,使这些视图中的行仅对关联表的所有者可见。

    PostgreSQL 项目感谢 Lukas Fittl 报告此问题。 (CVE-2024-4317)

    仅此修复本身只会在新的 initdb 初始化的数据库集簇中修复该行为。 如果你希望在现有集簇中应用此更改,需要执行以下步骤:

    1. PostgreSQL 安装的 share 目录(通常位于类似 /usr/share/postgresql/ 的地方)中找到 SQL 脚本 fix-CVE-2024-4317.sql。 确保使用与你的 PostgreSQL 主版本对应的脚本。 如果你没有看到此文件,说明你的版本不受影响 (仅 v14–v16 受影响)或你的小版本太旧而没有包含此修复。

    2. 在集簇的每个数据库中,以超级用户身份运行 fix-CVE-2024-4317.sql 脚本。 在 psql 中如下所示:

      \i /usr/share/postgresql/fix-CVE-2024-4317.sql
      

      (根据实际情况调整文件路径)。任何错误可能表明 你使用了错误版本的脚本。多次运行该脚本不会造成问题。

    3. 不要忘记包括 template0template1 数据库,否则你之后创建的数据库 中仍然存在该漏洞。要修复 template0, 你需要临时允许其接受连接。使用以下命令:

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
      

      然后在修复 template0 之后,使用以下命令撤销:

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
      
  • 修复从多个 VALUESINSERT 到目标列为数组或复合类型上的域时的问题(Tom Lane) §

    此类情况要么会因关于数据类型不匹配的意外报错而失败, 要么会插入意外的类型强制转换,可能导致奇怪的结果。

  • 要求对带有 DO NOTHING 子句的 MERGE 的目标表具有 SELECT 权限 (Álvaro Herrera) §

    在所有实际情况下都需要 SELECT 权限, 但即使查询不读取目标表的任何列也要求该权限。 这避免了 MERGE 不需要任何权限的边界情况, 即使它是一个什么都不做的命令,这似乎也不太合适。

  • 修复 MERGE 中自修改元组的处理 (Dean Rasheed) §

    如果目标行连接到多个源行,按 SQL 标准要求抛出错误。 (之前的代码在涉及并发更新时可能会静默忽略此条件。) 此外,如果目标行已被当前事务中的后续命令更新(由于 BEFORE 触发器或查询中使用的 volatile 函数), 则抛出一个不会引起误解的错误。

  • 修复当表按布尔列分区且查询有布尔 IS NOT 子句时,错误修剪 NULL 分区的问题(David Rowley) §

    NULL 值满足诸如 boolcol IS NOT FALSE 之类的子句,因此修剪掉包含 NULL 的分区 会产生不正确的结果。

  • 使 ALTER FOREIGN TABLE SET SCHEMA 将所拥有的序列 也移到新模式中(Tom Lane) §

    将普通表移动到新模式时,会将该表拥有的序列(以及索引和约束) 一同移动。但对于外部表,这一点被遗漏了。

  • 使 ALTER TABLE ... ADD COLUMN 创建与其所属表 具有相同持久性的标识/序列序列(Peter Eisentraut) §

    CREATE UNLOGGED TABLE 会使任何拥有的序列也是非日志的。 ALTER TABLE 遗漏了这一考虑, 因此添加的标识列会有一个日志序列,这似乎没有意义。

  • 改进 ALTER TABLE ... ALTER COLUMN TYPE 在存在依赖函数或发布时的错误消息(Tom Lane) § §

  • CREATE DATABASE 中,大小写不敏感地识别 策略关键字,以与其他选项保持一致(Tomas Vondra) §

  • 修复 EXPLAIN 对位图堆扫描访问的堆页面计数 (Melanie Plageman) §

    之前,不包含可见元组的堆页面没有被计数;但计算位图索引扫描 返回的所有页面似乎更加一致。

  • 修复 EXPLAINMERGE 中子计划的输出(Dean Rasheed) §

    EXPLAIN 有时无法正确显示引用计划树其他部分 变量的子计划参数。

  • 避免在删除孤立临时表时出现死锁 (Mikhail Zhilin) §

    如果创建临时表的会话在未删除该表的情况下崩溃, autovacuum 最终会尝试删除该孤立表。 但是,被分配到相同临时命名空间的新会话也会执行此操作。 如果临时表有依赖关系(如拥有的序列), 这两次清理尝试之间可能会导致死锁。

  • 修复带有 DISABLE_PAGE_SKIPPING 选项的 VACUUM 中可见性映射状态的更新 (Heikki Linnakangas) §

    由于一个疏忽,此模式导致所有堆页面被标记为脏页, 产生过多的 I/O。此外,不正确设置的可见性映射位不会被清除。

  • 避免在检查每个关系的冻结 XID 值时出现竞争条件 (Noah Misch) §

    VACUUM 从每个关系的值计算每个数据库的冻结 XID 值时, 可能会因另一个 VACUUM 并发更新这些值而产生混淆。

  • 修复并行清理的缓冲区使用报告(Anthonin Bonnefoy) §

    并行工作进程执行的缓冲区访问未被计入 VERBOSE 模式报告的统计信息中。

  • 确保从等价类生成的连接条件在正确的计划层级应用 (Tom Lane) §

    PostgreSQL 16 之前的版本中, 生成的条件可能在外连接下方被评估,而实际上它们应在外连接上方(之后)被评估, 导致不正确的查询结果。所有版本在考虑连接到具有某些 SELECT 分支中连接列为常量输出的 UNION ALL 树时,都存在类似的风险。

  • 修复在规划带有 ORDER BYDISTINCT 选项的聚合函数时 出现的 could not find pathkey item to sort 错误 (David Rowley) §

    这与 16.1 中应用的修复类似,但它解决的是并行计划中的问题。

  • 防止某些窗口函数的可能不正确的优化 (David Rowley) §

    禁用对带有非常量参数的 ntile()count()运行条件优化。 这避免了子查询可能导致的异常行为,通常会产生诸如 WindowFunc not found in subplan target lists 之类的错误。

  • 避免在非移动窗口框架中不必要地使用移动聚合模式 (Vallimaharajan G) §

    当普通聚合被用作窗口函数,且窗口框架起点指定为 UNBOUNDED PRECEDING 时,框架头部不会移动, 因此不需要使用特殊的(且更昂贵的)移动聚合模式。 此优化一直是预期的,但由于编码错误从未被触发。

  • 避免在 GEQO 下规划按分区连接时使用已释放的数据 (Tom Lane) §

    这通常会以崩溃或意外的错误消息结束。

  • 避免在 Memoize 中释放仍在使用的数据 (Tender Wang,Andrei Lepikhov) §

    在生产构建中,此错误通常不会导致任何问题, 因为已释放的数据很可能在使用之前不会被覆盖。

  • 修复 requested statistics kind X is not yet built 错误消息中报告的不正确的统计类型代码 (David Rowley) §

  • catcache list对象使用哈希表代替线性搜索 (Tom Lane) §

    此更改解决了在具有数千个角色的安装中某些操作报告的性能问题。

  • 更谨慎地处理 FROM 中返回 RECORD 类型的函数(Tom Lane) § §

    此类函数调用的输出列必须通过 AS 子句定义列名和数据类型。 如果实际函数输出值与之不匹配,应在运行时抛出错误。 但是,某些代码路径会过早检查实际值,如果它不符合预期, 可能会发出奇怪的错误或遭遇断言失败。

  • 修复 SQL 语言过程的返回行类型混淆问题 (Tom Lane) §

    使用 SQL 语言实现的、返回单个复合类型列的过程会导致断言失败或核心转储。

  • 为某些递归函数添加保护性栈深度检查 (Egor Chindyaskin) §

  • 修复 date_bin() 中的错误舍入和溢出风险 (Moaaz Assali) §

    当源时间戳在原点时间戳之前且两者之差恰好是步幅的整数倍时, 代码错误地仍然减去了步幅。此外,检测了一些会产生不正确结果的 整数溢出情况。

  • 检测在 timestamp 上加减 interval 时的整数溢出(Joseph Koshakow) §

    某些应该导致超出范围错误的情况反而产生了不正确的结果。

  • 避免 pg_get_expr() 中的竞争条件 (Tom Lane) §

    如果参数引用的关系被并发删除,该函数的意图是返回 NULL, 但有时会失败。

  • 修复 XID 状态函数中对旧事务 ID 的检测 (Karina Litskevich) §

    超过 231 个事务之前的事务 ID 可能被错误地识别为近期的, 导致 pg_xact_status()txid_status() 出现异常行为。

  • 确保表的空闲空间映射不会返回超出表末尾的页面 (Ronan Dunklau) §

    因为空闲空间映射没有 WAL 日志记录,在涉及操作系统崩溃、 副本提升或 PITR 恢复的边界情况中,这是可能发生的。 结果会是 could not read block 错误。

  • 修复在 WaitEventSetWait 中等待时 抛出错误导致的文件描述符泄漏(Etsuro Fujita) §

  • 避免在 FDW 实现了异步追加但未为 Append 计划节点配置 任何等待条件时损坏异常栈(Alexander Pyhalov) §

  • 当索引在重建过程中被访问时抛出错误 (Tom Lane) §

    之前这只是一个断言检查,现在将其提升为常规运行时错误。 这将在重建一个试图访问其自身表的用户定义索引表达式时 提供更有针对性的错误消息。

  • 确保 name 列上的仅索引扫描返回完全填充的值 (David Rowley) §

    物理存储在索引中的值是截断的,之前会将指向该值的指针返回给调用者。 这在 valgrind 下测试时引发了报警。理论上可能导致崩溃, 尽管尚未有此类报告。

  • 修复在使复制槽失效时可能导致报告不正确冲突原因的竞争条件 (Bertrand Drouvot) §

  • 修复逻辑复制中决定是否需要表同步操作时的竞争条件 (Vignesh C) §

    在订阅者识别哪些表需要同步时到达的失效事件会被遗忘, 因此任何新需要同步的表可能不会被及时处理。

  • 修复大于 4GB 的 DSM 分配时的崩溃(Heikki Linnakangas) §

  • 如果新服务器会话的客户端套接字无法设置为非阻塞模式则断开连接 (Heikki Linnakangas) §

    以前理论上可以使用阻塞模式的套接字运行;但这很长时间以来都无法完全工作, 因此应在连接开始时直接失败,而不是后续出现异常行为。

  • 修复 OpenSSL 3.0.0 及更高版本中 不充分的错误报告(Heikki Linnakangas,Tom Lane) §

    通过 OpenSSL 传递的系统报告错误以数字错误代码而非可读内容报告。

  • 修复 Windows 上 getaddrinfo() 错误报告的线程安全性(Thomas Munro) §

    多线程的 libpq 客户端程序 在网络查找失败后可能获得不正确或损坏的错误消息。

  • 避免在 libpqecpglib 中并发调用 bindtextdomain()(Tom Lane) § §

    虽然 GNU gettext 的实现 似乎可以处理并发调用,但 Windows 上可用的版本不行。

  • 修复当程序尝试重新定义在预处理器命令行上定义的宏时 ecpg 预处理器中的崩溃(Tom Lane) § § §

  • ecpg 中,避免发出 误报的 unsupported feature will be passed to server 警告(Tom Lane) §

  • 确保 ecpgintoasc() 函数的字符串结果正确以零结尾(Oleg Tselebrovskiy) §

  • initdb-c 选项中, 大小写不敏感地匹配参数名(Tom Lane) §

    服务器对参数名的处理是大小写不敏感的,因此此代码也应如此。 这避免了在生成的 postgresql.conf 文件中 放入冗余条目。

  • psql 中,避免在查询取消后泄漏查询结果 (Tom Lane) §

    这仅在取消使用 \; 分隔符组成的查询字符串中 的非最后一个查询时发生。

  • 修复 pg_dumpall,使角色注释(如果存在) 无论 --no-role-passwords 的设置如何都会被导出 (Daniel Gustafsson,Álvaro Herrera) §

  • pg_basebackuppg_checksumspg_rewind 中跳过名为 .DS_Store 的文件(Daniel Gustafsson) §

    这避免了 macOS 上的问题,因为 Finder 可能会创建此类文件。

  • 修复 PL/pgSQL 对表达式后 单行注释(-- 风格注释)的解析 (Erik Wienhold,Tom Lane) §

    此错误导致在 PL/pgSQL CASE 语句中 WHEN 表达式后跟此类注释时出现解析错误。

  • contrib/amcheck 中,不因短头部与长头部值的差异 报告误匹配错误(Andrey Borodin,Michael Zhilin) § §

    堆元组或索引元组中的变长数据可能有短头部或长头部, 取决于创建时应用的压缩参数。将这些情况视为等效, 而不是在存在差异时报错。

  • 修复 BRIN 输出函数中的错误(Tomas Vondra) § §

    这些输出函数仅用于在 contrib/pageinspect 中 显示索引条目,因此这些错误的实际影响有限。

  • contrib/postgres_fdw 中,避免发出按常量排序的请求 (David Rowley) §

    这可能发生在涉及带有常量输出子查询的 UNION ALL 的情况中。 按常量排序当然是无用的,但它也可能被远程服务器误解, 导致 ORDER BY position N is not in select list 错误。

  • 使 contrib/postgres_fdw 将远程会话的时区设置为 GMT 而非 UTC(Tom Lane) §

    在实际用途中这应该产生相同的结果。 但是,GMT 由服务器中的硬编码代码识别, 而 UTC 需要在时区数据库中查找。 因此,如果远程服务器的时区数据库缺少条目, 旧代码可能会失败。

  • contrib/xml2 中,避免使用在较新版本的 libxml2 中已弃用的库函数(Dmitry Koval) §

  • 修复与 LLVM 18 的不兼容问题(Thomas Munro,Dmitry Dolgov) §

  • 允许 make checkmusl C 库下工作(Thomas Munro,Bruce Momjian,Tom Lane) §