E.5. 发布版本 12.18 #
发布日期:. 2024-02-08
本次发布包含来自 12.17 的多项修复。有关 12 主版本新特性的说明,请参见第 E.23 节。
PostgreSQL 社区将于 2024 年 11 月停止发布 12.X 系列的更新。建议用户尽快升级到较新的发布分支。
E.5.1. 迁移到版本 12.18
对于运行 12.X 的用户,不需要执行导出/恢复。
但是,修复了一个可能导致 GIN 索引在并发更新期间损坏的错误。如果怀疑存在此类损坏,请在安装此更新后重建受影响的索引。
此外,如果是从早于 12.17 的版本升级,请参见第 E.6 节。
E.5.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。
避免在并行哈希连接中请求过大的共享内存区域(Thomas Munro,Andrei Lepikhov,Alexander Korotkov)§ §
限制值过大,允许在预期的 hash 表大小足够大时出现“invalid DSA memory alloc request size”错误。
避免在外键强制触发器要更新的元组未通过额外可见性交叉检查时
heap_update()和heap_delete()中的断言失败(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。检测在
timestamp上加减interval时的儒略日溢出(Tom Lane)§某些应该导致超出范围错误的情况反而产生了不正确的结果。
增加
interval_mul()和interval_div()中的更多溢出检查(Dean Rasheed)§某些应该导致超出范围错误的情况反而产生了不正确的结果。
使
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,可能会混淆使用该钩子的任何扩展。防止备库在子事务期间错误处理已死亡的索引元组(Fei Changhong)§
startedInRecovery标志在子事务中没有被正确设置。这仅影响已死亡索引元组的处理。它可能允许子事务中的查询忽略它应该返回的索引条目(如果它们在主库上已经死亡,但对备库事务来说还未死亡),或过早地将在主库上尚未死亡的索引条目标记为已死亡。目前尚不清楚后一种情况是否有严重后果,但这不是预期的行为。修复逻辑复制应用工作进程、其表同步工作进程和尝试修改订阅的会话进程之间的死锁(Shlok Kyal)§
死锁循环中的一条边不涉及锁等待,因此死锁未被检测到,会持续存在直到手动干预。
当新客户端在未响应服务器的密码质询就断开连接时,返回正确的状态码(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”。将文件相关系统调用的 ENOMEM 错误报告为
ERRCODE_OUT_OF_MEMORY,而不是ERRCODE_INTERNAL_ERROR(Alexander Kuzmenkov)§避免 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)§
这与索引等其他依赖对象的行为保持一致。
修复
contrib/intarray中当包含等于INT_MAX的元素的数组被插入到gist__int_ops索引时的崩溃(Alexander Lakhin,Tom Lane)§当
contrib/pageinspect的hash_bitmap_info()函数应用于分区 hash 索引时报告更好的错误(Alexander Lakhin,Michael Paquier)§当
contrib/pgstattuple的pgstathashindex()函数应用于分区 hash 索引时报告更好的错误(Alexander Lakhin)§在 Windows 上,在 pg_ctl 和 pg_regress 中启动子进程时抑制自动运行选项(Kyotaro Horiguchi)§ §
当通过
cmd.exe启动子进程时,传递/D标志以防止执行注册表中指定的任何自动运行命令。这可以避免可能令人意外的副作用。修复 libxml2 版本 2.12.0 及更高版本的编译失败(Tom Lane)§
抑制来自 Python 头文件的编译器警告(Peter Eisentraut,Tom Lane)§
我们首选的编译器选项会对最近版本的 Python 头文件中出现的构造产生警告。使用 gcc 时,我们可以通过 pragma 来抑制这些警告。
避免使用 LLVM 18 编译时的弃用警告(Thomas Munro)§
将时区数据文件更新到 tzdata 2024a 版,以反映格陵兰、哈萨克斯坦和巴勒斯坦的夏令时法规变更,并修正南极洲凯西站和沃斯托克站的数据。另有越南、多伦多和密克隆的历史数据修正(Tom Lane)§