E.4. 发布版本 12.19 #
发布日期:. 2024-05-09
本次发布包含来自 12.18 的多项修复。有关 12 主版本新特性的说明,请参见第 E.23 节。
PostgreSQL 社区将于 2024 年 11 月停止发布 12.X 系列的更新。建议用户尽快升级到较新的发布分支。
E.4.2. 变更
修复从多个
VALUES行INSERT到目标列为数组或复合类型上的域时的问题(Tom Lane)§这类情况会以数据类型不匹配的意外错误失败,或者插入可能导致奇怪结果的意外强制转换。
修复当表按布尔列分区且查询含有布尔
IS NOT子句时,对 NULL 分区的不正确修剪(David Rowley)§NULL 值满足诸如
之类的子句,因此修剪掉包含 NULL 的分区会产生不正确的结果。boolcolIS NOT FALSE使
ALTER FOREIGN TABLE SET SCHEMA将所拥有的序列移到新模式中(Tom Lane)§将常规表移到新模式会导致该表所拥有的序列也被移到该模式中(连同索引和约束)。但对于外部表,这一点被遗漏了。
修复
EXPLAIN对位图堆扫描访问的堆页面的计数(Melanie Plageman)§之前,不包含可见元组的堆页面不被计数;但计算位图索引扫描返回的所有页面似乎更一致。
避免在移除孤立临时表时出现死锁(Mikhail Zhilin)§
如果创建临时表的会话在未移除该表的情况下崩溃,autovacuum 最终会尝试移除该孤立的表。然而,被分配了相同临时命名空间的新传入会话也会尝试这样做。如果临时表有依赖项(如拥有的序列),这两个清理尝试之间可能会产生死锁。
避免在检查每个关系的冻结 XID 值时出现竞态条件(Noah Misch)§
VACUUM从每个关系的值计算每个数据库的冻结 XID 值时,可能会被另一个VACUUM对这些值的并发更新所混淆。禁止在使用该表的外部 SQL 命令中将表转换为视图(Tom Lane)§
这可以避免可能的崩溃。
确保从等价类生成的连接条件在正确的计划层级应用(Tom Lane)§
在 PostgreSQL 16 之前的版本中,生成的条件可能在外连接下方被评估,而实际上应在外连接上方(之后)评估,导致不正确的查询结果。所有版本在考虑连接到具有部分
SELECT分支中连接列为常量输出的UNION ALL树时都有类似的隐患。避免在非移动窗口帧中不必要地使用移动聚合模式(Vallimaharajan G)§
当普通聚合作为窗口函数使用,且窗口帧起始指定为
UNBOUNDED PRECEDING时,帧的头部无法移动,因此我们不需要使用特殊的(且更昂贵的)移动聚合模式。这个优化一直是预期的,但由于编码错误从未被触发。避免在 GEQO 下规划按分区连接时使用已释放的数据(Tom Lane)§
这通常会以崩溃或意外的错误消息告终。
修复“requested statistics kind
Xis not yet built”错误消息中不正确报告的统计类型代码(David Rowley)§更加小心地处理
FROM中返回RECORD的函数(Tom Lane)§ §此类函数调用的输出列必须由指定列名和数据类型的
AS子句来定义。如果实际的函数输出值不匹配,应在运行时抛出错误。然而,某些代码路径会过早检查实际值,如果不符合预期可能会发出奇怪的错误或触发断言失败。修复 SQL 语言过程的返回行类型混淆(Tom Lane)§
以 SQL 语言实现的返回单个复合类型列的过程会导致断言失败或核心转储。
为一些递归函数增加保护性栈深度检查(Egor Chindyaskin)§
检测在
timestamp上加减interval时的整数溢出(Joseph Koshakow)§某些应该导致超出范围错误的情况反而产生了不正确的结果。
避免
pg_get_expr()中的竞态条件(Tom Lane)§如果参数引用的关系被并发删除,函数的意图是返回 NULL,但有时会失败。
修复 XID 状态函数中对旧事务 ID 的检测(Karina Litskevich)§
距今超过 231 个事务的事务 ID 可能被误识别为近期的,导致
pg_xact_status()或txid_status()出现异常行为。修复在
WaitEventSetWait中等待时抛出错误导致的文件描述符泄漏(Etsuro Fujita)§如果在重建索引期间访问索引,则抛出错误(Tom Lane)§
之前这只是一个断言检查,现在将其提升为常规运行时错误。当重建索引的用户定义索引表达式尝试访问其自身的表时,这将提供一个更有针对性的错误消息。
确保对
name列的仅索引扫描返回完整填充的值(David Rowley)§物理存储在索引中的值是被截断的,之前会将指向该值的指针返回给调用者。这在 valgrind 下测试时引发了告警。理论上可能导致崩溃,但尚未收到相关报告。
修复大于 4GB 的 DSM 分配时的崩溃(Heikki Linnakangas)§
如果新服务器会话的客户端套接字无法被设置为非阻塞模式则断开连接(Heikki Linnakangas)§
曾经在理论上可以使用阻塞模式的套接字来运行;但这在很长时间以来就已经不能完全工作了,所以在连接开始时失败而不是稍后出现异常行为。
修复 OpenSSL 3.0.0 及更高版本中不充分的错误报告(Heikki Linnakangas,Tom Lane)§
通过 OpenSSL 传递的系统报告错误是用数字错误代码而非可读内容报告的。
避免在 libpq 和 ecpglib 中并发调用
bindtextdomain()(Tom Lane)§ §虽然 GNU gettext 的实现似乎可以处理并发调用,但 Windows 上可用的版本不行。
在 ecpg 中,避免发出错误的“unsupported feature will be passed to server”警告(Tom Lane)§
确保 ecpg 的
intoasc()函数的字符串结果正确以零结尾(Oleg Tselebrovskiy)§修复 pg_dumpall,使角色注释(如果存在)无论
--no-role-passwords的设置如何都会被导出(Daniel Gustafsson,Álvaro Herrera)§ §修复 PL/pgSQL 对表达式后跟单行注释(
--风格注释)的解析(Erik Wienhold,Tom Lane)§此错误导致当此类注释跟在 PL/pgSQL
CASE语句中的WHEN表达式之后时会出现解析错误。在
contrib/amcheck中,不要由于短头部与长头部值的差异而报告虚假的不匹配失败(Andrey Borodin,Michael Zhilin)§ §堆元组或索引元组中的可变长度数据项可以有短头部或长头部,这取决于其创建时应用的压缩参数。将这些情况视为等价的,而不是在存在差异时报告错误。
在
contrib/postgres_fdw中,避免发出按常量排序的请求(David Rowley)§这可能发生在涉及
UNION ALL和常量输出子查询的情况下。按常量排序当然是无用的,但还有被远程服务器误解的风险,导致“ORDER BY positionNis not in select list”错误。使
contrib/postgres_fdw将远程会话的时区设置为GMT而不是UTC(Tom Lane)§在实际用途中这应该产生相同的结果。然而,
GMT由服务器中的硬编码代码识别,而UTC则从时区数据库中查找。因此在远程服务器的时区数据库缺少条目的不太可能的情况下,旧代码可能失败。在
contrib/xml2中,避免使用在最近版本的 libxml2 中已弃用的库函数(Dmitry Koval)§修复与 LLVM 18 的不兼容性(Thomas Munro,Dmitry Dolgov)§
允许
make check在 musl C 库下工作(Thomas Munro,Bruce Momjian,Tom Lane)§