发布说明

PostgreSQL 14.11

E.12. 发布版本 14.11 #

发布日期:. 2024-02-08

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

E.12.1. 迁移到版本 14.11 #

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

但是,修复了一个可能导致 GIN 索引在并发更新期间损坏的错误。 如果怀疑存在此类损坏,请在安装此更新后重建受影响的索引。

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

E.12.2. 变更 #

  • 加强 REFRESH MATERIALIZED VIEW CONCURRENTLY 中的安全限制(Heikki Linnakangas) § §

    并发刷新命令的一个步骤在弱安全限制下运行。 如果物化视图的所有者能够说服超级用户或其他高权限用户 对该视图执行并发刷新,则视图所有者可以控制以运行 REFRESH 的用户权限执行的代码。 修复了这个问题,使所有用户确定的代码都以视图所有者身份运行, 这是预期的行为。

    此错误的唯一已知利用方式在 PostgreSQL 16.0 及更高版本中不起作用, 因此 v16 在实际中可能不受影响。

    PostgreSQL 项目感谢 Pedro Gallegos 报告此问题。 (CVE-2024-0985)

  • 修复执行 JIT 内联时的内存泄漏(Andres Freund,Daniel Gustafsson) §

    已有多次报告指出后端进程在足够多的 JIT 编译后出现内存不足的情况。 此修复应该可以解决该问题。

  • 在从 LWLock 出队时,避免需要搜索等待进程列表 (Andres Freund) §

    这修复了等待者列表很长时的 O(N^2) 行为。 在某些使用场景中,这会带来显著的吞吐量提升。

  • 避免生成不正确的按分区连接计划(Richard Guo) §

    某些涉及横向引用的不常见情况可能创建不正确的计划。 受影响的查询可能产生错误的结果,或出现诸如 variable not found in subplan target list 之类的奇怪失败,或执行器崩溃。

  • 修复子查询输出表达式在 PlaceHolderVars 中的不正确包装 (Tom Lane) §

    这修复了当子查询位于外连接下方且有一个输出列横向引用外连接范围 之外的内容时的不正确结果。由于外连接的作用, 该输出列可能不会在应为 NULL 时显示为 NULL。

  • 防止在 BEFORE ROW UPDATE 触发器中访问不再固定的缓冲区 (Alexander Lakhin,Tom Lane) §

    如果正在更新的元组刚刚被另一个会话更新并移动到另一个页面, 存在一个狭窄的时间窗口,我们会尝试从新的元组版本获取数据, 但没有对其缓冲区进行固定。原则上这可能导致非更新列中出现垃圾数据。 但在实际中出现问题的可能性似乎很低。

  • 避免在并行哈希连接中请求过大的共享内存区域 (Thomas Munro,Andrei Lepikhov,Alexander Korotkov) § §

    限制值过大,允许在预期的哈希表大小足够大时出现 invalid DSA memory alloc request size 错误。

  • 避免在外键强制触发器要更新的元组未通过额外可见性交叉检查时 heap_update()heap_delete() 中的断言失败 (Alexander Lakhin) §

    此错误在非断言构建中没有影响。

  • 修复 BRIN bloom 操作符类的 false_positive_rate 参数的 过于严格的断言(Alexander Lakhin) §

    此错误在非断言构建中同样没有影响。

  • 修复在复杂继承树上执行 ALTER TABLE ADD COLUMN 时可能的失败(Tender Wang) §

    如果孙子表通过多个中间父表继承新列, 该命令会失败并报告 tuple already updated by self

  • 修复 ALTER TEXT SEARCH CONFIGURATION ... MAPPING 命令中重复令牌名称的问题 (Tender Wang,Michael Paquier) §

  • DROP STATISTICS 时正确锁定关联的表(Tomas Vondra) §

    未能获取锁可能导致当 DROPANALYZE 并发执行时出现 tuple concurrently deleted 错误。

  • 修复 GENERATEDDEFAULT 表达式中的函数波动性检查 (Tom Lane) §

    这些位置可能未能检测到易变函数默认参数表达式的插入, 或者判定一个多态函数是易变的,而实际上对于相关的数据类型它是不可变的。 这可能导致不正确地拒绝或接受 GENERATED 子句, 或在 ALTER TABLE ADD COLUMN 中错误地应用常量默认值优化。

  • 检测新目录缓存条目在展开其字段时变为过时的情况 (Tom Lane) § §

    我们在将目录元组插入目录缓存之前会展开其中的行外字段。 这涉及数据库访问,可能导致目录缓存条目的失效 — 但新条目尚不在缓存中,所以我们会错过通知它应该被失效。 结果是一个竞态条件,其中已经过时的缓存条目可能被创建, 然后无限期地持续存在。这会导致难以预测的异常行为。 通过在展开后重新检查元组的可见性来修复此问题。

  • 修复某些平台上边缘情况的整数溢出检测错误(Dean Rasheed) §

    计算 0 - INT64_MIN 应该导致溢出错误, 在大多数平台上确实如此。然而,既没有整数溢出内置函数也没有 128 位整数的平台无法发现该溢出, 而是返回 INT64_MIN

  • 检测在 timestamp 上加减 interval 时的 儒略日溢出(Tom Lane) §

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

  • 增加 interval_mul()interval_div() 中的更多溢出检查(Dean Rasheed) §

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

  • 使 pg_file_settings 视图检查具有 backendsuperuser-backend 上下文的设置中 未应用值的有效性(Tom Lane) §

    无效值未按预期在视图中标注。这个问题未被发现是因为 这些组中的设置非常少。

  • 在将现有索引匹配到新分区索引时也匹配排序规则 (Peter Eisentraut) §

    之前我们可能接受与分区键对应元素排序规则不同的索引, 可能导致异常行为。

  • 避免在对分区索引执行 REINDEX INDEX 时 子索引被并发删除导致的失败(Fei Changhong) § §

  • 修复清理 GIN 索引内部页面不完整分裂时的锁定不足问题 (Fei Changhong,Heikki Linnakangas) §

    代码尝试使用共享锁而非排他锁来完成此操作。 如果两个进程同时尝试清理,这可能导致索引损坏。

  • 避免在 GIN 索引插入中过早释放缓冲区固定 (Tom Lane) §

    如果索引根页面的分裂与我们自己的插入并发发生, 代码可能报告 buffer NNNN is not owned by resource owner

  • 避免分区 SP-GiST 索引的失败(Tom Lane) §

    尝试使用这类索引可能导致 No such file or directory 错误。

  • 修复大对象的所有权变更报告(Tom Lane) §

    无操作的 ALTER LARGE OBJECT OWNER 命令 (即选择现有所有者的命令)向 PostAlterHook 传递了错误的类 ID,可能会混淆使用该钩子的任何扩展。

  • 防止备库在子事务期间错误处理已死亡的索引元组 (Fei Changhong) §

    startedInRecovery 标志在子事务中 没有被正确设置。这仅影响已死亡索引元组的处理。 它可能允许子事务中的查询忽略它应该返回的索引条目 (如果它们在主库上已经死亡,但对备库事务来说还未死亡), 或过早地将在主库上尚未死亡的索引条目标记为已死亡。 目前尚不清楚后一种情况是否有严重后果,但这不是预期的行为。

  • 修复逻辑复制应用工作进程、其表同步工作进程和尝试修改订阅的 会话进程之间的死锁(Shlok Kyal) §

    死锁循环中的一条边不涉及锁等待,因此死锁未被检测到, 会持续存在直到手动干预。

  • 防止在逻辑解码期间使用错误的快照检查系统目录 (Fei Changhong) §

    如果解码从修改系统目录的事务中途开始, 解码器可能无法识别这一点,导致它未能将该事务视为 正在进行的事务来进行目录查找。 此修复处理的是顶层事务已被标记为包含目录变更, 但其子事务未被标记的情况。

  • 当新客户端在未响应服务器的密码质询就断开连接时, 返回正确的状态码(Liu Lang,Tom Lane) §

    在某些情况下,我们会将此视为可记录的错误,但这不是预期的行为, 并且容易产生日志噪音,因为常见的客户端如 psql 经常这样做。这也可能混淆使用 ClientAuthentication_hook 的扩展。

  • 修复与 OpenSSL 3.2 的不兼容性 (Tristan Partin,Bo Andreson) §

    使用 BIO app_data 字段进行我们的私有存储, 而不是假定可以使用 data 字段。 此错误此前不会造成问题,但在 3.2 中会导致崩溃和双重释放错误。

  • OpenSSL 在错误时不设置 errno 的情况更加谨慎(Tom Lane) §

    如果 errno 未被设置, 则假设所报告失败的原因是读取到 EOF。 这修复了罕见的奇怪错误报告情况,如 could not accept SSL connection: Success

  • 修复当外部数据包装器的 ForeignAsyncRequest 函数失败时的文件描述符泄漏(Heikki Linnakangas) §

  • 将文件相关系统调用的 ENOMEM 错误报告为 ERRCODE_OUT_OF_MEMORY, 而不是 ERRCODE_INTERNAL_ERROR(Alexander Kuzmenkov) §

  • PL/pgSQL 中,支持作为 SQL 标准体的 CREATE FUNCTION/CREATE PROCEDURE SQL 命令(Tom Lane) §

    之前,由于函数体中出现的分号,此类情况会以解析错误失败。

  • 修复 libpq 在管道中处理错误的问题 (Álvaro Herrera) § §

    如果由于查询问题以外的原因(例如连接丢失)返回错误, 管道状态可能会失去同步。这可能导致调用应用程序进入忙等循环。

  • 使 libpqPQsendFlushRequest() 函数在与其他 PQsend 函数相同的规则下刷新客户端输出缓冲区 (Jelte Fennema-Nio) §

    在管道模式下,可能仍然需要额外调用 PQflush(); 但此更改消除了一些不一致性。

  • 避免 libpq 在两个不同线程中 并发初始化 OpenSSL 支持时的竞态条件 (Willi Mann,Michael Paquier) §

  • 修复 GSSAPI 数据传输中与时间相关的失败(Tom Lane) §

    在非阻塞模式下使用 GSSAPI 加密时,libpq 有时会报告 GSSAPI caller failed to retransmit all data needing to be retried

  • pg_dump 中,不要导出扩展成员对象的 RLS 策略或安全标签(Tom Lane,Jacob Champion) § §

    之前,导出中会包含设置这些属性的命令,这实际上是不正确的, 因为它们应该被视为扩展的内部事务。此外, 恢复用户可能没有足够的权限来设置它们, 导出用户也可能没有足够的权限来导出它们 (因为导出 RLS 策略需要获取其表上的锁)。

  • pg_dump 中,如果扩展统计对象的 底层表没有被导出,则不要导出该统计对象 (Rian McGuire,Tom Lane) §

    这与索引等其他依赖对象的行为保持一致。

  • 使 pgbench 脚本以未关闭的管道结束时 报告错误(Anthonin Bonnefoy) §

    之前,如果 \startpipeline 命令缺少匹配的 \endpipelinepgbench 会出现奇怪的行为。这看起来像是脚本错误而不是 pgbench 需要优雅处理的情况, 因此抛出错误。

  • 修复 contrib/intarray 中当包含等于 INT_MAX 的元素的数组被插入到 gist__int_ops 索引时的崩溃 (Alexander Lakhin,Tom Lane) §

  • contrib/pageinspecthash_bitmap_info() 函数应用于分区哈希索引时 报告更好的错误(Alexander Lakhin,Michael Paquier) §

  • contrib/pgstattuplepgstathashindex() 函数应用于分区哈希索引时 报告更好的错误(Alexander Lakhin) §

  • 在 Windows 上,在 pg_ctlpg_regress 中启动子进程时 抑制自动运行选项(Kyotaro Horiguchi) § §

    当通过 cmd.exe 启动子进程时, 传递 /D 标志以防止执行注册表中指定的任何自动运行命令。 这可以避免可能令人意外的副作用。

  • 修复 libxml2 版本 2.12.0 及更高版本的编译失败(Tom Lane) §

  • 修复 Windows 上 WAL_DEBUG 代码的编译失败 (Bharath Rupireddy) §

  • 抑制来自 Python 头文件的编译器警告 (Peter Eisentraut,Tom Lane) §

    我们首选的编译器选项会对最近版本的 Python 头文件中出现的构造 产生警告。使用 gcc 时, 我们可以通过 pragma 来抑制这些警告。

  • 避免使用 LLVM 18 编译时的弃用警告(Thomas Munro) §

  • 更新时区数据文件至 tzdata 2024a 版本,包括格陵兰、哈萨克斯坦和巴勒斯坦的夏令时法律变更, 以及南极站 Casey 和 Vostok 的修正。 同时还有越南、多伦多和密克隆的历史修正。(Tom Lane) §