发布日期:. 2024-02-08
本次发布包含来自 15.5 的多项修复。 有关 15 主版本新特性的说明,请参见 Section E.18。
对于运行 15.X 的用户,不需要执行导出/恢复。
但是,有一个已修复的错误可能导致 GIN 索引在并发更新期间损坏。 如果你怀疑存在此类损坏,请在安装此更新后重建受影响的索引。
此外,如果你从早于 15.5 的版本升级,请参见 Section E.13。
加强 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。
修复窗口函数运行条件的错误处理(Richard Guo) §
这一疏忽可能导致 “WindowFunc not found in subplan target lists” 错误。
当 MERGE 导致跨分区更新时跳过不适当的操作 (Dean Rasheed) §
在对分区表执行 MERGE UPDATE 操作时, 如果由于更改了分区键列而将 UPDATE 转换为 DELETE 和 INSERT, 则跳过触发 AFTER UPDATE ROW 触发器以及其他更新后操作(如 RLS 检查)。 这些操作通常会失败,这就是为什么常规的 UPDATE 在这种情况下不执行它们;MERGE 也不应该执行。
处理跨分区 MERGE 更新中的 BEFORE ROW DELETE 触发器 (Dean Rasheed) §
如果此类触发器试图通过返回 NULL 来阻止更新, MERGE 会遇到错误或断言失败。
防止在 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) §
未能获取锁可能导致在 DROP 与 ANALYZE 并发执行时出现 “tuple concurrently deleted” 错误。
修复 GENERATED 和 DEFAULT 表达式的函数易变性检查 (Tom Lane) §
这些地方可能无法检测到插入了易变函数的默认参数表达式, 或者判定一个多态函数是易变的,而实际上它在相关数据类型上是不可变的。 这可能导致不正确地拒绝或接受 GENERATED 子句, 或者在 ALTER TABLE ADD COLUMN 中错误地应用常量默认值优化。
检测新的系统目录缓存条目在解压其字段时已变为过期的情况 (Tom Lane) § §
我们在将系统目录元组插入目录缓存之前会展开其所有行外字段。 这涉及数据库访问,可能导致目录缓存条目失效 — 但新条目尚未在缓存中, 因此我们会错过注意到它应该被失效的时机。结果是一种竞态条件, 其中一个已经过期的缓存条目可能被创建,然后无限期地持续存在。 这将导致难以预测的错误行为。 修复方式是在解压后重新检查元组的可见性。
修复某些平台上的边界情况整数溢出检测错误(Dean Rasheed) §
计算 0 - INT64_MIN 应该导致溢出错误, 在大多数平台上确实如此。但是,既没有整数溢出内建函数也没有 128 位整数的平台 无法检测到该溢出,而是返回 INT64_MIN。
检测在将 interval 加到或从 timestamp 减去时的儒略日溢出(Tom Lane) §
某些本应导致超出范围错误的情况反而产生了不正确的结果。
为 interval_mul() 和 interval_div() 增加更多溢出检查 (Dean Rasheed) §
某些本应导致超出范围错误的情况反而产生了不正确的结果。
确保在更改 stats_fetch_consistency 后丢弃缓存的统计信息(Shinya Kato) §
在某些代码路径中,可能会返回过期的统计信息。
使 pg_file_settings 视图检查 具有 backend 或 superuser-backend 上下文的设置中 未应用值的有效性(Tom Lane) §
无效值未如预期在视图中标注。 由于这些组中的设置很少,因此该问题一直未被发现。
在将现有索引匹配到新的分区索引时也匹配排序规则 (Peter Eisentraut) §
之前我们可能会接受一个与分区键对应元素具有不同排序规则的索引, 这可能导致错误行为。
修复清理 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,这可能会使使用该钩子的扩展产生混淆。
修复 EXPLAIN (BUFFERS) 中 I/O 计时数据的报告(Michael Paquier) §
标记为 “shared/local” 的数字实际上只涉及共享缓冲区, 因此将该标签更改为 “shared”。
确保 CREATE DATABASE 的持久性(Noah Misch) § §
如果在 CREATE DATABASE 期间或之后不久发生操作系统崩溃, 恢复可能失败,或者后续连接到新数据库可能失败。 如果在该时间窗口内进行了基础备份,在尝试使用该备份时可能观察到类似问题。 症状为数据库目录、PG_VERSION 文件或 pg_filenode.map 文件缺失或为空。
在从备份开始和结束恢复时增加更多 LOG 消息 (Andres Freund) §
此更改在 postmaster 日志中提供了额外信息, 可能有助于诊断恢复问题。
防止备库在子事务期间错误处理死索引元组 (Fei Changhong) §
startedInRecovery 标志在子事务中未被正确设置。 这仅影响死索引元组的处理。它可能允许子事务中的查询忽略它应该返回的索引条目 (如果这些条目在主库上已经是死的,但对备库事务来说还不是死的), 或者过早地将索引条目标记为死的,而它们在主库上还没有死。 目前尚不清楚后一种情况是否有严重后果,但这不是预期的行为。
修复检查记录是否能放入 WAL 解码缓冲区时的整数溢出隐患 (Thomas Munro) §
此错误似乎只是潜在的,除非在 64 位平台上运行 32 位的 PostgreSQL 构建。
修复逻辑复制应用工作进程、其表同步工作进程与试图修改订阅的会话进程之间的死锁 (Shlok Kyal) §
死锁循环的一条边不涉及锁等待,因此死锁未被检测到, 将一直持续直到人工干预。
确保 pgoutput 逻辑复制插件正确传输列默认值 (Nikhil Benesch) §
ALTER TABLE ADD COLUMN 为新列设置常量默认值时 会避免重写现有元组,而是期望读取代码在缺少该列的元组中插入正确的默认值。 如果随后对该表启动了复制,pgoutput 会为此类列传输 NULL 而非正确的默认值, 导致订阅端的复制不正确。
修复对无列表的逻辑复制初始同步失败问题 (Vignesh C) §
此情况会生成格式不正确的 COPY 命令。
防止在逻辑解码期间使用错误的快照检查系统目录 (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) § §
如果由于查询问题以外的原因(例如连接丢失)返回错误, 管道状态可能会失去同步。这可能导致调用应用程序中出现忙等循环。
使 libpq 的 PQsendFlushRequest() 函数按照与其他 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 命令缺少匹配的 \endpipeline,pgbench 会表现异常。这似乎是脚本错误, 而非 pgbench 需要优雅处理的情况, 因此抛出错误。
修复 contrib/intarray 中当数组包含等于 INT_MAX 的元素并被插入到 gist__int_ops 索引时的崩溃问题 (Alexander Lakhin,Tom Lane) §
当 contrib/pageinspect 的 hash_bitmap_info() 函数应用于分区哈希索引时 报告更好的错误信息 (Alexander Lakhin,Michael Paquier) §
当 contrib/pgstattuple 的 pgstathashindex() 函数应用于分区哈希索引时 报告更好的错误信息 (Alexander Lakhin) §
在 Windows 上,在 pg_ctl 和 pg_regress 启动子进程时抑制自动运行选项 (Kyotaro Horiguchi) § §
当通过 cmd.exe 启动子进程时, 传递 /D 标志以防止执行注册表中指定的任何自动运行命令。 这可以避免可能令人意外的副作用。
将 is_valid_ascii() 从 mb/pg_wchar.h 移到 utils/ascii.h(Jubilee Young) §
此更改避免了在 pg_wchar.h 中包含 <simd.h> 的需要, 这给某些第三方代码造成了问题。
修复 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) §
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。