发布日期:. 2024-11-14
此版本包含从16.4修复的各种问题。 有关16的主要版本中新功能的信息,请参见 第 E.9 节。
对于运行16.X的用户,不需要进行转储/恢复。
然而,如果您曾经从一个分区表中分离出一个分区,并且该分区表具有对另一个 分区表的外键引用,而没有删除前者的分区,那么您可能需要修复目录和/或数据 损坏,具体细节请参见下面的第五个变更日志条目。
此外,如果您正在从早于16.3的版本升级, 请参阅第 E.6 节。
确保在调用角色时,缓存计划被标记为依赖于调用角色,当RLS适用于非顶级 表引用时(Nathan Bossart) §
如果查询中的CTE、子查询、子链接、安全调用者视图或强制投影引用了具有行级 安全策略的表,我们未能将生成的计划标记为可能依赖于执行它的角色。这可能导 致同一会话中的后续查询执行使用错误的计划,从而返回或隐藏本应隐藏或返回的 行。
PostgreSQL项目感谢 Wolfgang Walther 报告了此问题。 (CVE-2024-10976)
使libpq丢弃在SSL或GSS协议协商期间收到的错误消息 (Jacob Champion) §
在加密协商完成之前收到的错误消息可能是由中间人攻击注入的, 而不是真正的服务器输出。报告此类消息会带来各种安全隐患; 例如,该消息可能伪造一个查询结果,而粗心的用户可能会误以为 是正确的输出。最好的解决方案似乎是丢弃这些数据,并仅依赖 libpq自身的连接失败报告。
PostgreSQL项目感谢 Jacob Champion 报告了此问题。 (CVE-2024-10977)
修复SET SESSION AUTHORIZATION
和SET ROLE
之间的意外交互 (Tom Lane)
§
§
SQL标准要求SET SESSION AUTHORIZATION
具有执行
SET ROLE NONE
的副作用。我们的实现存在缺陷,
导致这两个设置之间的交互比预期的更多。特别是,回滚一个执行了
SET SESSION AUTHORIZATION
的事务会将ROLE
恢复为NONE
,即使这并不是之前的状态,因此有效的用户ID
可能会与事务之前的状态不同。在函数SET
子句中临时设置
session_authorization
也会产生类似的效果。
一个相关的错误是,如果一个并行工作者检查
current_setting('role')
,它会看到
none
,即使它应该看到其他内容。
PostgreSQL项目感谢 Tom Lane 报告了此问题。 (CVE-2024-10978)
防止受信任的PL/Perl代码更改环境变量 (Andrew Dunstan,Noah Misch) § § § § §
操作进程环境变量(例如PATH
)的能力为攻击者提供了执行任意代码的
机会。因此,“受信任的”PLs必须禁止提供这种能力。为修复plperl
,
将%ENV
替换为一个绑定的哈希表,该哈希表会在任何修改尝试时发出警告。
不受信任的plperlu
仍然保留更改环境的能力。
PostgreSQL项目感谢 Coby Abrams 报告了此问题。 (CVE-2024-10979)
修复在附加或分离表分区时,外键约束的目录状态更新 (Jehan-Guillaume de Rorthais, Tender Wang, Álvaro Herrera) § §
如果引用的表是分区表,那么对于独立的引用表和作为分区的引用表,
需要不同的目录条目。ATTACH/DETACH PARTITION
命令未能
正确执行此转换。特别是,在DETACH
之后,现在独立的表
将缺少外键约束触发器,这可能导致表中后来包含不符合外键约束的行。
随后的重新ATTACH
也可能会出现意外的错误。
解决此问题的方法是对每个有问题的约束在现在独立的表上执行
ALTER TABLE DROP CONSTRAINT
,然后重新添加约束。
如果重新添加约束失败,则说明有一些错误的数据已经混入。您需要手动
重新建立引用表和被引用表之间的一致性,然后重新添加约束。
此查询可用于识别损坏的约束并构造重新创建它们所需的命令:
SELECT conrelid::pg_catalog.regclass AS "constrained table", conname AS constraint, confrelid::pg_catalog.regclass AS "references", pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;', conrelid::pg_catalog.regclass, conname) AS "drop", pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;', conrelid::pg_catalog.regclass, conname, pg_catalog.pg_get_constraintdef(oid)) AS "add" FROM pg_catalog.pg_constraint c WHERE contype = 'f' AND conparentid = 0 AND (SELECT count(*) FROM pg_catalog.pg_constraint c2 WHERE c2.conparentid = c.oid) <> (SELECT count(*) FROM pg_catalog.pg_inherits i WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table WHERE partrelid = i.inhparent));
由于可能会有一个或多个添加约束
步骤失败,您应该将查询的
输出保存到文件中,然后尝试执行每个步骤。
避免在查询分区表时可能发生的崩溃和“无法打开关系”错误,
这些错误可能与并发分离
和立即删除分区同时发生
(Álvaro Herrera, Kuntal Gosh)
§
§
禁止ALTER TABLE ATTACH PARTITION
,如果要附加的表具有
外键引用分区表(Álvaro Herrera)
§
§
此安排不受支持,并且其他创建它的方法已经失败。
如果查询的键列的排序规则与分区键的排序规则不匹配,请不要使用分区 连接或分组 (Jian He, Webbo Han) § §
这样的计划可能会产生错误的结果。
修复可能的“无法找到用于排序的路径键项”
错误,当UNION ALL
成员查询的输出
需要排序,并且排序列是一个表达式时(Andrei
Lepikhov, Tom Lane)
§
修复涉及在外连接下展平子查询的性能回退问题,这些外连接后来被简化为普通连接 (Tom Lane) §
v16未能像之前的版本那样优化某些查询,因为查询上拉逻辑的过于乐观简化。
允许取消大型哈希索引的第二阶段索引构建 (Pavel Borisov) §
修复当查询
被DO
INSTEAD NOTIFY
规则重写时,COPY
(
的断言失败或令人困惑的错误消息
(Tender Wang, Tom Lane)
§
query
) TO ...
修复当json_objectagg()
调用包含易变函数时的服务器崩溃
(Amit Langote)
§
修复在JSON对象构造器中检查键唯一性的问题 (Junwang Zhao, Tomas Vondra) §
当构建一个大于一千字节的对象时,可能会接受包含重复对象键的无效输入, 或错误地报告存在重复键。
修复在并行哈希连接期间检测倾斜数据的问题 (Thomas Munro) §
在对哈希连接的内部侧重新分区后,因为一个分区积累了太多的元组, 我们会检查所有分区的元组是否进入了同一个子分区,这表明它们都 具有相同的哈希值,进一步的重新分区无法改善情况。在某些情况下, 此检查出现故障,导致重复的无效重新分区,最终会导致资源耗尽错误。
禁止包含非ASCII字符的区域设置名称 (Thomas Munro) §
这仅仅是Windows上的一个问题,因为这样的区域设置名称在其他地方 并未使用。它们的问题在于,很难明确这些名称使用的编码是什么 (因为区域设置本身定义了要使用的编码)。在最近的 PostgreSQL版本中,由于对此的混淆, Windows运行时库可能会发生中止。
遇到新错误消息的任何人都应该使用Windows Locale Builder创建一个
仅包含ASCII字符名称的新重复区域设置,或者考虑使用符合BCP 47标准的
区域设置名称,例如tr-TR
。
修复在提交可序列化事务时的竞争条件(Heikki Linnakangas) §
最近提交的事务处理错误可能会导致断言失败或出现 “无法访问事务状态”错误。
修复COMMIT PREPARED
中的竞争条件问题,
该问题导致了孤立的2PC文件(wuchengwen)
§
一个并发的PREPARE TRANSACTION
可能会导致
COMMIT PREPARED
未能移除已完成事务的磁盘上
的两阶段状态文件。虽然没有立即的不良影响,但随后的崩溃和恢复
可能会失败,并显示“无法访问事务状态”,需要手动
删除孤立文件以恢复服务。
在跳过无效的toast索引期间,避免在VACUUM FULL
之后
访问无效的内存(Tender Wang)
§
在此代码路径中,用于跟踪尚未重建索引的列表未被正确更新, 可能导致后续的断言失败或崩溃。
修复可能导致“就地”目录更新丢失的方式 (Noah Misch) § § § § § § §
普通行更新会写入行的新版本,以保留事务的回滚能力。然而,某些系统目录
更新是有意非事务性的,并通过对行的就地更新完成。这些补丁修复了可能导
致就地更新效果丢失的竞争条件。例如,可能会忘记将
pg_class
.relhasindex
设置为true,从而阻止新索引的更新,导致索引损坏。
在恢复结束时重置目录缓存(Noah Misch) §
这可以防止由于使用目录缓存中的过时数据而导致的就地目录更新丢失的情况。
避免在暂停中断时使用并行查询 (Francesco Degrassi,Noah Misch,Tom Lane) § §
这种情况通常不会发生,但可以通过测试场景达到,例如使用SQL语言函数 作为B树支持(这对于生产使用来说会太慢)。如果确实发生了,它将导致 无限期的等待。
在处理绑定和执行协议消息开始时报告活动查询ID以用于统计 目的(Sami Imseih) §
这使得在扩展查询协议中完成的更多工作能够归因于正确的查询。
防止在libxml2中因过深嵌套的XML输入导致 堆栈溢出(Tom Lane,致敬Nick Wellnhofer) §
使用xmlXPathCtxtCompile()
而不是
xmlXPathCompile()
,因为后者在
libxml2 2.13.4之前的版本中未能
保护自己免受递归导致的堆栈溢出。
修复XMLSERIALIZE(... INDENT)
结果中的一些空白问题
(Jim Jones)
§
修复因空白分隔的节点未正确缩进的问题,并确保不会添加尾随换行符。
不要忽略一个正在处理带有谓词或表达式的索引的并发
REINDEX CONCURRENTLY
(Michail Nikolaev)
§
通常,REINDEX CONCURRENTLY
不需要等待其他表上的
其他REINDEX CONCURRENTLY
操作。然而,如果其他
REINDEX CONCURRENTLY
正在处理带有谓词或表达式的索引,
则不会应用此优化,因为这些表达式可能包含访问其他表的用户定义代码。
不小心的编码会导致一个竞争条件,从而使该规则未被一致地应用,
可能导致不一致的行为。
修复在存在名称冲突时ORDER BY
列表的错误解析问题
(Tom Lane)
§
如果ORDER BY
项在SELECT
中是一个裸标识符,
解析器首先会将其作为SELECT
的输出列名来查找,以兼容SQL92。
然而,ruleutils.c期望SQL99的解释,其中这样的名称是一个输入列名。
因此,在某些情况下(尽管不太明智),如果SELECT
输出列表中
的某个列被重命名为与ORDER BY
中使用的输入列匹配的名称,
则可能会导致视图的显示不正确。通过在导出的视图文本中为这些名称添加表限定符来修复。
修复“未能找到子查询/CTE的计划”错误
在EXPLAIN
中 (Richard Guo, Tom Lane)
§
§
此案例出现在尝试打印子查询的RECORD类型输出字段的引用时,
当子查询已完全从计划中优化掉(至少在子查询具有恒假
WHERE
条件的情况下是可能的)。计划中不再
存在任何内容来标识原始字段名称,因此回退到打印
f
,用于
第N
N
个记录列。(实际上,如果记录
输出来自ROW()
构造器,这也是正确的做法。)
禁止在更改生成列的类型时使用USING
子句
(Peter Eisentraut)
§
一个生成列已经有一个表达式来指定列的内容,因此包括
USING
是没有意义的。
忽略尚未定义的 Portals 在
pg_cursors
视图中 (Tom Lane)
§
用户定义的代码在检查此视图时可能会被调用,而此时可能正在设置 一个新的游标,如果发生这种情况,将导致空指针解引用。通过将视图 定义为排除未完全设置的游标来避免此问题。
修复32位机器上pg_stat_io
视图的错误输出
(Bertrand Drouvot)
§
stats_reset
时间戳列在此类硬件上包含垃圾数据。
防止出现“数字字面量后面的尾随垃圾”错误消息的错误编码 (Karina Litskevich) §
我们不允许标识符紧跟在数字字面量之后出现(两者之间必须有一些空格)。 如果一个多字节字符紧跟在数字字面量之后,关于它的语法错误消息只包含 该字符的第一个字节,这会导致在向客户端报告和在postmaster日志文件中 出现编码错误问题。
避免在逻辑解码期间出现“意外的 table_index_fetch_tuple 调用” 错误,该错误发生在解码涉及插入列默认值的事务时 (Takeshi Ideriha, Hou Zhijie) § §
减少逻辑解码的内存消耗(Masahiko Sawada) §
使用较小的默认块大小来存储逻辑复制期间接收到的元组数据。这减少了内存浪费, 据报告,在处理长时间运行的事务时,这种浪费可能会非常严重,甚至导致内存不足 错误。
在逻辑复制应用工作者中,确保在错误或应用工作者关闭期间, 不会推进源进度(Hayato Kuroda,Shveta Malik) §
这避免了可能的事务丢失,因为一旦原始进度点被推进,源服务器将不会 再次发送该数据。
重新禁用发送无状态 (TLSv1.2) 会话票据 (Daniel Gustafsson) §
之前的一次更改为了防止发送有状态的(TLSv1.3)会话票据,但意外地重新启用了 无状态的会话票据。因此,尽管我们本意是阻止客户端认为支持TLS会话恢复,但一些 客户端仍然这样认为。
允许在并行工作者中调整session_authorization
和role
设置(Tom Lane)
§
我们的代码旨在允许通过函数SET
子句设置可修改的服务器设置,
但在并行工作者中不能以其他方式设置。然而,这两个设置的
SET
子句失败了。
修复从CALL
语句的参数列表中调用的稳定函数的行为,
当CALL
位于PL/pgSQL EXCEPTION
块中时
(Tom Lane)
§
与我们之前季度版本中的类似修复一样,此问题允许将错误的快照传递给 此类函数,导致它们看到自外部事务开始以来修改的行的过时值。
修复“缓存查找失败的函数”错误,解决PL/pgSQL的CALL
边界情况中的问题(Tom Lane)
§
修复我们在大端硬件上的回退(非OpenSSL)MD5实现的线程安全性 (Heikki Linnakangas) §
线程安全目前在服务器中不是一个问题,但在libpq中是一个问题。
以与其他整数值选项相同的方式解析libpq的
keepalives
连接选项(Yuto Sasaki)
§
此处使用的编码拒绝了选项值中的尾随空格,这与其他情况不同。这在 ecpg的使用中,例如,结果证明是有问题的。
避免在ecpglib中使用pnstrdup()
(Jacob Champion)
§
该函数将在内存不足时调用exit()
,这在库中是不理想的。
调用代码已经正确处理了分配失败的情况。
在ecpglib中,修复了解析错误日期时间输入时的 越界读取问题(Bruce Momjian, Pavel Nekrasov) §
可以尝试读取常量数组开始之前的位置。实际影响似乎很小。
修复在重复使用psql时的内存泄漏问题
\bind
(Michael Paquier)
§
如果在psql的\watch
命令中指定
的间隔小于1毫秒,避免挂起(Andrey Borodin,Michael Paquier)
§
相反,将其视为零间隔(执行之间没有等待)。
修复pg_dump处理身份序列的问题,这些身份序列的持久性 与其所属表的持久性不同(Tom Lane) §
从v15开始,当其所属表是UNLOGGED或反之时,可以将标识序列设置为
LOGGED。然而,pg_dump在二进制升级模式下
重建这种情况的方法失败了,导致当存在这样的序列时,
pg_upgrade会失败。通过为
ADD/ALTER COLUMN GENERATED AS IDENTITY
引入一个新选项
来修复此问题,以便在创建时正确设置序列的持久性。
请注意,这意味着包含此类序列的数据库的转储只能加载到此小版本或
更新版本的服务器中。
在pg_rewind的调试输出中包含源时间线历史 (Heikki Linnakangas) §
这本来是最初的意图,但一个编码错误导致源历史总是显示为空。
避免尝试在vacuumdb和并行 reindexdb中重新索引临时表和索引 (VaibhaveS,Michael Paquier,Fujii Masao,Nathan Bossart) § § §
重新索引其他会话的临时表无法正常工作,但某些代码路径中缺少跳过它们的 检查,导致了不必要的失败。
允许检查contrib/pageinspect
和contrib/pgstattuple
中相关函数的序列关系 (Nathan Bossart, Ayush Vatsa)
§
§
这在过去是被允许的,但在为表引入非默认访问方法时被破坏了。
修复在ARM64平台上由LLVM生成的错误代码(Thomas Munro, Anthonin Bonnefoy) §
在ARM平台上使用JIT编译时,生成的代码无法支持超过32位的重定位距离, 这可能导致生成代码的不幸位置在大内存系统上引发服务器崩溃。
修复了一些假设进程启动时间(表示为time_t
)可以适配
到long
值的地方(Max Johnson, Nathan Bossart)
§
在 long
是 32 位的平台上(尤其是 Windows),
此编码将在 Y2038 之后失效。大多数问题似乎只是表面上的,
但特别是 pg_ctl start
会挂起。
修复在 Windows 上使用 Strawberry Perl 构建的问题 (Andrew Dunstan) §
更新时区数据文件到tzdata 版本2024b(Tom Lane) § §
此次tzdata版本更新将旧的System-V兼容时区名称更改为
对应地理时区的副本;例如PST8PDT
现在是
America/Los_Angeles
的别名。主要的可见后果是,
对于标准化时区引入之前的时间戳,该时区被认为代表命名位置的当地
平均太阳时间。例如,在PST8PDT
中,
timestamptz
输入如1801-01-01 00:00
之前
会被渲染为1801-01-01 00:00:00-08
,但现在
渲染为1801-01-01 00:00:00-07:52:58
。
此外,对墨西哥、蒙古和葡萄牙进行了历史修正。
值得注意的是,Asia/Choibalsan
现在是
Asia/Ulaanbaatar
的别名,而不是一个单独的
时区,主要是因为发现这些时区之间的差异基于不可靠的数据。