发布日期:. 2023年11月9日
此版本包含从16.0修复的各种问题。 有关16的主要版本中新功能的信息,请参见 第 E.9 节。
对于运行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
列的btree索引条目进行去重
(Noah Misch)
§
有一些可区分但比较相等的interval
值,例如24:00:00
和1 day
。这会破坏btree去重的假设,因此需要排除interval
列
以避免去重。这个疏忽可能导致索引只扫描出现错误结果。此外,在更新后,
amcheck会报告几乎所有这类索引的错误。用户应该重新为
interval
列上的所有btree索引重建索引。
更加合理地处理BRIN datetime_minmax_multi_ops
索引中的
日期
值(Tomas Vondra)
§
日期的距离计算是反向的,导致对于哪些条目合并做出错误决定。索引仍然产生
正确的结果,但效率远低于应有的水平。建议重新为minmax_multi
BRIN索引在date
列上进行重新索引。
更合理地处理大型timestamp
和timestamptz
值,
在BRIN datetime_minmax_multi_ops
索引中
(Tomas Vondra)
§
§
无穷大被错误地视为与其他值的距离为零,而不是一个很大的距离,导致对要合并的条目做出错误决策。
此外,有限但非常大的值(接近可表示的时间戳范围的端点)可能导致内部溢出,再次导致错误决策。
索引仍然可以产生正确的结果,但效率远低于应有的水平。
如果列包含或曾包含无穷大或大的有限值,则建议重新索引minmax_multi
索引,
该索引适用于timestamp
和timestamptz
列。
避免在具有极端区间值的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中,同样的疏忽也可能导致“在RTE中的无效perminfoindex 0与relid NNNN”错误。
修复在btree标记/恢复处理ScalarArrayOpExpr子句中的边界情况 (Peter Geoghegan) §
当将索引扫描恢复到先前标记的位置时,如果扫描恰好在ScalarArrayOpExpr(即,indexcol = ANY(ARRAY[])
)子句的匹配项的末尾,代码可能会错过所需的设置步骤。这可能导致漏掉应该被获取的一些行。
修复 Memoize 执行中的查询内存泄漏 (Orlov Aleksej,David Rowley) §
修复当一个集合返回函数反复返回零行时的查询内存泄漏问题 (Tom Lane) §
如果cursor_to_xmlschema()
应用于非数据返回的门户时,
不要崩溃(Boyu Yang)
§
修复在连续的pg_logical_slot_get_changes()
调用中
不正确共享原始过滤条件的问题 (侯志杰)
§
由一次调用此函数设置的起始条件会被后续未指定起始参数的调用重复使用。 这并非预期的行为。
如果pgrowlocks()
被应用于分区表,则抛出预期的错误
(David Rowley)
§
以前,一个不相关的投诉“只支持堆AM”会被提出。
更加优雅地处理各种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
中留下了浪费的空间(大致等于位置数据的大小)。
在极端情况下,这可能导致在发出时长度未达到限制的向量出现“超过最大总词元长度”的失败。
无论如何,这可能导致磁盘上的空间浪费。
改进对损坏的PGLZ压缩数据的检查(Flavien Guedez) §
修复ALTER SUBSCRIPTION
,以便对run_as_owner
选项的命令更改能够实际生效(侯志杰)
§
修复分区表中的批量表插入问题 (Andres Freund) §
跨分区的不正确插入状态共享可能会导致COPY FROM
期间的失败,
通常表现为“无法读取文件 XXXX 中的块 NNNN:仅读取了 8192 字节中的 0
字节”错误。
在COPY FROM
中,避免评估命令不需要的列默认值
(Laurenz Albe)
§
这可以避免在默认值实际上对列无效,或者默认值的表达式在当前执行 上下文中失败时可能出现的错误。例如,在恢复转储时,有时会出现这 样的边缘情况。以前的版本在这种情况下不会失败,因此防止v16出现 这种情况。
在COPY FROM
中,当需要不支持的编码转换时,能够干净地失败
(Tom Lane)
§
最近的重构意外地删除了对此的预期错误检查,导致它以“函数0的缓存查找失败”结束,而不是一个有用的错误消息。
避免在EXPLAIN
中崩溃,如果一个被标记为由
EXPLAIN
显示的参数具有NULL的启动时值
(Xing Guo, Aleksander Alekseev, Tom Lane)
§
没有内置参数符合这个描述,但是可以通过扩展来定义这样的参数。
确保在删除ON COMMIT DROP
临时表时我们有一个快照
(Tom Lane)
§
这样可以防止可能的错误行为,如果临时表的目录条目有足够宽的字段需要进行TOAST处理(比如一个非常复杂的CHECK
条件)。
避免刚由system()
创建的子进程对关闭信号作出不当响应
(Nathan Bossart)
§
这个修复方案避免了一个竞态条件,即由system()
分叉出的子进程,
但尚未执行预期的子程序,可能会接收并对父服务器进程的信号做出反应。
这将导致执行重复的清理操作,结果将不尽如人意。
处理前端程序中pg_control
的损坏读取
(Thomas Munro)
§
在某些文件系统上,当服务器同时写入pg_control
文件时,读取操作可能不是原子操作。这可以通过坏的CRC来检测。在报告错误之前,尝试几次重试以查看文件是否变为有效。
避免在相关的SQL函数中出现pg_control
的撕裂读取
(Thomas Munro)
§
在读取pg_control
之前获取适当的锁定,以确保我们获得该文件的一致视图。
修复“无法找到用于排序的路径键项”错误,这些错误在规划带有
ORDER BY
或DISTINCT
选项的聚合函数时
发生 (David Rowley)
§
避免在计算后端活动字符串数组大小时发生整数溢出 (Jakub Wartak) §
在64位机器上,我们将允许track_activity_query_size
的值足够大,
以致在乘以允许的连接数时会发生32位溢出。然而,实际分配每个后端本地数组的代码对此并不在意,
并且错误地分配了数组。
修复在继承表上运行ANALYZE
时短暂显示不一致的进度统计
(Heikki Linnakangas)
§
块级计数器应在更新current-relation字段时重置为零。
修复后台写入器以将其进行的任何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
。
这种情况并没有发生,导致出现异常行为或诸如“缓存查找失败”等奇怪错误。
避免在OpenSSL连接设置中发生错误后可能出现的pfree空指针崩溃 (Sergey Shinderuk) §
在检查RECORD
类型的变量时,从外部查询级别正确跟踪嵌套深度
(Richard Guo)
§
这个疏忽可能导致断言失败,核心转储,或“虚假的varno”错误。
跟踪ScalarArrayOpExpr计划节点的哈希函数和否定函数依赖关系 (David Rowley) §
在大多数情况下,这种疏忽是无害的,因为这些函数在节点的原始操作符仍然存在时不太可能消失。
修复RECORD
类型缓存管理中的错误处理问题
(Thomas Munro)
§
在恰到好处的时候发生的内存不足错误可能会留下不一致的状态,导致无限循环。
将内存不足的失败视为致命错误,同时读取WAL (Michael Paquier) §
以前,这将被视为虚假数据条件,导致我们得出了已经到达WAL结尾的结论,这是不正确的, 可能导致WAL重放不一致。
修复由于尝试根据虚假的WAL记录长度字段分配内存而可能导致的恢复失败 (Thomas Munro,Michael Paquier) § §
修复在Windows上出现的“无法复制句柄”错误,当
min_dynamic_shared_memory
设置为大于零时
(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,使选择性恢复能够同时包含表级 和列级ACLs,用于所选表(Euler Taveira,Tom Lane) §
以前,如果两种类型都存在,只有表级ACL会被恢复。
为pg_upgrade添加逻辑以检查是否使用
abstime
、reltime
和
tinterval
数据类型(Álvaro Herrera)
§
这些已过时的数据类型在PostgreSQL版本12中被移除, 因此在声称可以升级之前,请检查一下旧数据库中是否存在这些数据类型。
避免在 Windows 上的pgbench中出现错误的 “过多的客户端连接”错误 (Noah Misch) §
修复vacuumdb处理多个-N
开关的问题(Nathan Bossart, Kuwamura Masaki)
§
多个-N
开关应排除多个模式中的表,但实际上由于生成查询的
构造错误,未排除任何内容。
修复 vacuumdb 以在仅分析模式下遵守其
--buffer-usage-limit
选项 (Ryoga Yoshida, David Rowley)
§
在contrib/amcheck
中,不要将中断的页面删除报告为损坏
(Noah Misch)
§
这个修复程序防止了关于“最左目标页的第一个子页面不是其级别最左”、
“块NNNN不是最左”或“索引XXXX中的左链接/右链接对不一致”的
误报。它们出现在amcheck在未完成的btree索引页删除后
和VACUUM
清理之前运行时。
修复 contrib/btree_gin
索引在 interval
列上的失效问题,
当使用 <
或 <=
操作符进行索引扫描时
(Dean Rasheed)§
这样的索引扫描未能返回所有应该返回的条目。
Xcode 15(随 macOS Sonoma 发布)改变了链接器的行为,导致构建 PostgreSQL 时出现许多重复库警告。这些警告是无害的,但很烦人,因此避免引用相同的库两次。还要删除使用 -multiply_defined suppress
链接器开关,这个开关显然很长时间以来都是无效的,现在却被积极投诉。
在构建contrib/unaccent
的规则文件时,
如果没有指定--with-python
并且没有设置
变量PYTHON
,则回退使用python
(Japin Li)
§
从默认时区缩写列表中移除PHOT
(凤凰群岛时间)
(Tom Lane)
§
默认列表中存在这个缩写词可能会导致在最近的Debian和Ubuntu发行版上失败, 因为它们不再默认安装底层的tzdb条目。由于这是一个为大约两打人口的区域 捏造的缩写词,似乎不太可能有人会错过它。如果有人错过了,他们可以通 过自定义缩写文件将其恢复。