受支持版本: 当前版本 (18)

E.3. 发布版本 18.2 #

发布日期:. 2026-02-12

本次发布包含来自 18.1 的多项修复。 有关 18 主版本新特性的说明,请参见 Section E.5

E.3.1. 迁移到版本 18.2 #

对于运行 18.X 的用户,不需要执行导出/恢复。

但是,如果你在 ltree 列上建有索引,则更新后可能需要对其重新索引。请参见下方第六条变更记录。

E.3.2. 变更 #

  • 防止 oidvector/int2vector 出现意外的维度 (Tom Lane) §

    这些数据类型预期为不含空值的一维数组,但某些类型转换路径允许违背这些预期。 现已为一些原本依赖这些预期却未加验证的函数补充检查,因为它们可能因此产生错误行为。

    PostgreSQL 项目感谢 Altan Birler 报告此问题。 (CVE-2026-2003)

  • 加固选择性估算器,防止将其附加到接受非预期数据类型的操作符上 (Tom Lane) § §

    contrib/intarray 包含一个选择性估算函数;由于它未检查输入是否为预期的数据类型, 该函数可被滥用来执行任意代码。第三方扩展也应检查是否存在类似风险, 并采用 intarray 现在使用的技术来增加防护。 由于此类扩展的修复需要时间,我们现在要求具有超级用户权限,才能将非内置的选择性估算器附加到操作符上。

    PostgreSQL 项目感谢 Daniel Firer(zeroday.cloud 成员)报告此问题。 (CVE-2026-2004)

  • 修复 contrib/pgcrypto PGP 解密函数中的缓冲区溢出问题 (Michael Paquier) §

    使用超长会话密钥解密精心构造的消息会导致缓冲区溢出, 严重时甚至可能执行任意代码。

    PostgreSQL 项目感谢 Team Xint Code(zeroday.cloud 成员)报告此问题。 (CVE-2026-2005)

  • 修复多字节字符长度验证不充分的问题 (Thomas Munro,Noah Misch) § § § § § §

    多处漏洞使攻击者只要能够发出精心构造的 SQL,就可能溢出字符串缓冲区, 严重时甚至可以执行任意代码。应用这些修复后,当字符串函数处理数据库中存储的无效文本时, 应用程序可能会看到 invalid byte sequence for encoding 错误。

    PostgreSQL 项目感谢 Paul Gerste 和 Moritz Sanft(zeroday.cloud 成员)报告此问题。 (CVE-2026-2006)

  • 加固 contrib/pg_trgm,以应对字符串转小写行为的变化(Heikki Linnakangas) § §

    修复潜在的缓冲区越界问题,因为在某些区域设置中,将字符串转换为小写后产生的字符数可能多于原始字符串中的字符数(而非字节数)。这种行为是版本 18 中新增的,因此该缺陷也是新引入的。

    PostgreSQL 项目感谢 Heikki Linnakangas 报告此问题。 (CVE-2026-2007)

  • 修复 contrib/ltree 中不一致的大小写不敏感匹配问题(Jeff Davis) § §

    ltree 中与索引相关的例程所使用的大小写折叠实现与主操作符不同。只有在默认排序规则提供者为 libc 且编码为单字节时,两者行为才一致。

    为修复该问题,代码已改为使用数据库默认排序规则的大小写折叠行为。除非数据库使用 libc 作为排序规则提供者且其编码为单字节,否则此更改要求对 ltree 列上的索引重新建立索引(无论索引访问方法为何)。否则,使用这些索引的搜索将无法找到相关条目。

  • 使用 ALTER TABLE ... ADD CONSTRAINT 为列添加显式命名的非空约束时,如果该列已经标记为 NOT NULL,则要求所提供的名称与现有约束名称一致(Álvaro Herrera、Srinath Reddy Sadipiralla)。 §

  • 不允许由子查询中的 CTE 引用决定聚合函数的语义层级 (Tom Lane) §

    此变更撤销了两个小版本之前引入的一项更改;现在,如果某个子查询引用的 CTE 所处层级 低于按标准 SQL 规则依据其中的列引用和聚合所判定的聚合语义层级,将抛出错误。 先前的修复方案本身也带来了问题,而且目前尚不清楚应如何处理。由于 SQL 标准本就完全不允许在聚合中包含子查询, 将此类情况视为错误似乎已经足够。

  • 修复 CTE 查询中 MERGE 的触发器过渡表捕获问题 (Dean Rasheed) §

    当执行包含 MERGE 和另一个对具有语句级 AFTER 触发器的表的 DML 操作的数据修改 CTE 查询时,传递给触发器的过渡表将不包含 MERGE 影响的行,而只包含其他操作影响的行。

  • 修正属于非关系范围条目的行标记的不正确浏览, 如子序列( Dean Rasheed) §

    如果需要通过EvalPlanQual的重新检查来修改拟议的行更新,结果就会不正确,如果该行同时更新,情况也可能如此。

  • 修复当分区目标表的所有子表在 UPDATE 或 DELETE 操作中都被裁剪时的失败问题 (Amit Langote) §

    在这种情况下,执行器可能报告 could not find junk ctid column 错误,即使实际上无需执行任何操作。

  • 修正数组下标中子选择的表达式评价错误( Andres Freund) §

  • 修正文本子字符串搜索, 用于非决定性的整理( Laurenz Albe) §

    在使用非决定性的整理时,我们未能发现在搜索字符串的末尾发生的匹配.

  • 避免当查询包含重复的窗口函数调用时规划器可能出现的失败 (Meng Zhang,David Rowley) §

    对此类调用去重时的混淆可能导致诸如 WindowFunc with winref 2 assigned to WindowAgg with winref 1 之类的错误。

  • 用设置返回函数和组合集修复规划器错误(Richard Guo) §

    在构建ProjectSet计划节点时,计划员未能发现涉及分组表达式的子表达式已经由输入计划计算出来. 这导致了计划效率低下或错误,例如: 子计划目标列表中找不到的变量.

  • 避免在子query的分组条款包含挥发或设置返回功能时不正确的优化(Richard Guo) §

    规划器会尝试下推引用此类分组列的外层查询限制,这会因为对易变函数进行多次求值而导致错误行为,或者因将返回集合的函数引入子查询的 WHERE/HAVING 子句而报错。

  • 在搜索表达式的统计信息时穿透 PlaceHolderVar 节点(Richard Guo) §

    此更改允许规划器找到从子查询上拉出来的表达式,或用于 GROUP BY 的表达式的相关统计信息,从而避免退回到默认估算值。(严格来说,我们也许应该调整找到的统计信息,以反映该值为 NULL 的概率增加,但对于普通 Var 我们也从未做过同等处理。)这一限制虽由来已久,但 PostgreSQL 18 让 PlaceHolderVar 的出现比以前更常见,因此做出此修改以避免受影响场景中的计划回退。

  • 在将表达式匹配到索引时穿透无操作的 PlaceHolderVar 节点(Richard Guo) §

    由于 PostgreSQL 18 在更多场景下使用 PlaceHolderVar,一些原本可以使用索引的查询反而不能使用索引了。新增相应逻辑以防止这种回退。

  • 修复规划器将 OR 子句转换为 ScalarArrayOp 索引条件时的问题(Tender Wang、Tom Lane) §

    该代码未能正确处理 RelabelType 节点,可能生成无效表达式,或者无法完成本应有效的转换。

  • 允许在部分哈希索引上进行索引扫描,即使索引的谓词蕴含 WHERE 子句的真值 (Tom Lane) §

    通常我们会删除被谓词蕴含的 WHERE 子句,因为测试它没有意义——对于每个索引条目, 该条件必然成立。然而,如果索引是需要在前导索引键上有 WHERE 子句的类型(如哈希索引), 这样做会阻止创建索引扫描计划。在考虑此类索引时,不要删除被蕴含的子句。

  • 不要为非日志 BRIN 索引生成 WAL(Kirill Reshke) §

    一条很少执行到的代码路径错误地为 BRIN 索引生成了 WAL 记录,即使该索引被标记为非日志。 崩溃恢复时将无法重放该记录,并报告文件已存在的错误。

  • 在并行 GIN 索引构建中使用正确的排序函数(Tomas Vondra) §

    并行代码使用了默认排序操作符(由列数据类型的 btree 操作符类决定),而它本应在存在时使用 GIN 操作符类指定的排序函数。如果该数据类型没有 btree 操作符类,就会失败;如果操作符类指定的排序函数与 btree 操作符类不一致,则会生成无效索引。

  • 防止截断未读 NOTIFY 消息仍然需要的 CLOG (Joel Jacobson,Heikki Linnakangas) § § §

    此修复防止了当后端进程吸收 NOTIFY 消息较慢时出现的 could not access status of transaction 错误。

  • NOTIFY 消息处理期间发生的错误升级为 FATAL, 即关闭连接(Heikki Linnakangas) §

    以前,如果后端在吸收 NOTIFY 消息时遇到错误, 它会跳过该消息,向客户端报告错误,然后继续运行。但这种行为存在很多问题。 一个主要问题是,客户端没有好的方法来知道通知丢失了, 更无法知道通知的内容是什么。根据应用逻辑的不同, 错过一条通知可能导致应用程序卡在等待状态。此外,剩余的消息在有人发送新的 NOTIFY 之前不会被处理。

    另外,如果连接在接收到 NOTIFY 信号时处于空闲状态, 由于无关的原因,任何 ERROR 都会被升级为 FATAL。因此, 我们选择在所有情况下都这样做,以保持一致性, 并向应用程序提供一个明确的信号,表明它可能错过了一些通知。

  • 在计算查询 ID 哈希时纳入分组表达式(Jian He) §

    以前,两个除了 GROUP BY 表达式不同之外其余都相同的查询,会被 contrib/pg_stat_statements 以及其他使用查询 ID 的模块合并在一起。

  • 修复在发生并发更新时 EXPLAIN ANALYZE MERGE 对更新计数错误的问题(Dean Rasheed) §

    这种情况会导致 EXPLAIN 输出中的 skipped 元组计数错误,或者在启用断言的构建中引发断言失败。

  • 修复在锁定元组时跟踪更新链的错误(Jasper Smit) §

    此代码路径忽略了检查更新链中第一个新元组的 xmin, 使得在原始更新者中止且空间被 VACUUM 立即回收并重新使用的情况下, 可能会锁定一个不相关的元组。 这可能导致意外的事务延迟或死锁。 与识别到错误元组相关的错误也已被观察到。

  • 修复对大表增量备份处理不正确的问题(Robert Haas、Oleg Tkachenko) §

    如果一个超过 1GB 的表(更一般地说,超过安装的段大小的表)在基础备份和增量备份之间被 VACUUM 截断,pg_combinebackup 可能会因 truncation block length in excess of segment size 错误而失败,从而无法恢复该增量备份。

  • 修复后端进程在退出时由于尝试在已取消映射的共享内存段中释放锁而可能崩溃的问题 (Rahila Syed) §

  • 修复异步 I/O 代码中的竞争条件(Andres Freund) §

    异步 I/O 操作的结果码有可能在被读取之前就被覆盖。

  • 防止崩溃后多事务日志被错误截断(Heikki Linnakangas) §

  • 修复 pg_stat_get_backend_activity() 可能返回编码错误的结果的问题 (Chao Li) §

    保存会话活动字符串的共享内存缓冲区末尾可能包含不完整的多字节字符。 读取者应该截断掉任何此类不完整字符,但此函数未能做到这一点。

  • 防止递归的内存上下文日志记录(Fujii Masao) §

    持续不断的请求内存上下文日志记录的信号流可能导致日志记录代码的递归执行, 理论上可能导致栈溢出。

  • 修复重新初始化并行执行上下文时的内存上下文使用问题 (Jakub Wartak,Jeevan Chalke) §

    此错误可能由于附属数据结构的生命周期比并行上下文更短而导致崩溃。 已知仅使用核心 PostgreSQL 无法触发该问题, 但我们收到了扩展中出现问题的报告。

  • 在创建新的多事务 ID 时设置下一个多事务 ID 的偏移量,以消除在边界情况下所需的等待循环 (Andrey Borodin) § §

    之前的逻辑可能会卡在等待一个永远不会发生的更新上。

  • 避免多次重写数据修改 CTE(Bernice Southey, Dean Rasheed) §

    以前,在更新自动可更新视图或带规则的关系时,如果原始查询含有数据修改 CTE, 重写器会由于递归而多次重写这些 CTE。这不仅低效, 而且当 CTE 包含对始终生成列的更新时可能产生虚假错误。

  • 允许重试 DSM 注册表条目的初始化(Nathan Bossart) §

    如果动态共享内存条目的初始化进行到一半失败,允许下一次尝试使用该条目时重新初始化。此前,该条目会永久处于失败状态。

  • 避免在页面被换出时 NUMA 状态视图失败(Tomas Vondra) §

  • 避免在使用较旧 libnuma 版本查询 NUMA 页面状态时出现 operation not permitted 错误(Tomas Vondra) §

  • 如果 WAL 不存在到检查点记录所指示的重做点,则使恢复失败 (Nitin Jadhav) §

    在开始恢复之前添加一个显式检查,以确保不会造成损害并提供有用的错误消息。 以前,在这种情况下恢复可能会崩溃或损坏数据库。

  • 避免在 ALTER PUBLICATION 期间修改源查询树(Sunil S) §

    此错误的可见效果是,为该查询触发的事件触发器只能看到第一个 publish 选项,即使指定了多个选项。如果此类查询被设置为预备语句,重新执行时也会出现错误行为。

  • CREATE SUBSCRIPTION ... CONNECTION 中指定的连接选项传递给发布端的 walsender 进程 (Fujii Masao) §

    在此修复之前,options 连接选项(如果有的话)会被忽略, 因此,例如无法在 walsender 会话中设置自定义服务器参数值。 该功能本应正常工作;在 PostgreSQL 15 中的重构破坏它之前,它也确实一直是正常工作的, 因此这里恢复了先前的行为。

  • 防止新创建或新同步的复制槽被无效化 (Zhijie Hou) § § §

    与并发检查点的竞争条件可能导致复制槽所需的 WAL 被删除, 使得该槽立即被标记为无效。

  • 修复计算复制槽所需 xmin 时的竞争条件 (Zhijie Hou) §

    这可能导致错误 cannot build an initial slot snapshot as oldest safe xid follows snapshot's xmin

  • 在逻辑复制订阅的初始同步期间,在开始复制数据之前提交 pg_replication_origin 条目的添加 (Zhijie Hou) §

    以前,如果复制步骤失败,新的 pg_replication_origin 条目 会因事务回滚而丢失,从而导致共享内存中的状态不一致。

  • 在并行工作进程应用失败后不推进逻辑复制进度(Zhijie Hou) §

    之前的行为允许订阅者丢失事务。

  • 修复逻辑复制 slotsync 工作进程对 LOCK_TIMEOUT 信号的处理(Zhijie Hou) §

    以前,这类超时信号实际上会被忽略。

  • 修复流复制副本服务器重启期间可能出现的 unexpected data beyond EOF 失败问题(Anthonin Bonnefoy) §

  • 修复 SQL/JSON 路径类型不匹配时的错误报告(Jian He) §

    该代码原本应报告路径表达式类型不正确,却可能产生 cache lookup failed for type 0 错误。

  • 修复解析分区范围边界时对列位置的错误跟踪(myzhen) §

    这可能导致在关于将分区边界值转换为列的数据类型的错误消息中引用错误的列名。

  • 修复错误消息中的各种小错误(Man Zeng,Tianchen Zhang) § § § § §

    例如,关于备份清单中时间线编号不匹配的错误报告在应该显示结束时间线编号的地方 显示了起始时间线编号。

  • 修复在使用 LLVM 17 或更高版本进行 JIT 编译时无法执行函数内联的问题 (Anthonin Bonnefoy) §

  • 调整我们的 JIT 代码以兼容 LLVM 21(Holger Hoffstätte) §

    之前的代码在 aarch64 机器上编译失败。

  • 修复 aarch64 专用代码,使其可与旧版(RHEL7 时代)的系统头文件一起构建(Tom Lane) § §

  • 修复对 io_uring_queue_init_mem() 的错误 configure 检测(Masahiko Sawada) §

    该错误导致在基于 autotools 的构建中无法优化异步 I/O 缓冲区分配,尽管使用 meson 构建时这段代码是可用的。这个遗漏的主要影响是后端进程退出速度比应有的更慢。

  • 增加新的服务器参数 file_extend_method 来控制 posix_fallocate() 的使用(Thomas Munro) §

    PostgreSQL 版本 16 及更高版本会使用 posix_fallocate()(如果平台提供的话)来扩展关系文件。 然而,据报告这与某些文件系统交互不良:BTRFS 压缩会因使用 posix_fallocate() 而被禁用, 而在较旧的 Linux 内核版本中 XFS 可能会产生虚假的 ENOSPC 错误。 为提供一种解决方案,引入了这个新的服务器参数。将 file_extend_method 设置为 write_zeros 将使服务器回退到通过写入零字节块来扩展文件的旧方法。

  • 在 Windows 上遵守 open()O_CLOEXEC 标志(Bryan Green,Thomas Munro) § § §

    使此标志像在 POSIX 平台上一样工作,以避免将文件句柄泄露到子进程(如 COPY TO/FROM PROGRAM)中。虽然该泄露没有造成太多问题, 但它似乎是不可取的。

  • 修复在使用 meson 构建的 Solaris 可执行文件中无法解析服务器命令行长选项的问题 (Tom Lane) §

  • 支持在 GNU/Hurd 上更改进程标题(Michael Banck) §

  • 修复 psqlVACUUM 选项值的 Tab 补全(Yugo Nagata) §

  • psql 命令提示符中,如果没有服务器连接,则不要显示 %P(管道状态)的值(Chao Li) §

    这使 %P 的行为与其他依赖当前活动连接的提示符转义序列保持一致。

  • 修复 pg_dump 收集序列值的逻辑(Nathan Bossart) § §

    如果某个序列在转储过程中被并发删除,pg_dump 会失败,即使该序列并不在待转储的数据库对象中。另外,如果调用用户没有权限读取序列值,pg_dump 先前会输出错误的值,而不是像预期那样失败。

  • 修复 pg_dumpoauth_validator_libraries 取值的引号处理可能不正确的问题(ChangAo Chen) §

    如果 pg_dump 需要转储该设置的值,它此前会应用错误的引用规则。

  • 避免 pg_dump 在 binary-upgrade 模式下触发断言失败(Vignesh C) §

    对象排序代码未能处理订阅关系对象,从而触发断言,不过在生产构建中并未发现严重的实际影响。

  • 修复 pipeline 模式下 pgbench 在有多个 \syncpipeline 命令时的错误处理问题(Yugo Nagata) §

    如果在查询错误之后又遇到多个 \syncpipeline 命令,pgbench 会报告 failed to exit pipeline mode,或者在启用断言的构建中触发断言失败。

  • 使 pg_resetwal 在更改 OldestXID 时打印更新后的值 (Heikki Linnakangas) §

    它对可以更改的其他每个变量都已经这样做了。

  • 使 pg_resetwal 允许将下一个多事务 xid 设置为 0 或将下一个多事务偏移量设置为 UINT32_MAX (Maxim Orlov) §

    这些是有效的值,因此拒绝它们是不正确的。在最坏的情况下, 如果恰好在多事务回卷点尝试 pg_upgrade,升级将失败。

  • contrib/amcheck 中,为 btree 索引父节点检查使用正确的快照 (Mihail Nikalayeu) § §

    之前的代码在检查使用 CREATE INDEX CONCURRENTLY 创建的索引时 会产生虚假错误。

  • 修复 contrib/amcheck 以正确处理 half-dead btree 索引页面 (Heikki Linnakangas) §

    amcheck 期望此类页面有一个父级下行链接,但实际上没有, 导致关于 mismatch between parent key and child high key 的虚假错误报告。

  • 修复 contrib/amcheck 以正确处理不完整的 btree 根页面分裂 (Heikki Linnakangas) §

    amcheck 可能会报告关于 block is not true root 的虚假错误。

  • 修复 contrib/pg_buffercache 中过度分配内存的问题(David Geier) §

    代码分配的内存是NUMA页面状态需要的两倍.

  • 修复 contrib/intarray@@ 选择性估算器的边界情况整数溢出问题(Chao Li) §

    这可能导致在涉及最大整数值的情况下产生不准确的选择性估算。

  • 修复 contrib/ltree 中的多字节编码问题 (Jeff Davis) §

    之前的代码可能将不完整的多字节字符传递给 lower(), 可能导致不正确的行为。

  • 避免当 contrib/pg_stat_statements 处理包含常量和非常量表达式的 IN 列表时发生崩溃(Sami Imseih) §

  • 将时区数据文件更新到 tzdata 2025c 版本(Tom Lane) §

    唯一的变更是下加利福尼亚 1976 年之前时间戳的历史数据。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。