PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

E.5. 发布 18.1 #

E.5.1. 迁移到版本 18.1
E.5.2. 变更

发布日期:. 2025-11-13

本发行版包含自 18.0 以来的多种修复。有关主版本 18 中新特性的信息,请参见Section E.6。

E.5.1. 迁移到版本 18.1 #

对于运行 18.X 的用户,无需进行转储/恢复。

E.5.2. 变更 #

  • 在 CREATE STATISTICS 中检查模式上的 CREATE 权限(Jelte Fennema-Nio) §

    这一疏漏允许表的所有者在任意模式中创建统计信息,可能导致意外的命名冲突。

    PostgreSQL 项目感谢 Jelte Fennema-Nio 报告此问题。(CVE-2025-12817)

  • 避免 libpq 中分配大小计算里的整数溢出(Jacob Champion) §

    libpq 中有多处在计算所需内存分配大小时不够谨慎。足够大的输入可能导致整数溢出,从而产生过小的缓冲区,进而导致写入超出缓冲区末尾的数据。

    PostgreSQL 项目感谢 Positive Technologies 的 Aleksey Solovev 报告此问题。(CVE-2025-12818)

  • 当 JSON_VALUE 等 SQL/JSON 函数的 DEFAULT 子句中包含 COLLATE 表达式时,避免出现“无法识别的节点类型”错误(Jian He) § §

  • 避免对带分组集且不含变量的 HAVING 子句进行不正确的优化(Richard Guo) § §

  • 不要在哈希右半连接中使用并行(Richard Guo) §

    由于更新该连接的共享哈希表时存在竞态条件,这种情况无法可靠地工作。

  • 避免在创建有序追加(ordered append)计划时可能出现的除零错误(Richard Guo) §

    这个错误可能导致错误地选择代价最低的路径,或者在调试构建中引发断言失败。

  • 修复计划器在处理能够进行有序访问但不支持仅索引扫描的索引类型时的失败(Maxime Schoemans) §

    这一疏漏会导致诸如“仅索引扫描未返回数据”之类的错误。任何核心索引类型都不会出现这种情况,但一些扩展遇到了该问题。

  • 移除 B-tree 索引清理中有误的断言(Peter Geoghegan) §

  • 避免并行构建 GIN 索引期间可能出现的内存耗尽或“无效的内存分配请求大小”失败(Tomas Vondra) §

  • 确保 BRIN 自动汇总(autosummarization)为需要快照的索引表达式提供快照(Álvaro Herrera) § §

    以前,对这类索引进行自动汇总会失败,然后留下占位索引元组,导致索引随时间推移而膨胀。

  • 修复当表包含接近 232 个页面时 BRIN 索引扫描中的整数溢出隐患(Sunil S) §

    这一疏漏可能导致无限循环,或者扫描不需要的表页面。

  • 修复 JIT 生成的元组解构代码中对存储值进行的不正确零扩展(David Rowley) §

    在不使用 JIT 时,等价的代码执行的是符号扩展而非零扩展,导致小整数数据类型具有不同的 Datum 表示。这种不一致在大多数情况下被掩盖了,但已知在使用 Memoize 计划节点时会导致“找不到 memoization 表项”错误,也可能存在其他症状。

  • 修复处理哈希化的 GROUPING SETS 查询时罕见的崩溃(David Rowley) §

  • 修复哈希连接中选择哈希表大小的错误逻辑(Tomas Vondra) §

    哈希连接有时会使用超出预期的内存,或者无法以高效的方式划分内存。

  • 改进统计信息操作函数中的关系查找逻辑(Nathan Bossart) § §

    修复 pg_restore_relation_stats()、 pg_clear_relation_stats()、 pg_restore_attribute_stats() 和 pg_clear_attribute_stats(),使其在获取目标关系上的锁之前(而不是之后)检查权限。

  • 修复为触发器缓存结果关系信息时不正确的逻辑(David Rowley, Amit Langote) §

    当分区的列集与其父分区表的列集在物理上不完全相同时,这一疏漏可能导致崩溃。

  • 修复在分区表上进行 EvalPlanQual 重新检查期间的崩溃(David Rowley, Amit Langote) §

  • 修复 EvalPlanQual 对没有为 EPQ 准备好替代本地连接计划的外部连接或自定义连接的处理(Masahiko Sawada, Etsuro Fujita) §

    在这种情况下,本应正常调用外部或自定义访问方法,但实际并未发生,通常会导致崩溃。

  • 避免在 DETACH CONCURRENTLY 期间重复哈希分区约束(Haiyang Li) §

    ALTER TABLE DETACH PARTITION CONCURRENTLY 的实现会向刚被分离的分区添加一份分区约束的副本。这种做法是错误的,部分原因在于非并发的 DETACH 并不这样做,但更主要的原因是:在哈希分区的情形下,约束表达式中包含对父表 OID 的引用。这会在转储/恢复期间,或者在 DETACH 之后父表被删除时引发问题。在 v19 及更高版本中,我们将完全不再创建任何此类复制的约束。在已发布的分支中,为了尽量降低不可预见后果的风险,仅当被复制的约束针对的是哈希分区时才跳过添加。

  • 禁止在分区键中使用生成列(Jian He, Ashutosh Bapat) §

    这本来就不被允许,但检查漏掉了一些情形,例如列引用隐含在整行引用之中的情况。

  • 禁止在 COPY ... FROM ... WHERE 子句中使用生成列(Peter Eisentraut, Jian He) §

    以前,尝试引用这样的列会导致错误的行为或晦涩难懂的错误消息,因为在执行 WHERE 过滤时,生成列尚未被计算。

  • 防止把带有非空约束、但该约束被标记为无效的列设置为标识列(Jian He) §

    标识列必须为非空,但相关检查漏掉了这种边缘情况。

  • 避免并行清理中潜在的释放后使用(use-after-free)问题(Kevin Oommen Anish) §

    这个缺陷在标准构建中似乎不会造成任何后果,但从理论上讲是一种隐患。

  • 修复 pg_temp 中统计信息对象的可见性检查(Noah Misch) §

    位于临时模式中的统计信息对象在不带模式限定的情况下无法被引用,但 pg_statistics_obj_is_visible() 忽略了这一点,无论如何都可能返回 “true”。其结果是,诸如 pg_describe_object() 之类的函数可能无法按预期对对象名称进行模式限定。

  • 修复数据库创建的 WAL 重放期间的轻微内存泄漏(Nathan Bossart) §

  • 修复 pg_stat_replication 视图中复制延迟的错误报告(Fujii Masao) §

    如果任何备用服务器的重放 LSN 停止前进, write_lag 和 flush_lag 列最终将停止更新。

  • 避免出现关于无效 primary_slot_name 设置的重复日志消息(Fujii Masao) §

  • 避免 synchronized_standby_slots 引用不存在的复制槽时发生失败(Shlok Kyal) §

  • 在将复制槽的状态写入磁盘失败之后,移除未完成的槽状态文件(Michael Paquier) §

    以前,诸如磁盘空间耗尽之类的失败会遗留一个临时的 state.tmp 文件。这会带来问题,因为它会阻碍之后所有写入状态的尝试,需要人工干预才能清理。

  • 修复逻辑复制的并行应用工作者对锁超时信号的错误处理(Hayato Kuroda) §

    同一个信号编号被同时用于工作者关闭和锁超时两种用途,从而造成了混淆。

  • 避免在从流 WAL 源切换到归档 WAL 源时发生不必要的 WAL 接收器关闭(Xuneng Zhou) §

    在时间线切换期间,备用服务器的 WAL 接收器应当保持存活,等待新的 WAL 流式传输起始点。而实际上它却在反复关闭并立即被重新启动,这可能会使状态监控代码产生混淆。

  • 修复 pgoutput 逻辑解码插件所维护的关系同步缓存中的释放后使用问题(Vignesh C, Masahiko Sawada) §

    逻辑解码期间发生的错误可能导致同一会话中后续的逻辑解码尝试出现崩溃。只有当 pgoutput 通过 SQL 函数调用时才可能触及这种情况。

  • 避免对逻辑复制槽进行不必要的失效处理(Bertrand Drouvot) §

  • 在区域设置中重新建立 C 排序规则的特殊情形(Jeff Davis) §

    这修复了后端启动早期、尚未选定数据库之前访问共享目录时的一个回归。对任何核心 PostgreSQL 代码而言,尚不知道这是一个问题,但一些扩展因此被破坏。

  • 修复在检查用户是否拥有 Windows 管理员权限失败时打印消息不正确的问题(Bryan Green) §

    这段代码本来会崩溃,或至少打印出乱码。不过尚未有人报告此类案例,这表明这些系统调用极少发生失败。

  • 避免在使用某些 libsanitizer 选项测试 PostgreSQL 时发生崩溃(Emmanuel Sibi, Jacob Champion) §

  • 修复 64 位 Windows 上调试构建中错误的内存上下文检查警告(David Rowley) §

  • 在 PL/pgSQL 赋值语句中正确处理 GROUP BY DISTINCT(Tom Lane) §

    解析器在此上下文中未能记录 DISTINCT 选项,导致该命令表现得就像普通的 GROUP BY 一样。

  • 避免在 PL/Python 中处理 SQL 错误时泄漏内存(Tom Lane) §

    这修复了之前几个次版本中引入的会话生命周期内存泄漏。

  • 修复 libpq 的 GSSAPI 逻辑中对 Windows 套接字相关错误的处理(Ning Wu, Tom Lane) §

    使用 GSSAPI 加密/解密传输数据的代码未能正确识别连接套接字上的错误状况,因为 Windows 报告这些状况的方式与其他平台不同。这导致在 Windows 上无法建立此类连接。

  • 修复继承表列上非继承非空约束的转储(Dilip Kumar) §

    从 v18 之前的服务器进行转储时, pg_dump 未能保留这类约束。

  • 修复 pg_dump 对外键约束的排序(Álvaro Herrera) §

    确保这些数据库对象具有一致的排序,就像其他对象类型已经做到的那样。

  • 修复 pg_dump 和 pg_restore 数据压缩逻辑中的多种错误(Daniel Gustafsson, Tom Lane) § § §

    若干地方的错误检查缺失或不正确,此外还存在一些可移植性问题,会在大端(big-endian)硬件上显现。这些问题之所以一直被忽视,是因为这段代码仅用于读取目录格式转储中的压缩 TOC 文件。pg_dump 从不生成这样的转储;只有在事后手动压缩 TOC 文件才能触及这种情况,这种做法是受支持的,但非常罕见。

  • 修复 pgbench,使其在启动 COPY 操作时干净地报错退出(Anthonin Bonnefoy) §

    pgbench 无意支持这种情况,但以前它会陷入无限循环。

  • 修复 pgbench 对多个错误的报告(Yugo Nagata) §

    当连续两次 PQgetResult 调用都失败时, pgbench 可能报告错误的错误消息。

  • 在 pgbench 中,修复关于管道模式下错误的有误断言(Yugo Nagata) §

  • 修复 pg_combinebackup 中每个文件的内存泄漏(Tom Lane) §

  • 确保 contrib/pg_buffercache 的函数可以被取消(Satyanarayana Narlapuram, Yuhang Qiu) § §

    一些代码路径能够长时间运行而不检查中断。

  • 修复 contrib/pg_prewarm 对索引的权限检查(Ayush Vatsa, Nathan Bossart) § §

    pg_prewarm() 要求对要预热的关系拥有 SELECT 权限。然而,由于索引自身没有 SQL 权限,这导致非超级用户无法预热索引。现在改为检查索引所属表上的 SELECT 权限。

  • 在 contrib/pg_stat_statements 中,避免当两个或更多常量在 SQL 语句文本中被标记为具有相同位置时发生崩溃(Sami Imseih, Dmitry Dolgov) §

  • 让 contrib/pgstattuple 对空页或无效索引页更加健壮(Nitin Motiani) §

    把全零页计为空闲空间,并忽略那些根据页面特殊空间大小的检查判定为无效的页面。B-tree 索引的代码本来就把全零页计为空闲,但 hash 和 gist 代码会报错退出,实践发现这样做对用户非常不友好。类似地,让这三种情况保持一致:忽略损坏的页面而不是抛出错误。

  • 加固我们的读写屏障宏以满足 Clang 的要求(Thomas Munro) §

    我们原本假定 __atomic_thread_fence() 足以作为屏障,防止 C 编译器围绕它重排内存访问,但对 Clang 而言似乎并非如此,这使得它至少在 RISC-V、MIPS 和 LoongArch 机器上可能生成不正确的代码。为此添加了显式的编译器屏障。

  • 修复 PGXS 构建基础设施,以支持为扩展构建 NLS po 文件(Ryo Matsumura) §