E.9. 版本 9.4.18 #
发布日期:. 2018-05-10
本发行版包含对 9.4.17 的多项修复。有关 9.4 主版本中新功能的信息,请参见第 E.27 节。
E.9.1. 迁移到版本 9.4.18
对于运行 9.4.X 的用户,不需要转储/恢复。
不过,如果下面第一条变更日志条目中提到的函数标记错误影响到你,你可能需要采取措施更正数据库系统目录。
另外,如果你是从 9.4.17 之前的版本升级,参见第 E.10 节。
E.9.2. 变更
修复少数内建函数上不正确的易变性标记(Thomas Munro、Tom Lane)
函数
query_to_xml、cursor_to_xml、cursor_to_xmlschema、query_to_xmlschema和query_to_xml_and_xmlschema应标记为 volatile,因为它们执行可能包含易变操作的用户提供的查询。它们没有被这样标记,导致错误查询优化的风险。新安装已通过更正初始目录数据修复,但现有安装将继续包含错误标记。实际使用这些函数似乎危害不大,但如遇到麻烦,可以手动更新这些函数的pg_proc条目来修复,例如ALTER FUNCTION pg_catalog.query_to_xml(text, boolean, boolean, text) VOLATILE。(注意安装中的每个数据库都需要这样做。)另一个选择是把数据库 pg_upgrade 到包含更正后初始数据的版本。避免重用与已死但尚未清理的 TOAST 条目匹配的 TOAST 值 OID(Pavan Deolasee)
一旦 OID 计数器回卷,就可能分配一个 OID 与同一 TOAST 表中先前删除的条目匹配的 TOAST 值。如果该条目尚未被清理,就会导致 “unexpected chunk number 0 (expected 1) for toast value
nnnnn” 错误,并持续到VACUUM移除死条目为止。修复方法是创建新 TOAST 条目时不选择这种 OID。更改
ANALYZE更新pg_class.reltuples的算法(David Gould)此前,
ANALYZE未实际扫描的页被假定保留其旧的元组密度。在ANALYZE只采样很少一部分页的大表中,这意味着总体元组密度估计不会有太大变化,因此无论表中实际发生什么,reltuples都几乎与表物理大小(relpages)的变化成比例地变化。据观察,这会导致reltuples远大于实际值,以致实际上关闭了自动清理。为修复,假定ANALYZE的样本是表的无偏统计样本(本应如此),直接把这些页中观察到的密度外推到整表。避免在
SERIALIZABLE或REPEATABLE READ事务隔离下运行的并发CREATE INDEX CONCURRENTLY命令中的死锁(Tom Lane)修复
REFRESH MATERIALIZED VIEW CONCURRENTLY可能缓慢的执行(Thomas Munro)修复
UPDATE/DELETE ... WHERE CURRENT OF在所引用游标使用仅索引扫描计划时不失败(Yugo Nagata、Tom Lane)修复下推到参数化路径的连接子句的错误规划(Andrew Gierth、Tom Lane)
这个错误可能把本应是普通“过滤”条件的条件错误分类为外连接的“连接过滤”,导致错误的连接输出。
修复对顶层
AND/OR条件带有可证明为 NULL 子子句的CHECK约束的错误优化(Tom Lane、Dean Rasheed)这可能导致例如约束排除错误地排除不应从查询中排除的子表。
避免提交预备事务时发生查询取消或会话终止中断时失败(Stas Kelvich)
修复重复执行的哈希连接中的查询生命周期内存泄漏(Tom Lane)
修复
heap_prepare_freeze_tuple中过于严格的健全性检查(Álvaro Herrera)在从 9.2 或更早版本 pg_upgrade 过来的数据库中,这可能导致错误的 “cannot freeze committed xmax” 失败。
防止 C 编写的 before-update 行触发器返回“旧”元组时的悬空指针解引用(Rushabh Lathia)
减少自动清理工作者调度期间的锁定(Jeff Janes)
原来的行为导致有许多表的数据库中潜在工作者并发性的急剧丧失。
确保把
pg_stat_activity数据复制到本地内存时复制客户端主机名(Edmund Horner)此前,这个本应本地的快照包含指向共享内存的指针,使客户端主机名列可能因任何现有会话断开而意外改变。
修复
ispell词典中多个复合词缀的错误处理(Arthur Zakirov)修复 text 列上 SP-GiST 索引中的排序规则感知搜索(即使用不等操作符的索引扫描)(Tom Lane)
在大多数非 C 区域中,这种搜索会返回错误的行集合。
在 SP-GiST 索引初始构建期间正确计数索引元组数(Tomas Vondra)
此前,元组数被报告为与底层表相同,如果索引是部分索引就错了。
在 GiST 索引清理期间正确计数索引元组数(Andrey Borodin)
此前它报告的是估计的堆元组数,可能不准确,而且如果索引是部分索引则肯定错误。
修复流式备库在 WAL 延续记录处卡住的一个边界情况(Kyotaro Horiguchi)
在逻辑解码中,避免 walsender 重启时 WAL 数据可能被双重处理(Craig Ringer)
允许
scalarltsel和scalargtsel用于非核心数据类型(Tomas Vondra)减少收集了大量查询输出之后服务器报告错误时 libpq 的内存消耗(Tom Lane)
在处理错误消息之前而不是之后丢弃先前的输出。在某些平台(特别是 Linux)上,这可以改变应用之后的内存占用。
修复 ecpg 中的双重释放崩溃(Patrick Krecker、Jeevan Ladhe)
修复 ecpg 在 MSVC 构建中正确处理
long long int变量(Michael Meskes、Andrew Gierth)修复转储中列表值 GUC 变量值的错误引号(Michael Paquier、Tom Lane)
local_preload_libraries、session_preload_libraries、shared_preload_libraries和temp_tablespaces变量在 pg_dump 输出中没有正确加引号。如果这些变量的设置出现在CREATE FUNCTION ... SET或ALTER DATABASE/ROLE ... SET子句中,这会导致问题。修复 pg_recvlogical 对 v10 之前的 PostgreSQL 服务器不失败的问题(Michael Paquier)
此前的一次修复使 pg_recvlogical 不论服务器版本都发出一条命令,但它只应对 v10 及之后的服务器发出。
修复 PL/pgSQL 整数
FOR循环中的溢出处理(Tom Lane)原来的编码在一些非 gcc 编译器上未能检测到循环变量的溢出,导致无限循环。
调整 PL/Python 回归测试在 Python 3.7 下通过(Peter Eisentraut)
支持用 Python 3 和 MSVC 构建时测试 PL/Python 及相关模块(Andrew Dunstan)
重命名内部
b64_encode和b64_decode函数,避免与 Solaris 11.4 内置函数冲突(Rainer Orth)把我们的时区库副本与 IANA tzcode 版本 2018e 同步(Tom Lane)
这修复了 zic 时区数据编译器应对负夏令时偏移的能力。虽然 PostgreSQL 项目不会立即发布这种时区数据,但 zic 可能被用于直接从 IANA 获得的时区数据,因此现在更新 zic 是审慎的。
更新时区数据文件到 tzdata 版本 2018d,涉及巴勒斯坦和南极洲(凯西站)的夏令时法规变更,以及葡萄牙及其殖民地、恩德伯里、牙买加、特克斯和凯科斯群岛及乌拉圭的历史修正。