发布日期:. 2024年2月8日
这个版本包含了从15.5版本中的各种修复。 有关主要版本15中新功能的信息,请参见第 E.8 节。
对于运行15.X版本的用户,不需要进行dump/restore操作。
然而,修复了一个bug,可能导致在并发更新期间对GIN索引的损坏。如果您怀疑存在这种损坏, 在安装此更新后重新索引受影响的索引。
另外,如果您正在从15.5之前的版本升级,请参阅第 E.3 节。
在REFRESH MATERIALIZED VIEW CONCURRENTLY
(Heikki Linnakangas)中加强安全限制。
并发刷新命令的一个步骤在弱安全限制下运行。如果一个物化视图的所有者能说服一个超级用户或其他高特权用户对该视图执行并发刷新,
那么该视图的所有者可以控制以运行REFRESH
的用户特权执行的代码。修复问题,使所有用户确定的代码按照预期以视图所有者身份运行。
这个错误的唯一已知利用在PostgreSQL 16.0及更高版本中不起作用, 因此在实践中v16可能不会受到影响。
PostgreSQL项目感谢Pedro Gallegos报告了这个问题。 (CVE-2024-0985)
修复在执行JIT内联时的内存泄漏(Andres Freund,Daniel Gustafsson)
有多份报告显示,在经过足够多的JIT编译后,后端进程出现了内存不足的情况。这个修复应该解决这个问题。
当从LWLock中出队时,避免需要搜索等待进程列表(Andres Freund)
这修复了当等待者列表很长时O(N^2)的行为。在某些用例中,这会导致 显著的吞吐量改进。
避免生成不正确的分区连接计划(Richard Guo)
涉及横向引用的一些不常见情况可能导致不正确的计划。受影响的查询可能产生错误的答案, 或者出现奇怪的故障,比如“子计划目标列表中找不到变量”,或执行器崩溃。
修复PlaceHolderVars中子查询输出表达式的错误换行(Tom Lane)
这个修复了当一个子查询位于外连接下面,并且具有一个输出列横向引用了外连接范围之外的内容时产生的不正确结果。 由于外连接的作用,输出列可能不会出现为NULL,而实际上应该是NULL。
修复窗口函数运行条件的错误处理(Richard Guo)
这个疏忽可能导致“在子计划目标列表中找不到WindowFunc”错误。
当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内存分配请求大小”错误。
避免在heap_update()
和heap_delete()
中出现断言失败,
当一个元组由外键强制触发器更新失败时,额外的可见性交叉检查失败(Alexander Lakhin)
这个错误在非断言构建中没有影响。
修复BRIN布隆运算符类的false_positive_rate
参数的过于严格的断言(Alexander Lakhin)
这个错误在非断言构建中没有任何影响。
修复在复杂继承树上进行ALTER TABLE ADD COLUMN
可能失败的问题(Tender Wang)
如果一个孙表通过多个中间父表继承新列,该命令将失败,显示“tuple already updated by self”。
修复ALTER TEXT SEARCH CONFIGURATION ... MAPPING
命令中重复标记名称的问题(Tender Wang,Michael Paquier)
在DROP STATISTICS
期间正确锁定相关表(Tomas Vondra)
未能获取锁可能导致“元组同时被删除”错误,如果DROP
与ANALYZE
并发执行。
修复函数波动性检查对GENERATED
和DEFAULT
表达式的处理(Tom Lane)
这些地方可能无法检测插入易失函数默认参数表达式,或者认为多态函数是易失的,尽管在感兴趣的数据类型上实际上是不可变的。
这可能导致错误地拒绝或接受GENERATED
子句,或者错误地应用常量默认值优化在ALTER TABLE ADD
COLUMN
中。
检测到一个新的目录缓存条目在解除toast时变得过时(Tom Lane)
在将目录元组插入目录缓存之前,我们会扩展目录元组中的任何离线字段。这涉及到数据库访问,可能会导致目录缓存条目失效—但新条目尚未在缓存中,因此我们可能会错过应该使其失效的通知。结果是一种竞争条件,其中一个已经过时的缓存条目可能会被创建,然后持续存在。这将导致难以预测的错误行为。通过在解压后重新检查元组的可见性来修复。
修复一些平台上的边缘情况整数溢出检测bug(Dean Rasheed)
计算0 - INT64_MIN
应该导致溢出错误,在大多数平台上确实如此。
然而,既没有整数溢出内置函数也没有128位整数的平台会无法发现溢出,而是返回INT64_MIN
。
当将interval
添加到/从时间戳
时,检测儒略日期溢出(Tom Lane)
一些应该引起超出范围错误的情况,却产生了错误的结果。
为interval_mul()
和interval_div()
添加更多的溢出检查(Dean Rasheed)
一些应该引起超出范围错误的情况,却产生了错误的结果。
确保在更改stats_fetch_consistency
后丢弃缓存的统计信息(加藤真也)
在某些代码路径中,可能会返回过时的统计信息。
使pg_file_settings
视图检查未应用值的有效性,
具有backend
或superuser-backend
上下文的设置
(Tom Lane)
无效值未如预期那样在视图中被记录。这是因为这些组中的设置非常少。
在将现有索引与新的分区索引匹配时,也要匹配排序规则(Peter Eisentraut)
以前,我们可以接受一个索引,其排序与分区键的对应元素不同,可能导致不正确的行为。
避免在分区索引上同时与REINDEX INDEX
并发删除子索引时出现故障
(Fei Changhong)
修复了在清理GIN索引内部页面的不完整拆分时锁定不足的问题(Fei Changhong,Heikki Linnakangas)
该代码尝试在缓冲区上使用共享锁而不是独占锁。如果两个进程同时尝试清理, 这可能导致索引损坏。
避免在GIN索引插入中过早释放缓冲区引用(Tom Lane)
如果索引根页面分裂与我们自己的插入同时发生,代码可能会出现失败,显示“缓冲区NNNN不是资源所有者拥有”。
避免使用分区SP-GiST索引失败(Tom Lane)
尝试使用这种索引可能导致“没有这样的文件或目录”错误。
修复大对象所有权更改报告(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
文件
丢失或为空。
在从备份中开始和结束恢复时添加更多LOG
消息(Andres Freund)
这个改变在postmaster日志中提供了额外的信息,这些信息可能对诊断恢复问题有用。
防止待机服务器在子事务期间错误地处理死索引元组(费昌宏)
startedInRecovery
标志未正确设置为子事务。
这仅影响死索引元组的处理。这可能导致子事务中的查询忽略应返回的索引条目
(如果它们在主服务器上已经死亡,但对于备用事务尚未死亡),或过早地标记
尚未在主服务器上死亡的索引条目为死亡。目前尚不清楚后一种情况是否会产生严重
后果,但这不是预期的行为。
修复整数溢出风险,检查记录是否适合WAL解码缓冲区(Thomas Munro)
这个bug似乎只在64位平台上运行32位PostgreSQL构建时才会显现。
修复逻辑复制应用程序工作者、其表同步工作者和尝试更改订阅的会话进程之间的死锁(Shlok Kyal)
死锁循环的一个边缘没有涉及到锁等待,因此死锁未被检测到,将持续到手动干预。
确保列默认值由pgoutput逻辑复制插件正确传输(Nikhil Benesch)
使用ALTER TABLE ADD COLUMN
命令为新列设置一个常量默认值,
避免重写现有元组,而是期望读取代码将正确的默认值插入缺少该列的元组中。
如果随后在表上启动了复制,pgoutput将传输NULL,
而不是该列的正确默认值,导致订阅者上的错误复制。
修复逻辑复制对没有列的表进行初始同步的失败(Vignesh C)
这个案例生成了一个格式不正确的COPY
命令。
防止在逻辑解码期间使用错误的快照检查系统目录(Fei Changhong)
如果解码在修改系统目录的事务进行过程中开始,解码器可能无法识别,导致它无法将该事务视为进行中以进行目录查找。 此修复处理了顶层事务已标记为包含目录更改的情况,但其子事务未标记。
当一个新的客户端在不回应服务器的密码挑战而断开连接时,返回正确的状态码(刘浪,汤姆·莱恩)
在某些情况下,我们会将这视为可记录的错误,这并不是本意,而且往往会产生日志垃圾,因为常见的客户端
如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)
报告文件相关系统调用的ENOMEM错误为ERRCODE_OUT_OF_MEMORY
,
而不是ERRCODE_INTERNAL_ERROR
(Alexander Kuzmenkov)
在PL/pgSQL中,支持具有SQL标准体的CREATE FUNCTION
/CREATE PROCEDURE
命令(Tom Lane)
以前,这种情况由于函数体中出现分号而导致解析错误。
修复libpq在管道中处理错误的问题(Álvaro Herrera)
如果除了查询问题之外的其他原因导致错误返回(例如,连接丢失),则管道状态可能会不同步。潜在地,这可能导致调用应用程序中的忙循环。
使libpq的PQsendFlushRequest()
函数在相同规则下刷新客户端输出缓冲区,就像其他PQsend
函数一样(Jelte Fennema-Nio)
在管道模式下,可能仍然需要调用PQflush()
; 但这个改变消除了一些不一致性。
避免在两个不同的线程同时初始化OpenSSL支持时出现竞态条件 (libpq,Willi Mann,Michael Paquier)
修复GSSAPI数据传输中的时间依赖性故障(Tom Lane)
当在非阻塞模式下使用GSSAPI加密时,libpq有时会失败, 出现“GSSAPI调用方未能重新传输所有需要重试的数据”。
在pg_dump中,不要为扩展成员对象转储RLS策略或安全标签(Tom Lane,Jacob Champion)
以前,命令会被包含在转储中以设置这些属性,这实际上是不正确的,因为它们应该被视为扩展的内部事务。 而且,恢复用户可能没有足够的特权来设置它们,实际上,转储用户可能没有足够的特权来转储它们 (因为转储 RLS 策略需要在它们的表上获取锁)。
在pg_dump中,如果底层表没有被dump,则不要dump扩展统计对象 (Rian McGuire, Tom Lane)
这符合其他依赖对象(如索引)的行为。
使得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)
修复了在Windows上编译WAL_DEBUG
代码失败的问题(Bharath Rupireddy)
抑制Python头文件中的编译器警告 (Peter Eisentraut, Tom Lane)
我们首选的编译器选项会引发关于最近版本Python头文件中出现的结构的警告。 当使用gcc时,我们可以通过一个编译指示来抑制这些警告。
避免在使用LLVM 18编译时出现弃用警告(Thomas Munro)
更新时区数据文件至tzdata 发布2024a版本,以适应格陵兰、哈萨克斯坦和巴勒斯坦的夏令时法律变化,以及南极洲Casey和Vostok站的更正。还有越南、多伦多和密克隆的历史更正。