E.3. 发布版本 12.20 #
发布日期:. 2024-08-08
本次发布包含来自 12.19 的多项修复。有关 12 主版本新特性的说明,请参见第 E.23 节。
PostgreSQL 社区将于 2024 年 11 月停止发布 12.X 系列的更新。建议用户尽快升级到较新的发布分支。
E.3.2. 变更
防止在 pg_dump 期间执行未经授权的代码(Masahiko Sawada)§
能够创建和删除非临时对象的攻击者可以注入 SQL 代码,该代码将由并发的 pg_dump 会话以运行 pg_dump 的角色权限(通常是超级用户)来执行。该攻击涉及将序列或类似对象替换为会执行恶意代码的视图或外部表。为防止此问题,引入了新的服务器参数
restrict_nonsystem_relation_kind,可以禁止展开非内置视图以及访问外部表,并教会 pg_dump 在可用时设置该参数。请注意,只有当 pg_dump 和它正在导出的服务器都足够新以包含此修复时,才能防止该攻击。PostgreSQL 项目感谢 Noah Misch 报告此问题。(CVE-2024-7348)
修复在将表作为分区附加后的失败,如果该表之前有继承子表(Álvaro Herrera)§
修复涉及不一致的基于索引的约束时
ALTER TABLE DETACH PARTITION的问题(Álvaro Herrera,Tender Wang)§ §当分区表有一个不与约束关联的索引,但某个分区有一个等效的索引且该索引与约束关联时,分离该分区会出现异常行为,导致前分区的约束具有不正确的
coninhcount值。这会在后续对该约束进行任何操作时引发问题。SQL
CALL语句没有为此类参数解析正确的数据类型,导致诸如“cannot display a value of type anyelement”之类的错误,甚至直接崩溃。(但在 PL/pgSQL 中的CALL工作正常。)修复从
CALL语句的参数列表中调用稳定函数时的行为(Tom Lane)§如果
CALL处于原子上下文中(例如,有外部事务块),这些函数会被传递错误的快照,导致它们看到自外部事务开始以来已修改的行的过时值。检测
money计算中的整数溢出(Joseph Koshakow)§之前
money类型的所有算术函数都没有检查溢出,因此在溢出的情况下会静默地给出错误的结果。修复
round(numeric)和trunc(numeric)中对小数位参数过于激进的截断(Dean Rasheed)§这些函数将小数位参数截断到 +/-2000,但有些有效的使用场景需要更大的值;在这些情况下函数返回了不正确的结果。改为截断到
numeric类型实际允许的范围。防止
pg_sequence_last_value()在备库上的不记录 WAL 的序列和其他会话的临时序列上失败(Nathan Bossart)§在这些情况下改为返回 NULL 而不是抛出错误。
修复
websearch_to_tsquery()中对被忽略操作符的解析(Tom Lane)§根据手册,
websearch_to_tsquery()输入中的标点符号除了短划线和引号的特殊情况外都会被忽略。然而,紧接在or之前出现的圆括号和其他一些字符可能导致or被当作数据词处理,而不是按预期作为OR操作符。检测计算新数组维度时的另一个整数溢出情况(Joseph Koshakow)§
拒绝将数组维度
[-2147483648:2147483647]应用于空数组。这与 CVE-2023-5869 密切相关,但看起来是无害的,因为数组最终仍然为空。检测新目录缓存条目在展开其字段时变为过时的另一种情况(Noah Misch)§
在展开目录元组的行外字段时发生的原地更新可能会被遗漏,导致目录缓存条目缺少原地更改但不被认为是过时的。这仅在
pg_database目录中可能发生,因此影响范围较窄,但可能会导致异常行为。正确检查由
INSERT...DEFAULT目标的视图列的可更新性(Tom Lane)§如果这样的列不可更新,我们应该报告相应的错误。但该检查被遗漏了,随后的代码会报告一个不太有用的错误,如“attribute number
Nnot found in view targetlist”。避免对不正确的递归查询报告无用的内部错误(Tom Lane)§
重新排列错误检查的顺序,以便在
WITH RECURSIVE查询在UNION的第二个分支中没有自引用,但在其他位置(如ORDER BY)有自引用时,抛出针对性的错误。如果已排队的
AFTER触发器不再存在,不再抛出错误(Tom Lane)§事务有可能执行一个操作将延迟的
AFTER触发器排入队列以供后续执行,然后在该触发器执行之前将其删除。以前这会导致诸如“could not find triggerNNNN”之类的奇怪错误。如果触发器在应该执行时已不再存在,更好的做法是静默地不执行任何操作。修复在删除表时未能移除
pg_init_privs中列级权限条目的问题(Tom Lane)§如果扩展在其创建的表上授予了某些列级权限,在扩展被删除后相关的目录条目会残留。这在表的 OID 被另一个关系重新使用之前是无害的,届时可能会干扰 pg_dump 对该关系的导出。
修复当所需索引具有表达式或谓词时
ON CONFLICT的仲裁索引选择(Tom Lane)§如果使用
ON CONFLICT的查询通过可更新视图访问目标表,即使存在匹配的索引,也可能报告错误“there is no unique or exclusion constraint matching the ON CONFLICT specification”。拒绝使用
ALTER TABLE修改另一个会话的临时表(Tom Lane)§权限检查通常会防止出现这种情况,但可以通过修改其子表是另一个会话的临时表的父表来触发。如果我们发现此类子表属于另一个会话,则抛出错误。
修复从
MIN()或MAX()聚合生成的子查询未能重新计算的问题(Tom Lane)§在某些情况下,在外部查询的某一行计算的聚合结果可能会在不应该被重用时被后续行重用。目前仅在外部查询使用通过 hash 聚合实现的
DISTINCT时观察到这个问题,但可能存在其他情况。避免在 JIT 内联的后端函数抛出错误时崩溃(Tom Lane)§
错误状态可能包含指向持有 JIT 编译代码的动态加载模块的指针(用于错误位置字符串)。在某些代码路径中,模块可能在错误报告被处理之前就被卸载,导致在访问位置字符串时发生 SIGSEGV。
应对 libxml2 版本 2.13.x 中的行为变更(Erik Wienhold,Tom Lane)§
值得注意的是,我们现在会抑制来自 libxml2 的“chunk is not well balanced”错误,除非这是唯一报告的错误。这是为了使 2.13.x 和更早版本的 libxml2 之间的错误报告保持一致。在更早的版本中,该消息几乎总是冗余的或完全不正确的,因此 2.13.x 大幅减少了报告该消息的情况。
修复启动热备服务器时对预备事务的子事务的处理(Heikki Linnakangas)§
当备库的重放从关闭检查点 WAL 记录开始时,主库上已预备但尚未提交的事务会被正确理解为仍在进行中。但预备事务的子事务(由保存点或 PL/pgSQL 异常块创建)没有被考虑在内,会被视为已中止。如果该预备事务后来被提交,这会导致不一致。
防止逻辑复制槽的不正确初始化(Masahiko Sawada)§
在某些情况下,复制槽在 WAL 流中的起始点可能被设置为事务内部的某个位置,导致断言失败或不正确的解码结果。
避免在处理通知或共享失效中断后的内存泄漏(Tom Lane)§
这些事件的处理函数可能会将当前内存上下文切换为 TopMemoryContext,导致在不正确的设置被替换之前分配的任何数据产生会话生命周期的泄漏。已观察到与(至少)传入查询的编码转换和附加到 Bind 消息的参数相关的可见泄漏。
避免在 Windows 套接字上可能遗漏输入结束事件(Thomas Munro)§
Windows 在连接的远程端断开连接后只报告一次 FD_CLOSE 事件。在时机不巧的情况下,我们可能会遗漏该报告并无限期等待,或者至少等到超时为止,以期望获得更多输入。
禁用 OpenSSL 创建有状态 TLS 会话票证(Daniel Gustafsson)§ § §
这可以避免客户端在收到会话票证后认为支持 TLS 会话恢复时可能出现的失败。
当重新规划 PL/pgSQL 的“简单表达式”时,检查它是否仍然是简单的(Tom Lane)§
某些相当人为的情况,如删除引用的函数并将其重新创建为聚合,可能导致诸如“unexpected plan node type”之类的意外失败。
修复 PL/Perl 与 Perl 5.40 之间的不兼容性(Andrew Dunstan)§
修复递归返回
RECORD类型的 PL/Python 函数(Tom Lane)§如果递归调用同一个函数并传递不同的列定义列表(
AS子句),会失败,因为内部调用会覆盖外部调用对要返回的行类型的理解。在递归触发器调用时不再损坏 PL/Python 的
TD字典(Tom Lane)§如果一个 PL/Python 语言触发器导致另一个触发器被调用,为内部触发器创建的
TD字典会覆盖外部触发器的TD字典。修复 PL/Tcl 在返回元组的函数结果中报告无效列表语法时的问题(Erik Wienhold,Tom Lane)§
这种情况可能导致崩溃,或者发出实际引用前一个 Tcl 错误的误导性上下文信息。
避免在 libpq 中使用非线程安全的
strerror()(Peter Eisentraut)§在多线程应用程序中,OpenSSL 返回的某些错误消息可能会出现乱码。
确保
pg_restore-l正确报告依赖的 TOC 条目(Tom Lane)§如果
-l与选择性恢复选项(如-n或-N)一起指定,依赖的 TOC 条目(如注释)会从列表中省略,即使实际恢复时会选择它们。避免与系统提供的
<regex.h>头文件冲突(Thomas Munro)§这修复了 macOS 版本 15 及更高版本上的编译失败。
修复对 SP-GiST 索引应用
REINDEX CONCURRENTLY时无害的断言失败(Tom Lane)§