发布日期:. 2024年2月8日
此版本包含从16.1修复的各种问题。 有关主要版本16中的新功能的信息,请参阅 第 E.9 节。
对于运行16.X的用户,不需要进行转储/恢复。
然而,修复了一个bug,可能导致在并发更新期间对GIN索引的损坏。如果您怀疑存在这种损坏, 在安装此更新后重新索引受影响的索引。
此外,如果您正在从早于16.1的版本升级,请参阅 第 E.8 节。
收紧REFRESH MATERIALIZED VIEW CONCURRENTLY
中的安全限制
(Heikki Linnakangas)
§
§
并发刷新命令的一个步骤在弱安全限制下运行。如果一个物化视图的所有者能说服一个超级用户或其他高特权用户对该视图执行并发刷新,
那么该视图的所有者可以控制以运行REFRESH
的用户特权执行的代码。修复问题,使所有用户确定的代码按照预期以视图所有者身份运行。
这个错误的唯一已知利用在PostgreSQL 16.0及更高版本中不起作用, 因此在实践中v16可能不会受到影响。
PostgreSQL项目感谢Pedro Gallegos报告了这个问题。 (CVE-2024-0985)
修复在执行JIT内联时的内存泄漏(Andres Freund, Daniel Gustafsson) §
有多份报告显示,在经过足够多的JIT编译后,后端进程出现了内存不足的情况。这个修复应该解决这个问题。
避免生成不正确的分区连接计划(Richard Guo) §
涉及横向引用的一些不常见情况可能导致不正确的计划。受影响的查询可能产生错误的答案, 或者出现奇怪的故障,比如“子计划目标列表中找不到变量”,或执行器崩溃。
修复在PlaceHolderVars中子查询输出表达式的错误换行 (Tom Lane) §
这个修复了当一个子查询位于外连接下面,并且具有一个输出列横向引用了外连接范围之外的内容时产生的不正确结果。 由于外连接的作用,输出列可能不会出现为NULL,而实际上应该是NULL。
修复窗口函数运行条件的错误处理 (Richard Guo) §
这个疏忽可能导致“在子计划目标列表中找不到WindowFunc”错误。
修复Memoize计划中内侧唯一性检测的问题 (Richard Guo) §
这个错误可能会导致“缓存条目已完成”错误。
修复在常量折叠字段选择时计算nullingrels的问题 (Richard Guo) §
未能做到这一点会导致类似于“错误的varnullingrels (b)(预期为(b 3))对于变量2/2”的错误。
当MERGE
导致跨分区更新时跳过不适当的操作
(Dean Rasheed)
§
在对分区表执行MERGE UPDATE
操作时,如果由于更改分区键列而将UPDATE
转换为DELETE
和INSERT
,则跳过触发AFTER UPDATE ROW
触发器,以及其他后续更新操作,如RLS检查。这些操作通常会失败,这就是为什么在这种情况下常规UPDATE
不会执行它们;MERGE
也不应该执行。
处理跨分区BEFORE ROW DELETE
触发器中的
MERGE
更新(Dean Rasheed)
§
如果这样一个触发器试图通过返回NULL来阻止更新,MERGE
将会出现错误或断言失败。
防止在BEFORE ROW UPDATE
触发器中访问不再固定的缓冲区
(Alexander Lakhin,Tom Lane)
§
如果正在更新的元组刚刚被另一个会话更新并移动到另一页,那么在一个狭窄的时间窗口内, 我们会尝试从新元组版本获取数据,而没有对其缓冲区进行任何锁定。原则上,这可能导致 更新的新元组的非更新列中出现垃圾数据。然而,实际上出现问题的几率似乎相当低。
避免在并行哈希连接中请求过大的共享内存区域 (Thomas Munro, Andrei Lepikhov, Alexander Korotkov) § §
限制值过大,导致期望的哈希表大小足够大时发生“无效的DSA内存分配请求大小”错误。
修复在尝试扩展临时表时发生错误时本地缓冲区状态的损坏 (Tender Wang) §
修复在评估具有多个参数的
DISTINCT
聚合时使用错误元组槽的问题
(David Rowley)
§
这个错误可能会导致诸如“类型记录的属性1类型错误”之类的错误。
避免在heap_update()
和heap_delete()
中发生断言失败,当一个由外键约束触发器更新的元组未通过额外的可见性
交叉检查时(Alexander Lakhin)
§
这个错误在非断言构建中没有影响。
修复关于false_positive_rate
参数的过于严格的断言,
该参数属于BRIN布隆操作符类 (Alexander Lakhin)
§
这个错误在非断言构建中没有任何影响。
修复在复杂继承树上执行ALTER TABLE ADD
COLUMN
时可能发生的失败(Tender Wang)
§
如果一个孙表通过多个中间父表继承新列,该命令将失败,显示“tuple already updated by self”。
修复ALTER TEXT SEARCH CONFIGURATION ... MAPPING
命令中
重复的标记名称问题(Tender Wang,Michael Paquier)
§
修复具有重复角色名称的DROP ROLE
(Michael Paquier)
§
以前,这会导致“元组已被自身更新”的错误。相反,忽略重复项。
在执行DROP STATISTICS
时正确锁定相关表
(Tomas Vondra)
§
未能获取锁可能导致“元组同时被删除”错误,如果DROP
与ANALYZE
并发执行。
修复对GENERATED
和DEFAULT
表达式的函数
易变性检查(Tom Lane)
§
这些地方可能无法检测插入易失函数默认参数表达式,或者认为多态函数是易失的,尽管在感兴趣的数据类型上实际上是不可变的。
这可能导致错误地拒绝或接受GENERATED
子句,或者错误地应用常量默认值优化在ALTER TABLE ADD
COLUMN
中。
检测到在解压其字段时,一个新的目录缓存条目变得过时 (Tom Lane) § §
在将目录元组插入目录缓存之前,我们会扩展目录元组中的任何离线字段。这涉及到数据库访问,可能会导致目录缓存条目失效—但新条目尚未在缓存中,因此我们可能会错过应该使其失效的通知。结果是一种竞争条件,其中一个已经过时的缓存条目可能会被创建,然后持续存在。这将导致难以预测的错误行为。通过在解压后重新检查元组的可见性来修复。
修复某些平台上的边界情况整数溢出检测错误(Dean Rasheed) §
计算0 - INT64_MIN
应该导致溢出错误,在大多数平台上确实如此。
然而,既没有整数溢出内置函数也没有128位整数的平台会无法发现溢出,而是返回INT64_MIN
。
检测在将间隔
加到或减去时间戳
时的
Julian 日期溢出 (Tom Lane)
§
一些应该引起超出范围错误的情况,却产生了错误的结果。
为interval_mul()
和interval_div()
添加更多
溢出检查(Dean Rasheed)
§
一些应该引起超出范围错误的情况,却产生了错误的结果。
允许scram_SaltedPassword()
被中断
(Bowen Shi)
§
当scram_iterations
值较大时,此函数可能需要较长时间运行。
允许通过查询取消请求中断它。
确保在更改stats_fetch_consistency
后,缓存的统计数据被丢弃
(Shinya Kato)
§
在某些代码路径中,可能会返回过时的统计信息。
使pg_file_settings
视图检查未应用设置值的有效性,
这些设置具有backend
或superuser-backend
上下文(Tom Lane)
§
无效值未如预期那样在视图中被记录。这是因为这些组中的设置非常少。
在将现有索引与新的分区索引匹配时,也匹配排序规则 (Peter Eisentraut) §
以前,我们可以接受一个索引,其排序与分区键的对应元素不同,可能导致不正确的行为。
避免在分区索引上执行REINDEX INDEX
时,
如果子索引被同时删除而导致失败 (Fei Changhong)
§
§
修复在清理GIN索引内部页面的不完整拆分时锁定不足的问题 (常红飞,Heikki Linnakangas) §
该代码尝试在缓冲区上使用共享锁而不是独占锁。如果两个进程同时尝试清理, 这可能导致索引损坏。
避免在GIN索引插入中过早释放缓冲区固定 (Tom Lane) §
如果索引根页面分裂与我们自己的插入同时发生,代码可能会出现失败,显示“缓冲区NNNN不是资源所有者拥有”。
避免分区SP-GiST索引的失败(Tom Lane) §
尝试使用这种索引可能导致“没有这样的文件或目录”错误。
修复大对象的所有权测试(Tom Lane) §
对需要所有权权限的大对象操作失败,并显示 “未识别的类ID: 2613”,除非由超级用户运行。
修复大对象的所有权变更报告 (Tom Lane) §
一个无操作的ALTER LARGE OBJECT OWNER
命令(即选择现有所有者)传递了错误的类ID给PostAlterHook
,
可能会混淆任何使用该钩子的扩展。
修复EXPLAIN (BUFFERS)
中I/O计时数据的报告问题
(Michael Paquier)
§
标记为“shared/local”的数字实际上只是指共享缓冲区,所以将该标签更改为“shared”。
确保CREATE DATABASE
的持久性 (Noah Misch)
§
§
如果在CREATE DATABASE
期间或之后发生操作系统崩溃,
可能会导致恢复失败,或者新数据库的后续连接失败。如果在该时间窗口内进行了基本备份,
则在尝试使用备份时可能会观察到类似的问题。症状将是数据库目录、
PG_VERSION
文件或pg_filenode.map
文件
丢失或为空。
添加更多日志
消息,以便在从备份开始和结束恢复时
(Andres Freund)
§
这个改变在postmaster日志中提供了额外的信息,这些信息可能对诊断恢复问题有用。
防止备用服务器在子事务期间错误地处理无效索引元组 (常红飞) §
startedInRecovery
标志未正确设置为子事务。
这仅影响死索引元组的处理。这可能导致子事务中的查询忽略应返回的索引条目
(如果它们在主服务器上已经死亡,但对于备用事务尚未死亡),或过早地标记
尚未在主服务器上死亡的索引条目为死亡。目前尚不清楚后一种情况是否会产生严重
后果,但这不是预期的行为。
修复walreceiver进程中的信号处理 (Heikki Linnakangas) §
撤销一个更改,该更改导致walreceivers在等待建立复制连接时对 SIGTERM无响应。
修复在检查记录是否适合写入WAL解码缓冲区时的整数溢出隐患 (Thomas Munro) §
这个bug似乎只在64位平台上运行32位PostgreSQL构建时才会显现。
修复逻辑复制应用工作者、其表同步工作者和尝试更改订阅的会话进程之间的死锁 (Shlok Kyal) §
死锁循环的一个边缘没有涉及到锁等待,因此死锁未被检测到,将持续到手动干预。
确保列的默认值能够被pgoutput逻辑复制插件正确传递 (Nikhil Benesch) §
使用ALTER TABLE ADD COLUMN
命令为新列设置一个常量默认值,
避免重写现有元组,而是期望读取代码将正确的默认值插入缺少该列的元组中。
如果随后在表上启动了复制,pgoutput将传输NULL,
而不是该列的正确默认值,导致订阅者上的错误复制。
修复逻辑复制初始同步失败的问题,适用于没有列的表 (Vignesh C) §
这个案例生成了一个格式不正确的COPY
命令。
在使用之前重新验证订阅的连接字符串(Vignesh C) § §
这是为了检测在没有密码的情况下创建订阅的情况(超级用户允许这样做), 但随后订阅所有者被更改为非超级用户。
当一个新客户端在没有响应服务器的密码挑战时断开连接时,返回正确的状态码 (刘浪,Tom Lane) §
在某些情况下,我们会将这视为可记录的错误,这并不是本意,而且往往会产生日志垃圾,因为常见的客户端
如psql经常这样做。这也可能会让使用ClientAuthentication_hook
的扩展程序感到困惑。
修复与OpenSSL 3.2的不兼容问题 (Tristan Partin,Bo Andreson) §
使用BIO “app_data”字段来存储私有数据,而不是假设可以使用“data”字段。 这个错误以前没有引起问题,但在3.2版本中导致崩溃和关于双重释放的投诉。
对于OpenSSL在出错时未设置
errno
要更加警惕 (Tom Lane)
§
如果errno
没有设置,则假定报告的失败原因是读取EOF。这样可以修复一些罕见情况下出现的奇怪错误报告,比如“无法接受SSL连接:成功”。
修复当外部数据封装器的ForeignAsyncRequest
函数失败时的文件描述符泄漏
(Heikki Linnakangas)
§
修复在CREATE SUBSCRIPTION
的连接字符串验证中
存在的小内存泄漏问题 (Jeff Davis)
§
报告文件相关系统调用中的ENOMEM错误为
ERRCODE_OUT_OF_MEMORY
,而不是
ERRCODE_INTERNAL_ERROR
(Alexander Kuzmenkov)
§
在PL/pgSQL中,支持具有SQL标准主体的
CREATE FUNCTION
/CREATE PROCEDURE
SQL命令 (Tom Lane)
§
以前,这种情况由于函数体中出现分号而导致解析错误。
修复libpq在管道中处理错误的方式 (Álvaro Herrera) § §
如果除了查询问题之外的其他原因导致错误返回(例如,连接丢失),则管道状态可能会不同步。潜在地,这可能导致调用应用程序中的忙循环。
使libpq的
PQsendFlushRequest()
函数根据与其他
PQsend
函数相同的规则刷新客户端输出缓冲区
(Jelte Fennema-Nio)
§
在管道模式下,可能仍然需要调用PQflush()
; 但这个改变消除了一些不一致性。
避免在两个不同线程中同时初始化libpq 的OpenSSL支持时发生竞争条件(Willi Mann, Michael Paquier) §
修复GSSAPI数据传输中的时间依赖性故障(Tom Lane) §
当在非阻塞模式下使用GSSAPI加密时,libpq有时会失败, 出现“GSSAPI调用方未能重新传输所有需要重试的数据”。
将initdb更改为始终取消注释
postgresql.conf
中的条目,
这些条目是针对lc_
参数的(Kyotaro Horiguchi)
§
xxx
initdb 在 v16 之前是这样工作的,
现在又恢复了这种方式。这个变化导致
initdb 的 --no-locale
选项未能对 lc_messages
产生预期的效果。
在pg_dump中,不要为扩展成员对象转储RLS策略或 安全标签(Tom Lane, Jacob Champion) § §
以前,命令会被包含在转储中以设置这些属性,这实际上是不正确的,因为它们应该被视为扩展的内部事务。 而且,恢复用户可能没有足够的特权来设置它们,实际上,转储用户可能没有足够的特权来转储它们 (因为转储 RLS 策略需要在它们的表上获取锁)。
在pg_dump中,如果其基础表未被导出,则不要导出扩展 统计对象(Rian McGuire,Tom Lane) §
这符合其他依赖对象(如索引)的行为。
正确检测pg_dump中一个代码路径的内存不足 (Daniel Gustafsson) §
使pgbench脚本以未关闭的管道结束成为一个错误 (Anthonin Bonnefoy) §
以前,如果pgbench在\startpipeline
命令缺少匹配的\endpipeline
时表现异常。
这似乎是一个脚本错误,而不是pgbench需要处理的情况,所以会抛出错误。
修复在contrib/intarray
中,如果将包含等于
INT_MAX
的元素的数组插入到
gist__int_ops
索引时发生的崩溃
(Alexander Lakhin,Tom Lane)
§
当contrib/pageinspect
的hash_bitmap_info()
函数应用于分区哈希索引时,报告更好的错误信息(Alexander Lakhin, Michael Paquier)
§
当contrib/pgstattuple
的pgstathashindex()
函数应用于分区哈希索引时,报告更好的错误信息(Alexander Lakhin)
§
在 Windows 上,启动子进程时禁止自动运行选项, 例如在pg_ctl 和pg_regress中 (Kyotaro Horiguchi) § §
当通过cmd.exe
启动子进程时,传递/D
标志以防止执行注册表中指定的任何自动运行命令。这样可以避免可能令人惊讶的副作用。
将is_valid_ascii()
从mb/pg_wchar.h
移动到utils/ascii.h
(Jubilee Young)
§
这个改变避免了在pg_wchar.h
中包含<simd.h>
,
这导致一些第三方代码出现问题。
修复与libxml2版本2.12.0及更高版本的编译失败问题 (Tom Lane) §
修复WAL_DEBUG
代码在Windows上的编译失败问题
(Bharath Rupireddy)
§
抑制来自Python头文件的编译器警告 (Peter Eisentraut,Tom Lane) § §
我们首选的编译器选项会引发关于最近版本Python头文件中出现的结构的警告。 当使用gcc时,我们可以通过一个编译指示来抑制这些警告。
避免在使用LLVM 18编译时出现弃用警告 (Thomas Munro) §
将时区数据文件更新为tzdata 2024a版本,以适应格陵兰、 哈萨克斯坦和巴勒斯坦的夏令时法律变更,以及对南极站Casey和Vostok的修正。 同时对越南、多伦多和密克隆的历史数据进行了修正。(Tom Lane) §