受支持版本: 15

E.11. 发布版本 15.7 #

发布日期:. 2024-05-09

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

E.11.1. 迁移到版本 15.7 #

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

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

此外,如果你从早于 15.6 的版本升级,请参见 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 触发器或查询中使用的易变函数), 则抛出一个不会产生误导的错误。

  • 修复当表按布尔列分区且查询包含布尔 IS NOT 子句时对 NULL 分区的错误裁剪(David Rowley) §

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

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

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

  • 使 ALTER TABLE ... ADD COLUMN 创建的 标识/serial 序列与其所属表具有相同的持久性(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 最终会尝试移除孤立的表。但是,被分配了相同临时命名空间的 新会话也会执行此操作。如果临时表有依赖项(如所拥有的序列), 则这两个清理尝试之间可能会发生死锁。

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

    VACUUM 从每个关系的值计算每个数据库的冻结 XID 值时, 可能会被另一个 VACUUM 并发更新这些值所干扰。

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

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

  • 禁止在使用该表的外部 SQL 命令内将表转换为视图 (Tom Lane) §

    这避免了可能的崩溃。

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

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

  • 防止某些窗口函数的潜在不正确优化 (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) §

  • 更加小心地处理 FROM 中返回 RECORD 的函数(Tom Lane) § §

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

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

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

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

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

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

  • 检测将 interval 加到 timestamp 或从 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 下测试时引起了投诉。理论上可能导致崩溃, 但尚未有报告。

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

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

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

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

    理论上我们曾经可以使用阻塞模式的套接字进行操作; 但这已经很久不能完全正常工作了,因此在连接开始时直接失败, 而不是在之后出现异常行为。

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

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

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

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

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

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

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

  • 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 check 在使用 musl C 库时正常工作 (Thomas Munro,Bruce Momjian,Tom Lane) §

提交更正

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