发布说明

PostgreSQL 14.12

E.11. 发布版本 14.12 #

发布日期:. 2024-05-09

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

E.11.1. 迁移到版本 14.12 #

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

但是,在系统视图 pg_stats_extpg_stats_ext_exprs 中发现了一个安全漏洞, 可能允许经过身份验证的数据库用户查看他们不应该看到的数据。 如果该问题会影响当前安装,请按照下面第一个变更日志条目中的步骤进行修复。

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

E.11.2. 变更 #

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

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

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

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

    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) §

    这类情况会以数据类型不匹配的意外错误失败, 或者插入可能导致奇怪结果的意外强制转换。

  • 修复当表按布尔列分区且查询含有布尔 IS NOT 子句时,对 NULL 分区的不正确修剪(David Rowley) §

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

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

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

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

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

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

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

    如果创建临时表的会话在未移除该表的情况下崩溃, autovacuum 最终会尝试移除该孤立的表。然而,被分配了相同临时命名空间的 新传入会话也会尝试这样做。如果临时表有依赖项(如拥有的序列), 这两个清理尝试之间可能会产生死锁。

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

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

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

    这可以避免可能的崩溃。

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

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

  • 避免在非移动窗口帧中不必要地使用移动聚合模式 (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) §

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

  • 检测在 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 下测试时引发了告警。理论上可能导致崩溃, 但尚未收到相关报告。

  • 修复大于 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) §

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

  • 修复 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) §