↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 17

E.9. 17.3 发布 #

发布日期:. 2025-02-13

本次发布包含自 17.2 以来的多项修复。有关 17 主版本中新特性的更多信息,请参见第 E.12 节。

E.9.1. 迁移到版本 17.3 #

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

不过,如果你是从早于 17.1 的版本升级,请参见第 E.11 节。

E.9.2. 变更 #

  • 加强 PQescapeString 及相关函数对无效编码输入字符串的防护(Andres Freund,Noah Misch)§ § § § § §

    libpq 提供的数据引用函数现在会完全检查其输入的编码有效性。如果检测到无效字符,会尽可能报告错误。对于缺少错误返回机制的函数,输出字符串会被调整以确保服务器会报告无效编码,并且中间处理不会被恰好匹配单引号、反斜杠等的字节所欺骗。

    此变更的目的是防范在使用这些函数对精心构造的输入进行引用时可能发生的 SQL 注入攻击。当结果字符串直接发送到 PostgreSQL 服务器时没有风险(服务器无论如何都会检查编码),但当它通过 psql 或其他客户端代码传递时存在风险。历史上此类代码未仔细审查编码,在许多情况下如果检测到此类问题也不清楚应该怎么做。

    此修复仅在数据引用函数、服务器以及任何中间处理对所使用的字符编码达成一致时才有效。插入不可信输入到 SQL 命令中的应用程序应特别注意确保这一点。

    不使用这些 libpq 函数而引用不可信输入的应用程序和驱动程序可能面临类似问题的风险。它们应首先确认数据在服务器期望的编码中是有效的。

    PostgreSQL 项目感谢 Stephen Fewer 报告此问题。(CVE-2025-1094)

  • 恢复对连接请求中出现的数据库名和用户名的自动截断(Nathan Bossart)§

    这撤销了 v17 中一项后来证明给部分用户带来麻烦的变更。过长名称本应以感知编码的方式截断,但目前先恢复为此前在 NAMEDATALEN-1 字节处盲目截断的行为。

  • 将并行工作进程排除在连接权限检查和限制之外(Tom Lane)§

    启动并行工作进程时不再检查 datallowconn、rolcanlogin 和 ACL_CONNECT 权限,而是假定领导进程最初通过了类似检查就足够了。这避免了例如当领导进程以缺少登录权限的角色运行时,并行化查询出现意外失败的情况。同样,ReservedConnections、datconnlimit 和 rolconnlimit 限制仅对普通后端执行,且仅计算普通后端的数量来检查是否已达到限制。这些限制旨在防止普通后端过度占用进程槽位——而并行工作进程和其他特殊进程有自己的进程槽池和自己的限制检查。

  • 从 LWLock 等待事件名称中移除“Lock”后缀(Bertrand Drouvot)§

    重构意外导致 pg_stat_activity 视图显示的锁相关等待事件名称带上了“Lock”后缀,这除其他影响外,还破坏了它与 pg_wait_events 的连接。

  • 修复带有 ScalarArrayOp(= ANY)条件的 B-树索引扫描可能无法返回所有匹配元组的问题(Peter Geoghegan)§

  • 修复窗口聚合中可能重用过时结果的问题(David Rowley)§

    具有“运行条件”优化和按引用传递结果类型的窗口聚合可能错误地返回上一个分区的结果,而不是执行新的计算。

  • 保持 TransactionXmin 与 MyProc->xmin 同步(Heikki Linnakangas)§

    此疏忽可能允许进程尝试访问已被清理掉的数据。一个已知的后果是出现临时性的“could not access status of transaction”错误。

  • 修复可能导致无法将新插入的目录条目添加到目录缓存列表中的竞态条件(Heikki Linnakangas)§

    例如,这可能导致在现有会话中无法使用新创建的函数。

  • 防止在系统目录被并发更新时进行 vacuum 可能导致的目录损坏(Noah Misch)§ §

  • 修复关系截断失败时的数据损坏问题(Thomas Munro)§ § §

    执行关系截断所需的文件系统调用可能会失败,导致磁盘上留下不一致的状态(例如,实际上恢复了已删除的数据)。我们无法真正阻止这种情况,但可以通过将此类失败提升为 PANIC 来进行恢复,这样可以通过从 WAL 重放到尝试截断之前来恢复一致性。这并不是一个非常理想的行为,但由于此类失败足够罕见,因此似乎是一个可以接受的解决方案。

  • 防止在关系截断期间启动检查点(Robert Haas)§

    这避免了一种竞态条件,即修改后的文件可能在完成检查点之前未被 fsync,从而在操作系统崩溃后不久产生数据损坏的风险。

  • 避免在 VACUUM 与更改该数据库所有者的 REASSIGN OWNED 并发运行时可能丢失 pg_database.datfrozenxid 更新(Kirill Reshke)§

  • 修复传递给 AFTER UPDATE 触发器的不正确 tg_updatedcols 值(Tom Lane)§

    在某些情况下,tg_updatedcols 位图可能描述的是同一事务中较早命令更新的列集合,从而导致触发器做出错误的操作。

    同时,防止由于制作过多 tg_updatedcols 位图副本而导致的内存膨胀。

  • 修复具有自己引用分区表的外键约束的分区的分离操作(Amul Sul)§

    通常情况下,外键定义在分区表的顶层;但如果外键定义在分区上并引用分区表,且该引用分区被分离,则相关的 pg_constraint 条目会被错误更新。这导致类似“could not find ON INSERT check triggers of foreign key constraint”的错误。

  • 修复 pg_get_constraintdef 对域上的 NOT NULL 约束的支持(Álvaro Herrera)§

  • 修复 to_timestamp 的 FFn 格式代码的错误处理(Tom Lane)§

    紧接在 FFn 之前的整数格式代码会消耗所有可用数字,导致 FFn 没有剩余数字可用。

  • 在反解析 SQL/JSON 查询函数中的 PASSING 子句时,确保在必要时对变量名加双引号(Dean Rasheed)§

  • 在反解析 XMLTABLE() 表达式时,确保必要时对 XML 命名空间名称进行双引号引用(Dean Rasheed)§

  • 在 pg_hba_file_rules() 输出中包含 ldapscheme 选项(Laurenz Albe)§ §

  • 修复在输入列数据类型并不完全匹配时,对预排序 UNION 操作的规划(David Rowley)§

    这个错误可能导致使用错误的排序操作符对数据排序,后果从没有明显问题到 core dump 都有可能。

  • 当列排序规则不一致时不合并 UNION 操作(Tom Lane)§

    之前在判断是否可以安全地将 UNION 步骤合并为单个 N 路 UNION 操作时忽略了排序规则。在引入非确定性排序规则之前这可能是合理的,但现在不再如此,因为使用中的排序规则可以影响唯一性的定义。

  • 防止在将位于外连接下方的子查询上拉后出现“wrong varnullingrels”规划器错误(Tom Lane)§ §

  • 在查找统计信息时忽略 nulling-relation 标记位(Richard Guo)§

    此疏忽可能导致未能使用关于表达式的相关统计信息,或出现“corrupt MVNDistinct entry”错误。

  • 修复分区剪枝步骤中遗漏的表达式处理(Tom Lane)§

    此疏忽可能导致在访问分区表的查询中出现“unrecognized node type”错误以及其他可能的问题。

  • 为 slotsync 工作进程提供独立的进程槽位(Tom Lane、Hou Zhijie)§

    在加入 slotsync 工作进程时忽略了这一点,结果它的进程槽位实际上是从供常规后端进程使用的池中占用的。如果常规后端进程数量逼近 max_connections,这可能导致该工作进程无法启动,或使后续本应按配置成功的连接请求失败。

  • 允许 dshash 表增长超过 1GB(Matthias van de Meent)§

    这避免了诸如“invalid DSA memory alloc request size”之类的错误。例如,在处理数百万个表的事务中可能会出现这种情况。

  • 避免 bringetbitmap() 中可能的整数溢出(James Hunter,Evgeniy Gorbanyov)§

    由于结果仅用于统计目的,此错误的影响大多是修饰性的。

  • 纠正 SLRU bank 编号的错误计算(Yura Sokolov)§

    这个错误导致实际使用的 bank 数量少于预期,从而增加了争用,但没有造成功能性错误。

  • 确保已设置的进程锁存器不会阻止 postmaster 注意到套接字事件(Thomas Munro)§

    在后端启动工作进程和工作进程退出的极重工作负载下,可能导致 postmaster 无法及时响应传入的客户端连接。

  • 防止流复制备库在读取跨页的 WAL 记录时无限循环(Kyotaro Horiguchi,Alexander Kukushkin)§

    当记录的后续部分位于需要从不同 WAL 源读取的页面上时会发生此问题。

  • 修复在进程早期启动阶段 FATAL 错误被意外提升为 PANIC 的问题(Noah Misch)§

    这修复了一些不太可能发生的情况,这些情况会导致“PANIC: proc_exit() called in child process”。

  • 修复操作符族成员操作符或支持函数可能成为悬空引用的情况(Tom Lane)§ §

    在某些情况下,数据类型可能在其 OID 引用仍然存在于 pg_amop 或 pg_amproc 中时被删除。虽然这不会立即造成问题,但尝试删除所属操作符族会失败,并且 pg_dump 在导出该操作符族时会产生错误的输出。此修复使操作符族/类的创建和修改添加必要的依赖条目,以便删除数据类型时也会删除任何依赖的操作符族元素。但这对已存在的有问题的操作符族没有帮助,因此还在 DROP OPERATOR FAMILY 中增加了一个应急措施,以防止在删除具有悬空成员的族时失败。

  • 修复逻辑解码输出中的多个内存泄漏(Vignesh C,Masahiko Sawada,Boyu Yang)§ § §

  • 修复更新 application_name 或 cluster_name 设置时的小型内存泄漏(Tofig Aliev)§

  • 避免后台进程尝试检查 synchronized_standby_slots 的新值时崩溃(Álvaro Herrera)§

  • 避免在测试 wal_skip_threshold 条件时的整数溢出(Tom Lane)§

    创建非常大的关系的事务可能会错误地决定通过将关系复制到 WAL 而非 fsync 来确保持久性,从而否定了 wal_skip_threshold 的意义。(这仅在 wal_level 设置为 minimal 时才有影响,否则无论如何都需要 WAL 复制。)

  • 修复缓存查找期间不安全的操作顺序(Noah Misch)§

    唯一已知的后果是在 GRANT TABLESPACE 期间出现通常无害的“you don't own a lock of type ExclusiveLock”警告。

  • 避免并行清理中潜在的释放后使用问题(Vallimaharajan G、John Naylor)§

    这个 bug 在标准构建中似乎不会造成后果,但理论上仍然存在风险。

  • 修复在较旧 ARM 平台上使用 JIT 时可能出现的“failed to resolve name”失败(Thomas Munro)§

    这可能是由于 gcc 和 clang 之间对 -moutline-atomics 默认设置不一致导致的。至少已知 Debian 和 Ubuntu 提供了针对 armv8-a 的 gcc 和 clang 编译器,但它们在默认使用 outline atomics 方面存在差异。

  • 修复 WITH RECURSIVE ... UNION 查询中的断言失败(David Rowley)§

  • 避免在集合操作叶查询包含集合操作时规则反解析中的断言失败(Man Zeng,Tom Lane)§

  • 避免并行查询启动时的边界情况断言失败(Tom Lane)§

  • 修复关闭时写出统计文件的断言失败(Michael Paquier)§

  • 避免 valgrind 对字符串 hash 代码发出告警(John Naylor)§

  • 在 NULLIF() 中,避免将可读写的扩展对象指针传递给数据类型的等值函数(Tom Lane)§

    如果给定可读写指针,等值函数可能会修改或删除该对象,如果我们随后决定将其作为 NULLIF() 的结果返回,这将是有问题的。对于任何内置等值函数可能没有问题,但用 PL/pgSQL 编写的函数很容易展示出故障。

  • 确保对 INSERT 中默认空值的表达式预处理被正确应用(Tom Lane)§

    如果目标列是域类型,规划器必须插入一个强制转换到域的步骤而不仅仅是一个空常量,而此表达式遗漏了一些必要的处理步骤。对于基于核心数据类型的域没有已知后果,但理论上对于基于扩展类型的域可能会出错。

  • 避免在已含有数据的关系 fork 上启动批量写入时发生数据丢失(Matthias van de Meent)§

    任何已有数据都会被零值覆盖。核心 PostgreSQL 本身从不会这么做,因此不受影响;不过某些扩展可能希望这样做。

  • 避免服务器进程试图遍历一个并非由自己创建的共享 radix tree 时崩溃(Masahiko Sawada)§

    核心 PostgreSQL 中没有任何代码会这样做,但扩展可能会有这种需求。

  • 修复 PL/Python 中的内存泄漏(Mat Arye,Tom Lane)§

    重复使用 PLyPlan.execute 或 plpy.cursor 会导致在调用 PL/Python 函数的持续时间内产生内存泄漏。

  • 修复 PL/Tcl 使其能在 Tcl 9 下编译(Peter Eisentraut)§

  • 在 ecpg 预处理器中,修复引用超出作用域变量的游标可能被错误处理的问题(Tom Lane)§

  • 在 ecpg 中,修复关于不支持使用 COPY ... FROM STDIN 的编译时警告(Ryo Kanbayashi)§

    之前,由于拼写错误,预期的警告未被发出。

  • 修复 psql 以安全处理以 SJIS 编码的文件路径名(Tom Lane)§

    SJIS 中的一些双字节字符的第二个字节等于 ASCII 反斜杠(\)。这些字符会被路径名规范化所损坏,导致无法访问名称中包含此类字符的文件。

  • 为 psql 增加 COPY (MERGE INTO) 的 Tab 补全(Jian He)§

  • 修复 pgbench 和 psql 中使用错误版本的 pqsignal() 的问题(Fujii Masao,Tom Lane)§

    此错误可能导致在 pgbench 中使用 -T 选项或在 psql 中使用 \watch 命令时出现异常行为,原因是被中断的系统调用未能按预期恢复。

  • 修复 pgbench 中某些嵌套 \if 构造的错误执行(Michail Nikolaev)§

    出现在为假(未执行)的 \if 分支中的 \if 命令被错误地当作 \elif 处理。

  • 在 pgbench 中,修复表初始化期间进度消息可能显示错误的问题(Yushi Ogiwara,Tatsuo Ishii,Fujii Masao)§ §

  • 增强 pg_controldata 对损坏的 pg_control 文件的健壮性(Ilyasov Ian,Anton Voloshin)§

    由于 pg_controldata 即使在 CRC 检查失败时也会尝试打印 pg_control 的内容,因此必须注意不要因无效字段值而出现异常行为。此补丁修复了无效时间戳和看似为负数的 WAL 段大小触发的一些问题。

  • 修复 pg_dump 中当身份序列附加到作为扩展成员的表时可能崩溃的问题(Tom Lane)§

  • 修复 pg_restore 处理 zstd 压缩数据时的内存泄漏(Tom Lane)§

    该泄漏是每次解压缩操作都会发生的,因此在包含许多表或大对象的导出中最为明显。

  • 修复 pg_basebackup 以正确处理 Windows 上超过 2GB 的 pg_wal.tar 文件(Davinder Singh,Thomas Munro)§ §

  • 在 contrib/earthdistance 的 SQL 语言函数声明中使用 SQL 标准函数体(Tom Lane,Ronan Dunklau)§

    此变更允许在扩展创建期间解析其对 contrib/cube 的引用,降低了基于搜索路径的失败和可能攻击的风险。

    特别是,这恢复了它们在生成列等上下文中的可用性,PostgreSQL v17 出于安全原因限制了这些上下文中的搜索路径。我们收到了由于此原因导致数据库无法升级到 v17 的报告。此补丁包含在 v16 中以提供一个解决方案:事先将 earthdistance 扩展更新到此版本应该可以使升级成功。

  • 检测 contrib/pageinspect 的 SQL 声明与底层共享库之间的版本不匹配(Tomas Vondra)§

    此前,这种不匹配在调用 brin_page_items() 时可能导致崩溃。现在则会抛出一条建议更新扩展的错误消息。

  • 在尝试取消 contrib/postgres_fdw 中的远程查询时,如果取消请求看起来没有生效,则会重发数次(Tom Lane)§

    这修复了一种竞争条件:我们可能在远程服务器尚未开始处理刚发出的查询前就尝试取消它,从而导致首次取消请求被忽略。

  • 更新确定访问 ARM CRC 指令所需编译器开关的配置探测(Tom Lane)§

    在基线 CPU 目标缺少 CRC 指令的 ARM 平台上,我们需要提供 -march 开关来说服编译器编译此类指令。较新版本的 gcc 会拒绝我们尝试使用的值,导致静默回退到软件 CRC。

  • 修复 meson 构建系统,使其在 Windows 上支持旧版 OpenSSL 库(Darek Slusarczyk)§

    新增对旧式库名 ssleay32 和 libeay32 的支持。

  • 在使用 meson 的 Windows 构建中,确保所有 libcommon 和 libpgport 函数都被导出(Vladlen Popolitov,Heikki Linnakangas)§ §

    这修复了扩展的“unresolved external symbol”构建错误。

  • 修复 meson 配置过程,使其能够在 MSVC 下正确检测 OSSP 的 uuid.h 头文件(Andrew Dunstan)§

  • 使用 meson 构建时,将 pgevent 安装到 pkglibdir 而不是 bindir(Peter Eisentraut)§

    这与基于 make 的构建系统和旧的 MSVC 构建系统的行为一致。

  • 使用 meson 构建时,将 sepgsql.sql 安装到 share/contrib/ 而不是 share/extension/(Peter Eisentraut)§

    这与基于 make 的构建系统的行为一致。

  • 更新时区数据文件至 tzdata 2025a 版本,包含巴拉圭的夏令时法律变更以及菲律宾的历史修正(Tom Lane)§

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.