发布日期:. 2023年11月9日
这个版本包含了从15.4版本中的各种修复。 有关主要版本15中新功能的信息,请参见第 E.8 节。
对于运行15.X版本的用户,不需要进行dump/restore操作。
然而,已经发现了几个错误,可能导致某些类型的索引产生错误的搜索结果或者效率低下。
建议在安装此更新后对可能受影响的索引进行REINDEX
。
请参阅下面的第四至第七个变更日志条目。
另外,如果您正在从早于15.4版本升级,请参见第 E.4 节。
修复在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
索引中更加合理地处理date
值
(Tomas Vondra)
日期的距离计算是反向的,导致对于哪些条目合并做出错误决定。索引仍然产生
正确的结果,但效率远低于应有的水平。建议重新为minmax_multi
BRIN索引在date
列上进行重新索引。
在BRIN datetime_minmax_multi_ops
索引中更加合理地处理大型timestamp
和timestamptz
值
(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标记/恢复处理的边缘情况(Peter Geoghegan)
当将索引扫描恢复到先前标记的位置时,如果扫描恰好在ScalarArrayOpExpr(即,indexcol = ANY(ARRAY[])
)子句的匹配项的末尾,代码可能会错过所需的设置步骤。这可能导致漏掉应该被获取的一些行。
修复Memoize执行中的查询内存泄漏 (Orlov Aleksej, David Rowley)
修复了当一个返回集合的函数重复返回零行时的内部查询内存泄漏(Tom Lane)
如果将cursor_to_xmlschema()
应用于非数据返回的Portal,不要崩溃 (Boyu Yang)
如果将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
留下了什么。
修复pg_stat_reset_single_table_counters()
函数,使其在共享目录上执行正确操作(Masahiro Ikeda)
以前的重置是无效的。
避免在向to_tsvector()
函数输入长字符串时出现过早的内存分配失败(Tom Lane)
修复了tsvector
在tsvectorrecv()
中的过度分配问题(Denis Erokhin)
如果传入的向量包含位置数据,则二进制接收函数在生成的tsvector
中留下了浪费的空间(大致等于位置数据的大小)。
在极端情况下,这可能导致在发出时长度未达到限制的向量出现“超过最大总词元长度”的失败。
无论如何,这可能导致磁盘上的空间浪费。
修复gtsvector_picksplit()
中的错误编码(Alexander Lakhin)
这可能导致在tsvector
列上的GiST索引中做出不良的页面拆分决策。
改进对损坏的PGLZ压缩数据的检查(Flavien Guedez)
在COPY FROM
中,当需要不支持的编码转换时,进行干净的失败处理(Tom Lane)
最近的重构意外地删除了对此的预期错误检查,导致它以“函数0的缓存查找失败”结束,而不是一个有用的错误消息。
避免在EXPLAIN
中崩溃,如果一个参数被标记为由EXPLAIN
显示,
其中一个参数具有空的启动时间值(Xing Guo,Aleksander Alekseev,Tom Lane)
没有内置参数符合这个描述,但是可以通过扩展来定义这样的参数。
确保在删除ON COMMIT DROP
临时表时拥有一个快照(Tom Lane)
这样可以防止可能的错误行为,如果临时表的目录条目有足够宽的字段需要进行TOAST处理(比如一个非常复杂的CHECK
条件)。
避免在由system()
刚刚fork出的子进程中对关闭信号做出不当响应
(Nathan Bossart)
这个修复方案避免了一个竞态条件,即由system()
分叉出的子进程,
但尚未执行预期的子程序,可能会接收并对父服务器进程的信号做出反应。
这将导致执行重复的清理操作,结果将不尽如人意。
处理前端程序中pg_control
的损坏读取(Thomas Munro)
在某些文件系统上,当服务器同时写入pg_control
文件时,读取操作可能不是原子操作。这可以通过坏的CRC来检测。在报告错误之前,尝试几次重试以查看文件是否变为有效。
避免在相关的SQL函数中对pg_control
进行破损读取(Thomas Munro)
在读取pg_control
之前获取适当的锁定,以确保我们获得该文件的一致视图。
避免在计算后端活动字符串数组大小时发生整数溢出(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的统计信息。
跟踪缓存的CALL
语句的依赖关系,并在需要时重新计划它们(Tom Lane)
DDL命令,比如替换已经内联到CALL
参数中的函数,可能会导致需要重新计划已被PL/pgSQL缓存的CALL
。
这种情况并没有发生,导致出现异常行为或诸如“缓存查找失败”等奇怪错误。
避免在OpenSSL连接设置中发生错误后出现可能的pfree-a-NULL-pointer崩溃(Sergey Shinderuk)
在检查外部查询级别的RECORD
类型变量时,正确跟踪嵌套深度(Richard Guo)
这个疏忽可能导致断言失败,核心转储,或“虚假的varno”错误。
跟踪ScalarArrayOpExpr计划节点的哈希函数和否定函数依赖关系(David Rowley)
在大多数情况下,这种疏忽是无害的,因为这些函数在节点的原始操作符仍然存在时不太可能消失。
修复RECORD
类型缓存管理中的错误处理bug(Thomas Munro)
在恰到好处的时候发生的内存不足错误可能会留下不一致的状态,导致无限循环。
在同一个会话中,当逻辑解码在错误后重试时修复断言失败(侯志杰)
将读取WAL时的内存不足故障视为致命错误(Michael Paquier)
以前,这将被视为虚假数据条件,导致我们得出了已经到达WAL结尾的结论,这是不正确的, 可能导致WAL重放不一致。
修复由于尝试根据虚假的WAL记录长度字段分配内存而导致的可能恢复失败(Thomas Munro,Michael Paquier)
修复数据库删除中可能导致自动清理启动器卡住的竞争条件(Andres Freund,Will Mortensen,Jacob Speidel)
这场比赛可能导致已删除数据库的统计信息条目仍然存在,使启动器在选择要处理的数据库时感到困惑。
修复逻辑磁带管理中的数据类型大小混淆 (Ranier Vilela)
整数溢出在长整型比整型宽的平台上是可能的,尽管需要一个多个 太字节的临时文件才会引起问题。
避免意外关闭syslogger进程的stdin(Heikki Linnakangas)
避免对在解析分析期间未接收到有趣处理的实用程序语句进行计划缓存重新验证 (Tom Lane)
除了节省一些循环之外,这还可以防止在缓存失效后失败,对于那些不得设置快照的语句,比如SET TRANSACTION ISOLATION LEVEL
。
在使用时,将attmissingval
的引用值保留在长期存在的上下文中(Andrew Dunstan)
这样可以避免在元组插槽的值构造时,元组描述符已经过期时可能出现悬空指针的情况。
在执行ALTER ROLE
之后重新计算search_path
的有效值(Jeff Davis)
这样可以确保在重命名角色后,特殊字符串$user
的含义被重新确定。
修复在Windows上当min_dynamic_shared_memory
设置为大于零时出现的“无法复制句柄”错误(Thomas Munro)
修复GenericXLogFinish
中的操作顺序(Jeff Davis)
这段代码违反了崩溃安全所需的条件,通过在标记更改的缓冲区脏之前写入WAL。没有核心代码使用这个函数,但扩展程序使用(例如contrib/bloom
)。
删除PL/Python异常处理中的错误断言(Alexander Lakhin)
修复了pg_dump在被要求转储pg_catalog
模式时出现断言失败的问题(Peter Eisentraut)
修复pg_restore,使选择性恢复将包括所选表的表级和列级ACLs(Euler Taveira,Tom Lane)
以前,如果两种类型都存在,只有表级ACL会被恢复。
为pg_upgrade添加逻辑,检查是否使用了abstime
、reltime
和tinterval
数据类型(Álvaro Herrera)
这些已过时的数据类型在PostgreSQL版本12中被移除, 因此在声称可以升级之前,请检查一下旧数据库中是否存在这些数据类型。
避免在pg_basebackup中生成无效的临时插槽名称(Jelte Fennema)
这种情况只在服务器连接通过pgbouncer时发生过。
避免在Windows上pgbench中出现“太多客户端连接”错误(Noah Misch)
在contrib/amcheck
中,不要将中断的页面删除报告为损坏(Noah Misch)
这个修复程序防止了关于“最左目标页的第一个子页面不是其级别最左”、
“块NNNN不是最左”或“索引XXXX中的左链接/右链接对不一致”的
误报。它们出现在amcheck在未完成的btree索引页删除后
和VACUUM
清理之前运行时。
修复contrib/btree_gin
索引在interval
列上的失败,
当使用<
或<=
操作符进行索引扫描时(Dean Rasheed)
这样的索引扫描未能返回所有应该返回的条目。
添加对LLVM 16和17的支持(Thomas Munro,Dmitry Dolgov)
抑制最近macOS上的各种构建时警告(Tom Lane)
Xcode 15(随 macOS Sonoma 发布)改变了链接器的行为,导致构建 PostgreSQL 时出现许多重复库警告。这些警告是无害的,但很烦人,因此避免引用相同的库两次。还要删除使用 -multiply_defined suppress
链接器开关,这个开关显然很长时间以来都是无效的,现在却被积极投诉。
在构建contrib/unaccent
的规则文件时,
如果没有提供--with-python
并且未设置变量PYTHON
,
则回退到使用python
(Japin Li)
从默认时区缩写列表中删除PHOT
(Phoenix Islands Time)(Tom Lane)
默认列表中存在这个缩写词可能会导致在最近的Debian和Ubuntu发行版上失败, 因为它们不再默认安装底层的tzdb条目。由于这是一个为大约两打人口的区域 捏造的缩写词,似乎不太可能有人会错过它。如果有人错过了,他们可以通 过自定义缩写文件将其恢复。