发布日期:. 2023-11-09
本次发布包含来自 16.0 的多项修复。 有关 16 主版本新特性的说明,请参见 Section E.14。
对于运行 16.X 的用户,不需要执行导出/恢复。
但是,已发现若干错误可能导致特定类型的索引产生错误的搜索结果或不必要的低效。 建议在安装此更新后对可能受影响的索引执行 REINDEX。 请参阅下面的第四到第七条变更日志条目。
修复 DISTINCT "any" 聚合函数中未知类型参数的处理 (Tom Lane) §
此错误导致 text 类型的值在运行时被解释为 unknown 类型的值(即零终止字符串)。这可能导致泄露 text 值之后的服务器内存。
PostgreSQL 项目感谢 Jingzhou Fu 报告此问题。 (CVE-2023-5868)
检测计算新数组维度时的整数溢出 (Tom Lane) §
当向超出当前数组边界的数组下标赋值新元素时,在边界情况下可能发生未检测的整数溢出。 这可能导致可被利用来执行任意代码的内存写入,也可能造成服务器内存泄漏。
PostgreSQL 项目感谢 Pedro Gallegos 报告此问题。 (CVE-2023-5869)
防止 pg_signal_backend 角色向后台工作进程和自动清理进程发送信号 (Noah Misch,Jelte Fennema-Nio) § §
文档说明 pg_signal_backend 不能向超级用户拥有的进程发送信号。 它之所以仍能向这些后台进程发送信号,是因为它们声明的角色 OID 为零。 现在将其视为表示超级用户所有权。 就核心代码而言,取消这类进程之一的安全影响相当小(我们只会重新启动一个新的), 但扩展可能会添加更脆弱的后台工作进程。
同时确保 is_superuser 参数在此类进程中被正确设置。该疏忽目前没有已知的具体安全后果,但可能对某些扩展具有重要意义。
PostgreSQL 项目感谢 Hemanth Sandrana 和 Mahendrakar Srinivasarao 报告此问题。 (CVE-2023-5870)
修复 GiST 索引构建期间递归页面分裂时的异常行为 (Heikki Linnakangas) §
修复了页面下行链接位置被错误跟踪的情况,并加入了一些逻辑, 以便从这种情况中恢复,而不是静默地执行错误操作。 此错误可能导致后续索引搜索返回不正确的结果。 建议在安装此更新后重建所有 GiST 索引。
防止对 interval 列的 B-树索引条目进行去重 (Noah Misch) §
存在一些 interval 值彼此不同,但比较结果却相等,例如 24:00:00 和 1 day。这打破了 B-树去重所做的假设,因此 interval 列需要被排除在去重之外。此疏忽可能导致仅索引扫描返回不正确的结果。此外,更新后的 amcheck 将对几乎所有此类索引报告错误。用户应重建 interval 列上的所有 B-树索引。
更合理地处理 BRIN datetime_minmax_multi_ops 索引中的 date 值 (Tomas Vondra) §
日期的距离计算是反向的,导致关于合并哪些条目的决策不佳。索引仍然产生正确的结果,但效率远低于应有的水平。建议重建 date 列上的 BRIN minmax_multi 索引。
更合理地处理 BRIN datetime_minmax_multi_ops 索引中的大 timestamp 和 timestamptz 值 (Tomas Vondra) § §
无穷值被错误地视为与其他值的距离为零而非大距离,导致关于合并哪些条目的决策不佳。此外,有限但非常大的值(接近可表示时间戳范围的端点)可能导致内部溢出,同样导致决策不佳。索引仍然产生正确的结果,但效率远低于应有的水平。如果列包含或曾经包含无穷值或大有限值,建议重建 timestamp 和 timestamptz 列上的 BRIN minmax_multi 索引。
避免在具有极端间隔值的 BRIN interval_minmax_multi_ops 索引中的计算溢出 (Tomas Vondra) §
此错误可能在尝试向此类索引插入大间隔值时导致意外失败。
修复具有多个分区键的哈希分区表的分区步骤生成和运行时分区裁剪 (David Rowley) § §
某些涉及对其中一个分区键使用 IS NULL 条件的情况可能导致崩溃。
修复 MERGE 期间对并发更新行的不一致重新检查 (Dean Rasheed) §
在 READ COMMITTED 模式下,当更新发现其目标行刚刚被并发事务更新时,会在更新后的行上重新检查查询的 WHERE 条件。MERGE 未能确保在此重新检查期间使用其他连接表的正确行,可能导致关于新更新的行是否应被 MERGE 再次更新的错误决策。
即使父表被约束排除,也能正确识别继承的 UPDATE/DELETE/MERGE 中的目标表 (Amit Langote,Tom Lane) § § §
如果最初指定的表被约束排除,但不是所有继承后代都被排除,则第一个未被排除的后代被错误地识别为主目标表。这将导致触发与该表关联的语句级触发器,而不是应该触发的最初指定的表。在 v16 中,同样的疏忽还可能导致 “invalid perminfoindex 0 in RTE with relid NNNN” 错误。
修复 B-树标记/恢复处理 ScalarArrayOpExpr 子句时的边界情况 (Peter Geoghegan) §
当将索引扫描恢复到先前标记的位置时,如果扫描恰好前进到 ScalarArrayOpExpr(即 indexcol = ANY(ARRAY[]))子句匹配项的末尾,代码可能会遗漏必要的设置步骤。这可能导致遗漏应该被获取的一些行。
修复 Memoize 执行中的查询内存泄漏 (Orlov Aleksej,David Rowley) §
修复集合返回函数重复返回零行时的查询内存泄漏 (Tom Lane) §
避免将 cursor_to_xmlschema() 应用于非数据返回的 Portal 时崩溃 (Boyu Yang) §
修复连续 pg_logical_slot_get_changes() 调用之间源过滤条件的不当共享 (Hou Zhijie) §
此函数的一次调用所设置的源条件会被后续未指定源参数的调用重复使用。这不是预期的行为。
当 pgrowlocks() 应用于分区表时抛出预期的错误 (David Rowley) §
之前会引发一个不相关的错误 “only heap AM is supported”。
在各种 SQL 函数中更干净地处理无效索引 (Noah Misch) §
如果 pgstatindex()、pgstatginindex()、pgstathashindex() 或 pgstattuple() 应用于无效索引,则报告错误。如果 brin_desummarize_range()、brin_summarize_new_values()、brin_summarize_range() 或 gin_clean_pending_list() 应用于无效索引,则除了报告调试级别消息外不执行任何操作。之前这些函数会尝试处理该索引,并可能根据失败的 CREATE INDEX 遗留的内容以奇怪的方式失败。
避免在对 to_tsvector() 的长输入时过早出现内存分配失败 (Tom Lane) §
修复 tsvectorrecv() 中构造的 tsvector 的过度分配 (Denis Erokhin) §
如果传入的向量包含位置数据,二进制接收函数会在完成的 tsvector 中留下浪费的空间(大约等于位置数据的大小)。在极端情况下,这可能导致对发出时处于长度限制内的向量出现 “maximum total lexeme length exceeded” 失败。在任何情况下,这都可能导致磁盘空间浪费。
改进对损坏的 PGLZ 压缩数据的检查 (Flavien Guedez) §
修复 ALTER SUBSCRIPTION,使对 run_as_owner 选项的命令更改实际生效 (Hou Zhijie) §
修复向分区表的批量表插入 (Andres Freund) §
跨分区不当共享插入状态可能导致 COPY FROM 期间的失败,通常表现为 “could not read block NNNN in file XXXX: read only 0 of 8192 bytes” 错误。
在 COPY FROM 中,避免计算命令不需要的列默认值 (Laurenz Albe) §
如果默认值对于该列实际上无效,或者默认表达式在当前执行上下文中会失败,这可以避免可能的错误。此类边界情况有时会在恢复转储时出现。之前的版本在此情况下不会失败,因此防止 v16 这样做。
在 COPY FROM 中,当需要不支持的编码转换时干净地失败 (Tom Lane) §
最近的重构意外删除了预期的错误检查,导致出现 “cache lookup failed for function 0” 而非有用的错误消息。
避免在 EXPLAIN 中当标记为由 EXPLAIN 显示的参数具有 NULL 启动时间值时崩溃 (Xing Guo,Aleksander Alekseev,Tom Lane) §
没有内置参数符合此描述,但扩展可以定义此类参数。
确保在删除 ON COMMIT DROP 临时表时有快照可用 (Tom Lane) §
如果临时表的任何目录条目具有足够宽需要 toast 的字段(例如非常复杂的 CHECK 条件),这可以防止可能的异常行为。
避免在 system() 刚刚 fork 的子进程中对关闭信号的不当响应 (Nathan Bossart) §
此修复避免了一个竞态条件:由 system() fork 出的子进程尚未 exec 预期的子程序时,可能会接收并处理针对父服务器进程的信号。这将导致执行重复的清理操作,最终结果不会理想。
在前端程序中处理 pg_control 的撕裂读取 (Thomas Munro) §
在某些文件系统上,当服务器并发写入 pg_control 时,读取该文件可能不是原子操作。这可以通过错误的 CRC 来检测。在报告错误之前重试几次以查看文件是否变为有效。
在相关 SQL 函数中避免对 pg_control 的撕裂读取 (Thomas Munro) §
在读取 pg_control 之前获取适当的锁,以确保获取该文件的一致视图。
修复在规划带有 ORDER BY 或 DISTINCT 选项的聚合函数时出现的 “could not find pathkey item to sort” 错误 (David Rowley) §
避免在计算后端活动字符串数组大小时的整数溢出 (Jakub Wartak) §
在 64 位机器上,我们允许 track_activity_query_size 的值大到在乘以允许的连接数时会导致 32 位溢出。但实际分配每后端本地数组的代码对此不够小心,错误地分配了数组。
修复对继承表执行 ANALYZE 时短暂显示不一致进度统计的问题 (Heikki Linnakangas) §
块级别的计数器应该在更新当前关系字段的同时重置为零。
修复后台写入器以将其进行的任何 WAL 写入报告到统计计数器 (Nazir Bilal Yavuz) §
修复 pgstat_report_wal() 中关于强制刷新行为的混淆 (Ryoga Yoshida,Michael Paquier) §
这可能导致关于 WAL I/O 的某些统计信息在关闭时丢失。
修复临时表扩展的统计跟踪 (Karina Litskevich,Andres Freund) §
这些被计为普通表写入,而它们应该被计为临时表写入。
当启用 track_io_timing 时,将关系扩展操作所花费的时间包括为写入时间 (Nazir Bilal Yavuz) §
跟踪缓存的 CALL 语句的依赖关系,并在需要时重新规划它们 (Tom Lane) §
DDL 命令,例如替换已内联到 CALL 参数中的函数,可能会产生重新规划已被 PL/pgSQL 缓存的 CALL 的需要。之前这不会发生,导致异常行为或奇怪的错误,如 “cache lookup failed”。
避免在 OpenSSL 连接设置出错后可能出现的释放空指针崩溃 (Sergey Shinderuk) §
在检查来自外部查询层级的 RECORD 类型 Var 时正确跟踪嵌套深度 (Richard Guo) §
此疏忽可能导致断言失败、核心转储或 “bogus varno” 错误。
跟踪 ScalarArrayOpExpr 计划节点的哈希函数和否定函数依赖 (David Rowley) §
在大多数情况下,此疏忽是无害的,因为当节点的原始操作符仍然存在时,这些函数不太可能消失。
修复 RECORD 类型缓存管理中的错误处理缺陷 (Thomas Munro) §
在恰好错误的时间点发生内存不足错误可能留下不一致的状态,导致无限循环。
在读取 WAL 时将内存不足失败视为致命错误 (Michael Paquier) §
之前这会被视为数据无效的情况,导致得出已到达 WAL 末尾的结论,这是不正确的,可能导致不一致的 WAL 重放。
修复由于尝试基于伪造的 WAL 记录长度字段分配内存而导致的可能恢复失败 (Thomas Munro,Michael Paquier) § §
修复在 Windows 上当 min_dynamic_shared_memory 设置为零以上时出现的 “could not duplicate handle” 错误 (Thomas Munro) §
修复 GenericXLogFinish 中的操作顺序 (Jeff Davis) §
此代码违反了崩溃安全所需的条件,在标记已更改的缓冲区为脏之前写入 WAL。核心代码没有使用此函数,但扩展使用(例如 contrib/bloom)。
移除 PL/Python 异常处理中的错误断言 (Alexander Lakhin) §
修复 pg_dump 以导出订阅的新 run_as_owner 选项 (Philip Warner) §
由于此疏忽,订阅总是以 run_as_owner 设置为 false 恢复,这与它们在 v16 之前版本中的行为不等价。
修复 pg_restore,使选择性恢复包含所选表的表级和列级 ACL (Euler Taveira,Tom Lane) §
之前,如果两种类型都存在,则只有表级 ACL 会被恢复。
为 pg_upgrade 增加检查 abstime、reltime 和 tinterval 数据类型使用情况的逻辑 (Álvaro Herrera) §
这些过时的数据类型在 PostgreSQL 版本 12 中已被移除,因此在声明可以升级旧数据库之前,请检查以确保它们不存在。
避免在 Windows 上 pgbench 中出现错误的 “too many client connections” 报错 (Noah Misch) §
修复 vacuumdb 对多个 -N 开关的处理 (Nathan Bossart,Kuwamura Masaki) §
多个 -N 开关应该排除多个模式中的表,但实际上由于生成查询的错误构造而没有排除任何内容。
修复 vacuumdb 以在仅分析模式下遵守其 --buffer-usage-limit 选项 (Ryoga Yoshida,David Rowley) §
在 contrib/amcheck 中,不将中断的页面删除报告为损坏 (Noah Misch) §
此修复防止了 “the first child of leftmost target page is not leftmost of its level”、“block NNNN is not leftmost” 或 “left link/right link pair in index XXXX not in agreement” 的误报。如果 amcheck 在未完成的 B-树索引页面删除之后、VACUUM 清理之前运行,就会出现这些误报。
修复 contrib/btree_gin 在 interval 列上的索引失败,当执行使用 < 或 <= 操作符的索引扫描时 (Dean Rasheed) §
此类索引扫描未能返回所有应返回的条目。
消除最近 macOS 上的各种构建时警告 (Tom Lane) § §
Xcode 15(随 macOS Sonoma 发布)更改了链接器的行为,导致在构建 PostgreSQL 时出现许多重复库警告。这些警告虽无害,但很烦人,因此避免了对同一库的重复引用。同时移除了 -multiply_defined suppress 链接器开关,该开关显然长期以来都不起作用,现在还会被明确报告为有问题。
在构建 contrib/unaccent 的规则文件时,如果未给出 --with-python 且未设置 make 变量 PYTHON,则回退使用 python (Japin Li) §
从默认时区缩写列表中移除 PHOT(Phoenix Islands Time) (Tom Lane) §
此缩写在默认列表中的存在可能导致在最近的 Debian 和 Ubuntu 版本上出现失败,因为它们不再默认安装底层的 tzdb 条目。由于这是一个虚构的缩写,用于一个总人口约二十几人的地区,不太可能有人会注意到它的缺失。如果有人需要,可以通过自定义缩写文件将其添加回来。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。