发布日期:. 2024-11-14
本版本包含了来自17.0的各种修复。 有关17大版本中新功能的信息,请参见 Section E.6.
对于运行17.X的用户,不需要进行转储/恢复操作。
然而,如果您曾经从一个分区表中分离出一个分区,并且该分区表具有对另一个 分区表的外键引用,而没有删除前者的分区,那么您可能需要修复目录和/或数据 损坏,具体细节请参见下面的第五个变更日志条目。
另外,在不常见的情况下,如果数据库的LC_CTYPE
设置为C
,
而其LC_COLLATE
设置为其他区域设置,则应重新索引文本列上的索引,
如下面第六条变更日志条目中所述。
确保当行级安全(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));
由于可能会有一个或多个添加约束
步骤失败,您应该将查询的
输出保存到文件中,然后尝试执行每个步骤。
修正针对C
区域设置的测试,
当LC_COLLATE
与LC_CTYPE
不同
时(Jeff Davis)
§
当使用libc
作为默认排序提供程序时,检测是否使用
C
区域设置进行排序时,错误地检查了LC_CTYPE
而非LC_COLLATE
。在这两者设置相同的典型情况下,
或者两者都不是C
(也不是其别名POSIX
)
时,这不会产生影响。然而,如果LC_CTYPE
是
C
,而LC_COLLATE
是其他区域设置,
可能会导致错误的查询结果,并可能损坏字符串索引。使用此类设置的
数据库用户应在安装此更新后重新索引受影响的索引。
相反,如果LC_COLLATE
是C
,
而LC_CTYPE
是其他区域设置,则会导致性能下降,
但不会产生实际错误。
如果查询的排序规则与分区键的排序规则不匹配,请不要使用分区连接或分组(Jian He,Webbo Han) § §
这样的计划可能会产生错误的结果。
避免在将IS NULL
测试转换为常量FALSE
(Richard Guo)时,
导致对NOT NULL
列的规划器失败
§
该错误通常导致诸如“子计划目标列表中未找到变量”之类的错误。
避免在内联包含某些数组相关结构的 SQL 函数时可能导致的规划器崩溃(Tom Lane,Nathan Bossart) §
修正可能的错误答案或“错误的varnullingrels”规划器错误,针对
MERGE ... WHEN NOT MATCHED BY SOURCE
操作(Dean Rasheed)
§
§
修复可能出现的“无法找到用于排序的pathkey项”错误,
当UNION ALL
成员查询的输出需要排序,且排序列是表达式时
(Andrei Lepikhov,Tom Lane)
§
修复B树ScalarArrayOp索引扫描中的边缘情况(Peter Geoghegan) §
当带有此类计划的可滚动游标回退到其起始点然后再次向前运行时,可能会出现错误的答案。
修复断言失败或混淆的错误信息,发生在使用 COPY
(
时,且
query
) TO ...query
被 DO INSTEAD NOTIFY
规则重写(Tender Wang, Tom Lane)
§
修复了对COPY
的FORCE_NOT_NULL
和
FORCE_NULL
选项的验证(Joel Jacobson)
§
一些不正确的用法现在被拒绝了,正如它们应该被拒绝的那样。
修复服务器崩溃问题,当json_objectagg()
调用中包含一个易变函数(Amit Langote)
§
修复了在并行哈希连接期间对倾斜数据的检测(Thomas Munro) §
在对哈希连接的内部侧重新分区后,因为一个分区积累了太多的元组, 我们会检查所有分区的元组是否进入了同一个子分区,这表明它们都 具有相同的哈希值,进一步的重新分区无法改善情况。在某些情况下, 此检查出现故障,导致重复的无效重新分区,最终会导致资源耗尽错误。
避免在使用 ALTER DATABASE SET
设置需要基于搜索路径查找的服务器参数时发生崩溃,
例如 default_text_search_config
(Jeff Davis)
§
避免在分区表上创建新索引时重复查找操作类和排序规则(Tom Lane) §
这主要是有问题的,因为某些查找会在受限的search_path
下进行,
导致如果CREATE INDEX
命令引用了pg_catalog
之外的对象时出现意外失败。
此修复还防止了父分区索引上的注释被复制到子索引。
添加从分区表到CREATE TABLE ... USING
中指定的非内置访问方法的缺失依赖
(Michael Paquier)
§
当存在依赖于访问方法的表时,应阻止删除该访问方法,但之前未阻止, 导致后续出现异常行为。请注意,此修复仅防止此更新后创建的分区表 出现问题。
不允许包含非ASCII字符的区域设置名称(Thomas Munro) §
这仅仅是Windows上的一个问题,因为这样的区域设置名称在其他地方 并未使用。它们的问题在于,很难明确这些名称使用的编码是什么 (因为区域设置本身定义了要使用的编码)。在最近的 PostgreSQL版本中,由于对此的混淆, Windows运行时库可能会发生中止。
遇到新错误消息的任何人都应该使用Windows Locale Builder创建一个
仅包含ASCII字符名称的新重复区域设置,或者考虑使用符合BCP 47标准的
区域设置名称,例如tr-TR
。
修复提交可串行化事务时的竞态条件(Heikki Linnakangas) §
最近提交的事务处理错误可能会导致断言失败或出现 “无法访问事务状态”错误。
修复了COMMIT PREPARED
中的竞态条件,导致产生孤立的2PC文件(wuchengwen)
§
一个并发的PREPARE TRANSACTION
可能会导致
COMMIT PREPARED
未能移除已完成事务的磁盘上
的两阶段状态文件。虽然没有立即的不良影响,但随后的崩溃和恢复
可能会失败,并显示“无法访问事务状态”,需要手动
删除孤立文件以恢复服务。
避免在VACUUM FULL
期间跳过无效的toast索引后发生无效内存访问
(Tender Wang)
§
在此代码路径中,用于跟踪尚未重建索引的列表未被正确更新, 可能导致后续的断言失败或崩溃。
修复了“就地”目录更新可能丢失的问题(Noah Misch) § § § § § § §
普通行更新会写入行的新版本,以保留事务的回滚能力。然而,某些系统目录
更新是有意非事务性的,并通过对行的就地更新完成。这些补丁修复了可能导
致就地更新效果丢失的竞争条件。例如,可能会忘记将
pg_class
.relhasindex
设置为true,从而阻止新索引的更新,导致索引损坏。
在恢复结束时重置目录缓存(Noah Misch) §
这可以防止由于使用目录缓存中的过时数据而导致的就地目录更新丢失的情况。
避免在禁止中断的情况下使用并行查询 (Francesco Degrassi, Noah Misch, Tom Lane) § §
这种情况通常不会发生,但可以通过测试场景达到,例如使用SQL语言函数 作为B树支持(这对于生产使用来说会太慢)。如果确实发生了,它将导致 无限期的等待。
忽略尚未定义的门户(Portals),位于
pg_cursors
视图中(Tom Lane)
§
用户定义的代码在检查此视图时可能会被调用,而此时可能正在设置 一个新的游标,如果发生这种情况,将导致空指针解引用。通过将视图 定义为排除未完全设置的游标来避免此问题。
避免在解码涉及插入列默认值的事务时出现 “意外的 table_index_fetch_tuple 调用”错误(出自 Takeshi Ideriha, Hou Zhijie) § §
减少逻辑解码的内存消耗(Masahiko Sawada) §
使用较小的默认块大小来存储逻辑复制期间接收到的元组数据。这减少了内存浪费, 据报告,在处理长时间运行的事务时,这种浪费可能会非常严重,甚至导致内存不足 错误。
修正从CALL
语句的参数列表中调用稳定函数时的行为,
当CALL
位于PL/pgSQL EXCEPTION
块内时(Tom Lane)
§
与我们之前季度版本中的类似修复一样,此问题允许将错误的快照传递给 此类函数,导致它们看到自外部事务开始以来修改的行的过时值。
以与其他整数值选项相同的方式解析libpq的
keepalives
连接选项(Yuto Sasaki)
§
此处使用的编码拒绝了选项值中的尾随空格,这与其他情况不同。这在 ecpg的使用中,例如,结果证明是有问题的。
在ecpglib中,修复解析错误日期时间输入时的越界读取问题(Bruce Momjian, Pavel Nekrasov) §
可以尝试读取常量数组开始之前的位置。实际影响似乎很小。
修复psql的描述命令,使其再次能够与9.4之前的服务器 一起工作(Tom Lane) §
涉及显示ACL(权限)列的命令在非常旧的PostgreSQL服务器上失败, 因为使用了那些版本中不存在的函数。
避免在psql的\watch
命令中指定小于1毫秒的间隔时发生挂起
(Andrey Borodin,Michael Paquier)
§
相反,将其视为零间隔(执行之间没有等待)。
修复无法在~/.pgpass
中找到复制密码的故障(Tom Lane)
§
pg_basebackup和pg_receivewal未能匹配
~/.pgpass
中的条目,该条目在数据库名称字段中包含replication
,
如果未提供-d
或--dbname
选项。这样会导致意外的密码提示。
在pg_combinebackup中,如果在应包含完整备份的目录中存在增量备份文件, 则抛出错误(Robert Haas) §
在pg_combinebackup中,不要构造包含双斜杠的文件名(Robert Haas) §
这不会引起功能性问题,但重复的斜杠会出现在错误信息中,可能导致混淆。
避免尝试重新索引vacuumdb中的临时表和索引, 以及并行reindexdb中的临时表和索引(VaibhaveS,Michael Paquier,藤井正雄,Nathan Bossart) § § §
重新索引其他会话的临时表无法正常工作,但某些代码路径中缺少跳过它们的 检查,导致了不必要的失败。
修复ARM64平台上LLVM生成的错误代码(Thomas Munro,Anthonin Bonnefoy) §
在ARM平台上使用JIT编译时,生成的代码无法支持超过32位的重定位距离, 这可能导致生成代码的不幸位置在大内存系统上引发服务器崩溃。
修复了一些假设进程启动时间(表示为time_t
)可以适合于
long
值的地方(Max Johnson, Nathan Bossart)
§
在 long
是 32 位的平台上(尤其是 Windows),
此编码将在 Y2038 之后失效。大多数问题似乎只是表面上的,
但特别是 pg_ctl start
会挂起。
更新时区数据文件到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
的别名,而不是一个单独的
时区,主要是因为发现这些时区之间的差异基于不可靠的数据。