E.1. 版本 16.2#
**发布日期:**2024-02-08
此版本包含 16.1 中的各种修复。有关主要版本 16 中的新功能的信息,请参见第 E.3 节。
E.1.1. 迁移到版本 16.2#
对于运行 16.X 的用户,不需要转储/还原。
但是,已修复一个错误,该错误可能导致在并发更新期间 GIN 索引损坏。如果您怀疑存在此类损坏,请在安装此更新后重新索引受影响的索引。
此外,如果您要从早于 16.1 的版本升级,请参见第 E.2 节。
E.1.2. 更改#
收紧
REFRESH MATERIALIZED VIEW CONCURRENTLY
中的安全限制(Heikki Linnakangas)并发刷新命令的一步在较弱的安全限制下运行。如果某个物化视图的所有者可以劝说超级用户或其他高权限用户对该视图执行并发刷新,则该视图的所有者可以控制使用运行
REFRESH
的用户的权限执行的代码。修复内容,以便所有用户确定的代码都按预期以视图所有者的身份运行。已知的唯一利用此错误的方法在 PostgreSQL 16.0 及更高版本中不起作用,因此在实践中 v16 可能不受影响。
PostgreSQL 项目感谢 Pedro Gallegos 报告此问题。(CVE-2024-0985)
在执行 JIT 内联时修复内存泄漏(Andres Freund、Daniel Gustafsson)
在足够多的 JIT 编译之后,有许多关于后端进程遭受内存不足情况的报告。此修复应解决该问题。
避免生成不正确的分区连接计划(Richard Guo)
涉及横向引用的某些不常见情况可能会创建不正确的计划。受影响的查询可能会产生错误的答案或奇怪的故障,例如 “子计划目标列表中找不到变量” 或执行器崩溃。
修复 PlaceHolderVars 中子查询输出表达式的错误包装(Tom Lane)
当子查询位于外部连接下方并且具有横向引用外部连接范围之外内容的输出列时,此修复可修复不正确的结果。由于外部连接的操作,输出列可能不会显示为 NULL,而应该显示为 NULL。
修复窗口函数运行条件的错误处理(Richard Guo)
此疏忽可能导致 “子计划目标列表中找不到 WindowFunc” 错误。
修复 Memoize 计划的内部侧唯一性检测(Richard Guo)
此错误可能导致 “缓存条目已完成” 错误。
修复常量折叠字段选择时的 nullingrels 计算(Richard Guo)
未执行此操作会导致错误,例如 “Var 2/2 的 varnullingrels (b) 错误(预期 (b 3))”。
在
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)
限制值太大,允许出现 “无效的 DSA 内存分配请求大小” 错误,而预期的哈希表大小足够大。
修复在尝试扩展临时表时出错时本地缓冲区状态损坏(Tender Wang)
修复在计算具有多个参数的
DISTINCT
聚合时使用错误的元组槽(David Rowley)此错误可能导致错误,例如 “类型为记录的属性 1 类型错误”。
避免在元组因外键强制触发器更新而未通过额外可见性交叉检查时,在
heap_update()
和heap_delete()
中出现断言失败(Alexander Lakhin)此错误在非断言版本中没有影响。
修复在复杂继承树上
ALTER TABLE ADD COLUMN
期间可能出现的故障(Tender Wang)如果孙表将通过多个中间父表继承新列,则命令将失败,并显示 “元组已自行更新”。
修复
ALTER TEXT SEARCH CONFIGURATION ... MAPPING
命令中重复令牌名称的问题(Tender Wang,Michael Paquier)修复具有重复角色名称的
DROP ROLE
(Michael Paquier)以前这会导致 “元组已自行更新” 失败。相反,忽略重复项。
在
DROP STATISTICS
期间正确锁定关联表(Tomas Vondra)如果
DROP
与ANALYZE
并发执行,则无法获取锁可能会导致 “元组并发删除” 错误。修复
GENERATED
和DEFAULT
表达式的函数波动性检查(Tom Lane)这些地方可能无法检测到插入不稳定函数默认参数表达式的行为,或者判定多态函数不稳定,尽管它实际上在目标数据类型上是不可变的。这可能导致不当拒绝或接受
GENERATED
子句,或在ALTER TABLE ADD COLUMN
中错误应用常量默认值优化。检测到在取消吐司其字段时,新的目录缓存条目已失效(Tom Lane)
在将目录元组插入目录缓存之前,我们会展开其中的任何脱机字段。这涉及数据库访问,这可能会导致目录缓存条目失效,但新条目尚未进入缓存,因此我们可能会错过它应该失效的通知。结果是在竞态条件下,可能生成已失效的缓存条目,然后无限期地保留。这会导致难以预测的错误行为。修复方法是在取消吐司后重新检查元组的可见性。
修复某些平台上的边缘情况整数溢出检测错误(Dean Rasheed)
计算
0 - INT64_MIN
应导致溢出错误,并且在大多数平台上确实如此。但是,既没有整数溢出内置函数也没有 128 位整数的平台将无法发现溢出,而是返回INT64_MIN
。在向
timestamp
添加或从timestamp
减去interval
时检测 Julian 日期溢出(Tom Lane)某些应该导致超出范围错误的情况反而产生了不正确的结果。
在
interval_mul()
和interval_div()
中添加更多溢出检查(Dean Rasheed)某些应该导致超出范围错误的情况反而产生了不正确的结果。
允许中断
scram_SaltedPassword()
(Bowen Shi)当
scram_iterations
值较大时,此函数可能需要很长时间才能运行。允许查询取消请求中断它。确保在更改
stats_fetch_consistency
后丢弃缓存的统计信息(Shinya Kato)在某些代码路径中,可能会返回陈旧的统计信息。
使
pg_file_settings
视图检查具有backend
或superuser-backend
上下文的设置的未应用值的有效性(Tom Lane)视图中未按预期记录无效值。由于这些组中的设置非常少,因此逃避了检测。
在将现有索引与新分区索引匹配时也匹配校对(Peter Eisentraut)
以前,我们可以接受与分区键的相应元素具有不同校对的索引,这可能导致行为不当。
如果在分区索引上与
REINDEX INDEX
同时删除子索引,则避免失败(Fei Changhong)修复在清理 GIN 索引内部页面的不完整拆分时锁定不足(Fei Changhong、Heikki Linnakangas)
该代码尝试使用共享锁而不是对缓冲区的独占锁来执行此操作。如果两个进程同时尝试清理,这可能导致索引损坏。
避免在 GIN 索引插入中过早释放缓冲区固定(Tom Lane)
如果索引根页拆分与我们自己的插入同时发生,则代码可能会失败,并显示 “缓冲区 NNNN 不归资源所有者所有”。
避免分区 SP-GiST 索引出现故障(Tom Lane)
尝试使用此类索引可能会导致 “没有此类文件或目录” 错误。
修复大对象的权限测试(Tom Lane)
除非由超级用户运行,否则需要所有权权限的大对象上的操作会失败,并显示 “无法识别的类 ID:2613”。
修复大对象的权限变更报告(Tom Lane)
无操作
ALTER LARGE OBJECT OWNER
命令(即选择现有所有者的命令)将错误的类 ID 传递给PostAlterHook
,这可能会混淆使用该挂钩的任何扩展。修复
EXPLAIN (BUFFERS)
中的 I/O 计时数据报告(Michael Paquier)标记为 “共享/本地” 的数字实际上仅指共享缓冲区,因此将该标签更改为 “共享”。
确保
CREATE DATABASE
的持久性(Noah Misch)如果在
CREATE DATABASE
期间或之后不久发生操作系统崩溃,则恢复可能会失败,或者对新数据库的后续连接可能会失败。如果在此窗口中进行了基本备份,则在尝试使用备份时可能会观察到类似的问题。症状是数据库目录、PG_VERSION
文件或pg_filenode.map
文件丢失或为空。从备份启动和结束恢复时添加更多
LOG
消息(Andres Freund)此更改在 Postmaster 日志中提供了可能对诊断恢复问题有用的附加信息。
防止备用服务器在子事务期间错误地处理已失效的索引元组(Fei Changhong)
未正确为子事务设置
startedInRecovery
标志。这仅影响已失效的索引元组的处理。它可能允许子事务中的查询忽略它应该返回的索引条目(如果它们已经在主服务器上失效,但对备用事务未失效),或过早地将尚未在主服务器上失效的索引条目标记为失效。目前尚不清楚后一种情况是否会造成任何严重后果,但这不是预期行为。修复 walreceiver 进程中的信号处理(Heikki Linnakangas)
恢复更改,使 walreceiver 在等待建立复制连接时对 SIGTERM 无响应。
修复在检查记录是否适合 WAL 解码缓冲区时出现的整数溢出风险(Thomas Munro)
此错误似乎仅在 64 位平台上运行 32 位 PostgreSQL 构建时才会潜伏。
修复逻辑复制应用工作进程、其表同步工作进程和尝试更改订阅的会话进程之间的死锁(Shlok Kyal)
死锁循环的一端不涉及锁等待,因此死锁未被检测到,并且会持续到手动干预。
确保 pgoutput 逻辑复制插件正确传输列默认值(Nikhil Benesch)
ALTER TABLE ADD COLUMN
对于新列使用常量默认值,避免重写现有元组,而是期望读取代码将正确的默认值插入到缺少该列的元组中。如果随后在表上启动复制,pgoutput 将传输 NULL 而不是此类列的正确默认值,从而导致订阅者上的复制不正确。修复没有列的表的逻辑复制初始同步失败(Vignesh C)
此情况生成了格式不正确的
COPY
命令。在使用前重新验证订阅的连接字符串(Vignesh C)
此目的是检测在没有密码的情况下创建订阅(超级用户允许这样做)但随后将订阅所有者更改为非超级用户的情况。
当新客户端断开连接而不响应服务器的密码质询时,返回正确的状态代码(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。这修复了罕见情况下出现的奇怪错误报告,例如 “无法接受 SSL 连接:成功”。修复当外部数据包装器的
ForeignAsyncRequest
函数失败时文件描述符泄漏(Heikki Linnakangas)修复
CREATE SUBSCRIPTION
的连接字符串验证中的小内存泄漏(Jeff Davis)将文件相关系统调用的 ENOMEM 错误报告为
ERRCODE_OUT_OF_MEMORY
,而不是ERRCODE_INTERNAL_ERROR
(Alexander Kuzmenkov)在 PL/pgSQL 中,支持使用 SQL 标准正文的 SQL 命令
CREATE FUNCTION
/CREATE PROCEDURE
(Tom Lane)以前,此类情况由于分号出现在函数体中而导致解析错误,从而失败。
修复 libpq 在管道中处理错误的方式(Álvaro Herrera)
如果由于查询问题以外的原因(例如,如果连接丢失)而返回错误,则管道状态可能会不同步。这可能会导致调用应用程序中的繁忙循环。
使 libpq 的
PQsendFlushRequest()
函数在与其他PQsend
函数相同的规则下刷新客户端输出缓冲区(Jelte Fennema-Nio)在管道模式下,可能仍然需要调用
PQflush()
;但此更改消除了一些不一致之处。避免 libpq 在两个不同的线程中同时初始化 OpenSSL 支持时出现竞争条件(Willi Mann、Michael Paquier)
修复 GSSAPI 数据传输中的时序相关故障(Tom Lane)
在非阻塞模式下使用 GSSAPI 加密时,libpq 有时会失败,并显示 “GSSAPI 调用者未能重新传输所有需要重试的数据”。
更改 initdb,始终取消对
lc_
参数的xxx
postgresql.conf
条目的注释(Kyotaro Horiguchi)initdb 在 v16 之前一直以这种方式工作,现在又重新开始。此更改导致 initdb 的
--no-locale
选项对lc_messages
没有预期效果。在 pg_dump 中,不要为扩展成员对象转储 RLS 策略或安全标签(Tom Lane、Jacob Champion)
以前,命令将包含在转储中以设置这些属性,这实际上是不正确的,因为它们应该被视为扩展的内部事务。此外,还原用户可能没有足够的权限来设置它们,实际上,转储用户可能没有足够的权限来转储它们(因为转储 RLS 策略需要获取其表的锁)。
在 pg_dump 中,如果其基础表未被转储,则不要转储扩展统计对象(Rian McGuire、Tom Lane)
这符合其他依赖对象(如索引)的行为。
在 pg_dump 中的一个代码路径中正确检测内存不足(Daniel Gustafsson)
让 pgbench 脚本以打开管道结束时出错(Anthonin Bonnefoy)
以前,如果
\startpipeline
命令缺少匹配的\endpipeline
,pgbench 的行为会很奇怪。这看起来像是一个脚本错误,而不是 pgbench 需要很好地处理的情况,所以抛出一个错误。在
contrib/bloom
中,修复关于false_positive_rate
的过于严格的断言(Alexander Lakhin)修复
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 时,我们可以使用编译器指示来禁止这些警告。
避免在使用 LLVM 18 编译时出现弃用警告(Thomas Munro)
将时区数据文件更新到 tzdata 2024a 版本,以适应格陵兰、哈萨克斯坦和巴勒斯坦的 DST 法律变更,以及对南极洲凯西和东方站的更正。还包括对越南、多伦多和密克隆的历史更正。