发布日期:. 2025-05-08
本版本包含了来自17.4的各种修复。 有关17大版本中新功能的信息,请参见 Section E.6.
对于运行17.X的用户,不需要进行转储/恢复操作。
但是,如果您在分区表上有任何自引用的外键约束,可能需要重新创建这些约束, 以确保它们被正确执行。请参见下面的第二个变更日志条目。
此外,如果您有任何 BRIN bloom 索引,更新后可能需要重新索引它们。 请参阅下面的第三个变更日志条目。
此外,如果您正在从早于17.1的版本升级,请参见Section E.5。
避免在检查被声称为 GB18030 编码的无效编码字符串时发生单字节缓冲区越界读取 (Noah Misch,Andres Freund) § §
虽然不太可能,但如果内存末尾出现不完整的多字节字符,可能会导致 SIGSEGV 崩溃。 这在服务器和使用 libpq 的应用程序中都有可能发生。 (CVE-2025-4207)
正确处理分区表上的自引用外键(Álvaro Herrera) §
创建或附加分区未能为外键约束创建所需的目录条目,如果约束引用的表是相同的分区表。 这导致无法完全强制执行该约束。
要解决此问题,如果自约束外键所在的分区表自约束创建以来已有分区被创建或附加, 则应删除并重新创建这些自约束外键。请注意,可能已经存在违反约束的行, 在这种情况下,重新创建约束将失败,您需要先修复这些行,然后再尝试。
避免在合并压缩的 BRIN 汇总时丢失数据,
发生在 brin_bloom_union()
中(Tomas Vondra)
§
代码未能考虑解压结果与输入对象不完全相同的情况,这将导致无法将部分数据 添加到合并摘要中,从而导致索引搜索中遗漏行。
这个错误早在引入BRIN bloom索引的v14版本中就存在,但当时很少会执行到这段代码路径。 在v17版本中,由于并行索引构建现在使用了这段代码,因此更有可能触发该错误。
修复在使用对视图或函数的整行表引用的
“属性类型错误”导致的
UPDATE
、DELETE
和
MERGE
查询中的意外错误
(Tom Lane)
§
将MERGE
应用到带有DO NOTHING
操作的分区表中(Tender Wang)
§
一些情况因“MERGE WHEN子句中的未知操作”错误而失败。
防止在表中具有域数据类型的GENERATED
列且域的约束不允许空值时,
INSERT
命令失败(贾恩·何)
§
即使生成表达式产生了完全正确的结果,也会报告约束失败。
正确处理出现在附加于
WITH
子句中的外部CTE名称的引用,
该子句附属于位于WITH
内的
INSERT
/UPDATE
/DELETE
/MERGE
命令(Tom Lane)
§
解析器未能检测到不允许的递归情况,也未在对CTE进行可用顺序排序时考虑此类引用。
修复了在 JSON 构造函数表达式的键中对类型转换的错误处理(Amit Langote) §
不要尝试对参数为匿名记录类型的array_agg()
进行并行化(Richard Guo, Tom Lane)
§
与并行工作者通信的协议不支持识别工作者返回的具体记录类型。
修正ARRAY(
和
subquery
)ARRAY[
结构,
以在输入类型为expression, ...
]int2vector
或oidvector
时产生合理的结果
(Tom Lane)§
此补丁恢复了在PostgreSQL 9.5之前存在的行为:
结果类型为int2vector[]
或oidvector[]
。
修正解析Ispell词典时可能出现的无效词缀错误报告(Jacob Brazeal) §
修复 ALTER TABLE ADD COLUMN
以正确处理
具有默认值的域类型的情况
(贾恩·何,汤姆·莱恩,Tender Wang)
§
§
如果域类型有默认值,添加该类型的列(没有任何显式的DEFAULT
子句)会导致无法在现有行中安装域的默认值,而是将新列置为空。
当外键约束的ON DELETE SET DEFAULT
或SET NULL
操作中存在重复列名时,
修复错误行为(Tom Lane)
§
改进对禁止修改外键约束属性的尝试的错误提示(Álvaro Herrera) §
避免在重置临时表的relhassubclass
标志时出错,
该临时表被标记为ON COMMIT DELETE ROWS
(Noah Misch)
§
添加了对 INDENT
选项的缺失反解析支持,
该选项属于 XMLSERIALIZE()
(Jim Jones)
§
§
之前,使用XMLSERIALIZE(... INDENT)
的视图或规则
在转储时没有包含INDENT
子句,导致恢复后结果不正确。
避免过早计算同时具有FILTER
和ORDER
BY
(或DISTINCT
)选项的聚合函数的参数(David Rowley)
§
如果存在ORDER BY
或DISTINCT
,我们会考虑对聚合输入值进行预排序,
而不是在Agg计划节点内进行排序。但如果聚合输入包含可能失败的表达式(例如,某些输入除数可能为零的除法),
并且存在用于防止此类失败的FILTER
子句,这将是有问题的。预排序会将表达式计算提前到
FILTER
测试之前,从而仍然可能发生失败。通过在存在FILTER
且输入表达式
复杂度超过简单的Var或Const时避免预排序来解决此问题。
修正了在存在外连接时对列NOT NULL
约束的错误扣除(Richard Guo)
§
在某些情况下,规划器会丢弃一个IS NOT
NULL
查询条件,尽管该条件是在外连接之后应用的,因此并非冗余。
避免基于IS [NOT] NULL
测试对复合值进行错误的优化
(Bruce Momjian)
§
修复规划器未能识别顶层表达式中多个可哈希的 ScalarArrayOpExpr 子表达式的问题 (David Geier) §
这导致了对任何额外子表达式的不必要且低效的执行,这些子表达式本可以使用哈希表
(即,IN
、NOT IN
或= ANY
子句,
其右侧全部为常量)来处理。
修正低填充因子下错误的表大小估计(Tomas Vondra) §
当规划器估算一个从未分析过的表中的行数时,它会在估算中使用表的 fillfactor 设置,但它忽略了将结果限制为每页至少一行。较低的 fillfactor 可能导致估算值不合理地偏小。
禁用位图堆扫描中的“跳过获取”优化 (Matthias van de Meent) §
事实证明,当并发的vacuum将页面标记为全可见时,这种优化可能导致返回已 失效的元组。
修复在存在大量搜索键时GIN索引搜索启动的性能问题(Tom Lane,Vinod Sridharan) § §
一个可索引的子句包含许多键(例如,jsonbcol ?| array[...]
,其中包含数万
个数组元素)启动时耗费了O(N2)时间,并且在此期间无法取消。
检测 BRIN 索引操作符类中缺失的支持过程,并报告错误而不是崩溃(Álvaro Herrera) §
在等待Append计划节点的异步子计划时响应中断(例如查询取消)(Heikki Linnakangas) §
之前,直到其中一个子计划准备好之前,什么都不会发生。
更频繁地报告活动 WAL 发送者的 I/O 统计信息(Bertrand Drouvot) §
之前,pg_stat_io
视图未能累计 WAL 发送进程退出前执行的 I/O。
现在此类 I/O 最多延迟一秒后即可报告。
修复启动后立即处理
synchronous_standby_names
时的竞态条件(Melnikov Maksim,Michael Paquier)
§
在系统启动后的短暂时间内,后端可能无法等待同步提交,
即使启用了synchronous_standby_names
。
处理可能的查询内io_combine_limit
更改(Thomas Munro)
§
避免当scram_iterations
设置为
INT_MAX时出现无限循环(Kevin K Biju)
§
避免由于对json_array()
的子查询进行双重转换而可能导致的崩溃
(Tom Lane)
§
修复pg_strtof()
以避免在endptr为空时崩溃
(Alexander Lakhin,Tom Lane)
§
修复在某些GUC赋值中内存不足后导致的崩溃(Daniel Gustafsson) §
避免当Snowball词干提取器遇到内存不足情况时崩溃(Maksim Korotkov) §
修复规划期间对 SpecialJoinInfo 结构体过度释放的问题(Richard Guo) §
这导致在启用分区方式连接时,规划过程中出现崩溃。
不允许复制已失效的复制槽(Shlok Kyal) §
这可以防止当无效的槽指向已经被移除的WAL时出现问题。
不允许在非热备模式的备用服务器上恢复逻辑复制槽(Masahiko Sawada) §
这可以防止在wal_level
过低的情况下,插槽在提升后仍然保持有效的情况。
防止目录 xmin 在逻辑解码的“快进”模式中过度前进(侯志杰) §
该错误可能导致已删除的目录条目被清理掉,即使它们仍可能被WAL读取 进程所需要。
避免在不加强锁的DDL操作影响正在逻辑复制的表时发生数据丢失(Shlok Kyal, Hayato Kuroda) § §
DDL命令引起的目录更改未反映到WAL解码进程中,导致它们使用过时的目录数据 解码后续更改,可能导致数据损坏。
防止在应用工作进程遇到错误但该错误被捕获且不会导致工作进程退出时, 错误地重置复制起点(Hayato Kuroda) §
该错误可能导致重复数据被应用。
修复了当订阅者的分区表具有BRIN索引时逻辑复制中的崩溃问题(Tom Lane) §
改进混合来源订阅的检测 (侯志杰,Shlok Kyal) §
订阅创建时会发出警告,如果订阅的表也通过其他发布被跟踪,因为这可能导致接收重复数据。 此更改改进了该逻辑,以检测通过其他发布跟踪的分区父表或子表的情况。
修正错误的检查点详情,解决关于错误恢复时间线选择的错误消息(David Steele) §
如果请求的恢复时间线不可达,报告的检查点和时间线应为从 backup_label 中读取的值(如果存在)。该消息之前报告的是 来自控制文件的值,这在没有 backup_label 时从控制文件恢复 是正确的,但当存在 backup_label 时则不正确。
修正 smgropen()
中的运算顺序
(Andres Freund)
§
确保在调用 smgr_open 回调之前,SMgrRelation 对象已完全初始化, 以便在回调失败时能够正确清理。
删除错误的断言
in pgstat_report_stat()
(Michael Paquier)
§
修复 gistFindCorrectParent()
中过于严格的断言(Heikki Linnakangas)
§
避免在并行真空操作中断言失败,
当 maintenance_work_mem
的值非常小时
(Masahiko Sawada)
§
修复主服务器重启时备用服务器中罕见的断言失败问题(Heikki Linnakangas) §
在 PL/pgSQL 中,当在简单的
SELECT
查询上定义可滚动游标时,
避免出现“意外的计划节点类型”错误(Andrei Lepikhov)
§
expression
不要尝试在pg_dump的--clean
模式下
删除单个索引分区(Jian He)
§
服务器会拒绝此类DROP
命令。 这实际上没有什么影响,
因为分区无论如何都会在随后对其父表或其分区索引的DROP
操作中
被删除。 但是,尝试删除时报告的错误会在以--single-transaction
模式恢复时引发问题。
在pg_dumpall中,如果pg_auth_members
包含无效的角色OID,
则避免发出无效的角色GRANT
命令(Tom Lane)
§
相反,打印警告并跳过该条目。这更好地应对了在后续分支中由于
GRANT
和DROP ROLE
之间的竞争条件
导致的目录损坏现象。
在pg_amcheck和pg_upgrade中,使用正确的函数释放由 libpq分配的内存(Michael Paquier,Ranier Vilela) § § §
这些疏忽可能导致某些Windows构建配置下的崩溃,例如调试版本的 libpq被非调试版本的调用应用程序使用时。
修复了reindexdb对并行重建索引操作的调度问题(Alexander Korotkov) §
原始编码未能达到预期的并行度。
避免因损坏的输入数据导致崩溃
在contrib/pageinspect
的
heap_page_items()
中(Dmitry Kovalenko)
§
防止断言失败
in contrib/pg_freespacemap
的
pg_freespacemap()
(Tender Wang)
§
对于缺少存储(例如视图)的关系,调用pg_freespacemap()
会导致断言失败,
尽管在非断言版本中没有不良影响。添加错误检查以拒绝该情况。
在contrib/postgres_fdw
中,避免从子查询中提取限制条件(Alexander Pyhalov)
§
此修复防止了罕见的“子查询输出中出现意外表达式”错误情况。
修复当系统包含目录中存在旧版本
的libpq_fe.h
时构建失败的问题(Tom Lane)
§
修复 macOS 15.4 上的构建失败(Tom Lane,Peter Eisentraut) §
这次 macOS 更新导致我们的配置探测程序
对 strchrnul()
失效。
修正了对读取流中每个缓冲区数据的 valgrind 标记 (Thomas Munro) §
这不会影响已发布版本中PostgreSQL的核心代码, 但使用每缓冲区数据功能的扩展在 valgrind 下测试时可能遇到虚假失败。
避免 valgrind 对字符串哈希代码的警告(John Naylor) §
更新时区数据文件至tzdata 2025b版本, 以应对智利夏令时法律变更,以及对伊朗的历史修正(Tom Lane) §
智利艾森地区新增了一个时区 America/Coyhaique,用以反映该地区全年 采用 UTC-03 时间,从而与 America/Santiago 时区产生差异。