发布日期:. 2025-05-08
本次发布包含自 17.4 以来的多项修复。 有关 17 主版本中新特性的更多信息,请参见 Section E.11。
对于运行 17.X 的用户,无需执行转储/恢复。
不过,如果你在分区表上有自引用外键约束,则可能需要重新创建这些约束,以确保它们得到正确实施。见下文第二条变更记录。
此外,如果你有任何 BRIN bloom 索引,建议在更新后对其重建索引。见下文第三条变更记录。
此外,如果你是从早于 17.1 的版本升级,请参见 Section E.10。
避免在检查声称为 GB18030 编码的无效编码字符串时发生单字节缓冲区越界读取 (Noah Misch,Andres Freund) § §
虽然可能性不大,但如果不完整的多字节字符出现在内存末尾,可能会导致 SIGSEGV 崩溃。这在服务器和使用 libpq 的应用程序中都可能发生。 (CVE-2025-4207)
正确处理分区表上的自引用外键 (Álvaro Herrera) §
创建或附加分区时未能为外键约束创建所需的目录条目,如果该约束引用的表就是同一个分区表。这会导致该约束无法被完全执行。
要修复此问题,如果在约束创建之后曾创建或附加过分区,则应删除并重新创建分区表上的任何自引用外键。请注意,可能已经存在违反约束的行,在这种情况下重新创建约束会失败,你需要先修复这些行后再重试。
避免在 brin_bloom_union() 中合并压缩的 BRIN 摘要时丢失数据 (Tomas Vondra) §
该代码未能考虑到解压缩结果与输入对象不完全相同的情况,这会导致未能将部分数据添加到合并后的摘要中,从而在索引搜索中遗漏行。
这个错误从引入 BRIN bloom 索引的 v14 就存在了,但当时这个代码路径很少被触及。在 v17 中由于并行索引构建现在使用了该代码,因此更容易被触发。
修复在 UPDATE、DELETE 和 MERGE 查询中使用对视图或函数的整行表引用(在 FROM 中)时出现的意外 “attribute has wrong type” 错误 (Tom Lane) §
修复对带有 DO NOTHING 动作的分区表执行 MERGE 的问题 (Tender Wang) §
某些情况会出现 “unknown action in MERGE WHEN clause” 错误。
防止当表具有域数据类型的 GENERATED 列且该域的约束不允许空值时 INSERT 命令失败的问题 (Jian He) §
即使生成表达式产生了完全正常的结果,仍会报告约束违反错误。
正确处理出现在附加到 INSERT/UPDATE/DELETE/MERGE 命令(该命令本身在 WITH 内部)的 WITH 子句中对外部 CTE 名称的引用 (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 以正确处理具有默认值的域类型的情况 (Jian He,Tom Lane,Tender Wang) § §
如果域类型具有默认值,在不带显式 DEFAULT 子句的情况下添加该类型的列,未能在现有行中安装域的默认值,而是将新列保留为空值。
修复外键约束的 ON DELETE SET DEFAULT 或 SET NULL 动作中存在重复列名时的异常行为 (Tom Lane) §
改进对不允许的外键约束属性修改尝试的错误消息 (Álvaro Herrera) §
避免在重置标记为 ON COMMIT DELETE ROWS 的临时表的 relhassubclass 标志时出错 (Noah Misch) §
增加对 XMLSERIALIZE() 的 INDENT 选项的缺失反解析支持(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 设置计入估算,但此前未将结果限制为每页至少一行。因此,低填充因子可能导致不合理地偏小的估算结果。
禁用位图堆扫描中的“跳过获取”优化 (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 过低的情况下, 槽在提升后仍然保持有效的场景。
防止在逻辑解码的“快进”模式中过度推进 catalog xmin (Zhijie Hou) §
这个错误可能导致已删除的目录条目被清理掉,即使 WAL 读取进程仍可能需要它们。
避免在不需要强锁的 DDL 操作影响正在进行逻辑复制的表时丢失数据 (Shlok Kyal,Hayato Kuroda) § §
DDL 命令导致的目录变更未被反映到 WAL 解码进程中,使其可能使用过期的目录数据解码后续变更,很可能导致数据损坏。
防止当应用工作进程遇到错误但该错误被捕获且未导致工作进程退出时, 复制来源被错误重置的问题(Hayato Kuroda) §
此错误可能导致重复数据被应用。
修复逻辑复制中订阅端分区表具有 BRIN 索引时的崩溃问题(Tom Lane) §
改进对混合来源订阅的检测 (Hou Zhijie,Shlok Kyal) §
在创建订阅时,如果被订阅的表同时通过其他发布被关注,会发出警告, 因为这可能导致接收重复数据。此变更改进了该逻辑, 使其也能检测到通过另一个发布关注的是分区父表或子表的情况。
修复关于不正确恢复时间线选择的错误消息中的检查点详情错误 (David Steele) §
如果请求的恢复时间线不可达,报告的检查点和时间线应该是从 backup_label 中读取的值(如果有的话)。之前此消息报告的是控制文件中的值, 这在没有 backup_label 从控制文件恢复时是正确的,但在有 backup_label 时则不正确。
修复 smgropen() 中的操作顺序(Andres Freund) §
确保在调用 smgr_open 回调之前,SMgrRelation 对象已经完成初始化,这样一旦回调失败,就能正确清理。
移除 pgstat_report_stat() 中不正确的断言 (Michael Paquier) §
修复 gistFindCorrectParent() 中过于严格的断言 (Heikki Linnakangas) §
避免在 maintenance_work_mem 值非常小时,并行 vacuum 中发生断言失败(Masahiko Sawada) §
修复当主库重启时备库中罕见的断言失败 (Heikki Linnakangas) §
在 PL/pgSQL 中,避免当可滚动游标定义在简单 SELECT 查询上时出现 “unexpected plan node type” 错误 (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) §
防止 contrib/pg_freespacemap 的 pg_freespacemap() 中的断言失败 (Tender Wang) §
对没有存储的关系(如视图)应用 pg_freespacemap() 会导致断言失败,尽管在非断言构建中没有不良影响。增加了错误检查以拒绝这种情况。
在 contrib/postgres_fdw 中,避免从子查询中上拉限制条件(Alexander Pyhalov) §
此修复可防止罕见的 “unexpected expression in subquery output” 错误。
修复系统 include 目录中存在旧版 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 用于智利的 Aysén 大区,以反映其改为全年使用 UTC-03,从而与 America/Santiago 产生差异。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。