选择 打开 改范围 完整检索页

PostgreSQL 10.4 发布说明

E.20. 发布版本 10.4 #

发布日期:. 2018-05-10

本次发布包含来自 10.3 的多项修复。 有关 10 主版本新特性的说明,请参见 Section E.24.

E.20.1. 迁移到版本 10.4

对于运行 10.X 的用户,不需要执行导出/恢复。

但是,如果使用了 adminpack 扩展,应按照下方第一条变更日志更新它。

此外,如果下方第二和第三条变更日志提到的函数标记错误影响到您,应采取措施纠正数据库目录。

此外,如果是从早于 10.3 的版本升级,请参见 Section E.21

E.20.2. 变更

  • 撤销 contrib/adminpackpg_logfile_rotate() 函数的公共执行权限(Stephen Frost)

    pg_logfile_rotate() 是核心函数 pg_rotate_logfile() 的一个已弃用包装函数。后者改为依靠 SQL 权限进行访问控制,而不再使用硬编码的超级用户检查时,本应同时更新 pg_logfile_rotate(),但这一点被遗漏了。因此,如果安装了 adminpack,任何用户都可以请求轮转日志文件,造成一个较轻微的安全问题。

    安装此更新后,管理员应在每个安装了 adminpack 的数据库中执行 ALTER EXTENSION adminpack UPDATE,以更新 adminpack。(CVE-2018-1115)

  • 修复若干内置函数不正确的易变性标记(Thomas Munro,Tom Lane)

    函数 query_to_xmlcursor_to_xmlcursor_to_xmlschemaquery_to_xmlschemaquery_to_xml_and_xmlschema 应标记为易变,因为它们执行用户提供的查询,而这些查询可能包含易变操作。以前未作此标记,存在查询优化不正确的风险。通过纠正初始目录数据,新安装已修复此问题,但现有安装仍包含不正确的标记。这些函数的实际使用似乎风险很小,但如果遇到问题,可以手动更新这些函数的 pg_proc 条目,例如 ALTER FUNCTION pg_catalog.query_to_xml(text, boolean, boolean, text) VOLATILE。(注意,必须在安装中的每个数据库内执行。)另一种方法是使用 pg_upgrade 将数据库升级到包含已纠正初始数据的版本。

  • 修复若干内置函数不正确的并行安全性标记(Thomas Munro,Tom Lane)

    函数 brin_summarize_new_valuesbrin_summarize_rangebrin_desummarize_rangegin_clean_pending_listcursor_to_xmlcursor_to_xmlschemats_rewritets_statbinary_upgrade_create_empty_extensionpg_import_system_collations 应标记为并行不安全;其中一些直接修改数据库,另一些执行可能修改数据库的用户查询。以前,它们却被标记为并行受限,存在发生意外查询错误的风险。通过纠正初始目录数据,新安装已修复此问题,但现有安装仍包含不正确的标记。除非开启 force_parallel_mode,这些函数的实际使用似乎风险很小。如果遇到问题,可以手动更新这些函数的 pg_proc 条目,例如 ALTER FUNCTION pg_catalog.brin_summarize_new_values(regclass) PARALLEL UNSAFE。(注意,必须在安装中的每个数据库内执行。)另一种方法是使用 pg_upgrade 将数据库升级到包含已纠正初始数据的版本。

  • 避免复用与已死亡但尚未清理的 TOAST 条目匹配的 TOAST 值 OID(Pavan Deolasee)

    一旦 OID 计数器发生回卷,就可能为 TOAST 值分配一个与同一 TOAST 表中先前删除条目相同的 OID。如果该条目尚未被清理,这会导致 unexpected chunk number 0 (expected 1) for toast value nnnnn 错误,并持续到 VACUUM 移除死亡条目为止。修复方法是在创建新 TOAST 条目时不选择此类 OID。

  • 向分区表执行 COPY 时,正确实施各个分区上的所有 CHECK 约束(Etsuro Fujita)

    以前,只会检查为整个分区表声明的约束。

  • 接受 TRUEFALSE 作为分区边界值(Amit Langote)

    以前,布尔类型的分区列只接受字符串字面值。但 pg_dump 会将这些值输出为 TRUEFALSE,从而导致转储/重载失败。

  • 修复分区键比较函数的内存管理(Álvaro Herrera,Amit Langote)

    使用用户定义的分区键操作符类时,此错误可能导致崩溃。

  • 修复查询向分区表的多个分区插入元组,且这些分区行类型不同时可能发生的崩溃(Etsuro Fujita,Amit Langote)

  • 更改 ANALYZE 更新 pg_class.reltuples 的算法(David Gould)

    以前,假定 ANALYZE 未实际扫描的页面保持原有元组密度。对于大表,ANALYZE 仅对很小一部分页面采样,这意味着整体元组密度估算无法发生太大变化,因此无论表内实际发生什么,reltuples 都会近似正比于表物理大小(relpages)的变化而变化。已观察到这会使 reltuples 远大于实际值,以至于自动清理实际上停止工作。修复方法是假定 ANALYZE 的样本是该表统计上无偏的样本(它本应如此),并直接将这些页面内观测到的密度外推到整个表。

  • 将扩展统计对象包含在 CREATE TABLE ... LIKE ... INCLUDING ALL 复制的表属性集合中(David Rowley)

    同时添加 INCLUDING STATISTICS 选项,以更细致地控制是否复制这些对象。

  • 修复带有 bigint 标识列的 CREATE TABLE ... LIKE(Peter Eisentraut)

    long 为 32 位的平台上(包括 64 位 Windows 和大多数 32 位机器),复制的序列参数会被截断为 32 位。

  • 避免在 SERIALIZABLEREPEATABLE 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)

    此错误可能将本应为普通过滤条件的条件错误归类为外连接的连接过滤条件,导致连接输出不正确。

  • 修复同一表列出现在多个索引列中,且只有部分索引列使用能够返回列值的操作符类时,可能错误生成仅索引扫描计划的问题(Kyotaro Horiguchi)

  • 修复对 CHECK 约束的不正确优化,此类约束的顶层 AND/OR 条件包含可证明为 NULL 的子句(Tom Lane,Dean Rasheed)

    例如,这可能使约束排除机制从查询中排除本不应被排除的子表。

  • 防止查询具有多个 GROUPING SETS 且没有任何一个可以通过排序实现时规划器崩溃(Andrew Gierth)

  • 修复某些 GROUPING SETS 用法中因重复释放导致的执行器崩溃(Peter Geoghegan)

  • 修复对过渡表执行自连接时的不正确执行(Thomas Munro)

  • 避免添加表重写事件触发器与可能调用此类触发器的命令并发进行时发生崩溃(Álvaro Herrera,Andrew Gierth,Tom Lane)

  • 避免提交预备事务时出现查询取消或会话终止中断而发生失败(Stas Kelvich)

  • 修复重复执行的哈希连接中持续整个查询生命周期的内存泄漏(Tom Lane)

  • 修复可见性映射缓冲区固定可能泄漏或重复释放的问题(Amit Kapila)

  • 避免错误地将页标记为全可见(Dan Wood,Pavan Deolasee,Álvaro Herrera)

    某些元组被锁定(但未删除)时,可能出现此问题。虽然查询仍能正常运行,但清理通常会忽略这些页,长期后果是这些元组永远不会被冻结。在近期版本中,这最终会导致 found multixact nnnnn from before relminmxid nnnnn 等错误。

  • 修复 heap_prepare_freeze_tuple 中过于严格的合理性检查(Álvaro Herrera)

    这可能导致通过 pg_upgrade 从 9.2 或更早版本升级的数据库出现不正确的 cannot freeze committed xmax 失败。

  • 防止用 C 编写的更新前行触发器返回元组时解引用悬空指针(Rushabh Lathia)

  • 减少自动清理工作进程调度期间的加锁(Jeff Janes)

    对于有大量表的数据库,以前的行为会大幅降低工作进程原本可以达到的并发度。

  • 确保将 pg_stat_activity 数据复制到本地内存时也复制客户端主机名(Edmund Horner)

    以前,本应位于本地的快照包含一个指向共享内存的指针,因此任何现有会话断开连接,都可能使客户端主机名列意外改变。

  • 正确处理辅助进程的 pg_stat_activity 信息(Edmund Horner)

    这些进程的 application_nameclient_hostnamequery 字段可能显示不正确的数据。

  • 修复 ispell 字典对多个复合词缀处理不正确的问题(Arthur Zakirov)

  • 修复文本列上 SP-GiST 索引中考虑排序规则的搜索(即使用不等式操作符的索引扫描)(Tom Lane)

    在大多数非 C 区域设置下,这类搜索会返回错误的行集。

  • 防止使用遍历值的 SP-GiST 操作符类在查询生命周期内泄漏内存(Anton Dignös)

  • 在首次构建 SP-GiST 索引时正确统计索引元组数(Tomas Vondra)

    以前,报告的元组数与底层表相同,但对于部分索引,这个值是不正确的。

  • 在清理 GiST 索引时正确统计索引元组数(Andrey Borodin)

    以前,报告的是估算的堆元组数,这个值可能不准确,而对于部分索引则肯定不正确。

  • 修复流复制备库卡在 WAL 续接记录上的一种边界情况(Kyotaro Horiguchi)

  • 在逻辑解码中,避免 WAL 发送进程 重启时可能重复处理 WAL 数据的问题(Craig Ringer)

  • 修复逻辑复制,使其不再假定本地和远程服务器的类型 OID 相同(Masahiko Sawada)

  • 允许将 scalarltselscalargtsel 用于非核心数据类型(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)

    pg_dump 输出中未正确引用 local_preload_librariessession_preload_librariesshared_preload_librariestemp_tablespaces 变量。如果这些变量的设置出现在 CREATE FUNCTION ... SETALTER DATABASE/ROLE ... SET 子句中,就会导致问题。

  • 修复 pg_recvlogical,使其连接到 v10 之前的 PostgreSQL 服务器时不会失败(Michael Paquier)

    之前的一项修复导致 pg_recvlogical 无论服务器版本如何都会发出一条命令,但该命令只应向 v10 及更高版本的服务器发出。

  • 确保 pg_rewind 在运行期间源服务器删除文件时,也删除目标服务器上的这些文件(Takayuki Tsunakawa)

    未执行此操作可能导致目标上的数据不一致,尤其当相关文件是 WAL 段时。

  • 修复 pg_rewind,使其正确处理非默认表空间中的表(Takayuki Tsunakawa)

  • 修复 PL/pgSQL 整数 FOR 循环的溢出处理(Tom Lane)

    以前的代码在某些非 gcc 编译器下无法检测循环变量的溢出,导致无限循环。

  • 调整 PL/Python 回归测试,使其在 Python 3.7 下通过(Peter Eisentraut)

  • 支持在使用 Python 3 和 MSVC 构建时测试 PL/Python 及相关模块(Andrew Dunstan)

  • 修复首次构建 contrib/bloom 索引时的错误(Tomas Vondra,Tom Lane)

    修复索引可能遗漏表的最后一个元组的问题。对于部分索引,正确统计索引元组数。

  • 重命名内部函数 b64_encodeb64_decode,避免与 Solaris 11.4 的内置函数冲突(Rainer Orth)

  • 将所用时区库同步到 IANA tzcode 2018e 版(Tom Lane)

    此更新修复了 zic 时区数据编译器,使其能够处理负的夏令时偏移量。虽然 PostgreSQL 项目不会立即附带此类时区数据,但 zic 可能用于处理直接从 IANA 获取的时区数据,因此现在更新 zic 是稳妥的做法。

  • 将时区数据文件更新到 tzdata 2018d 版,以反映巴勒斯坦和南极洲(凯西站)的夏令时法规变更,并修正葡萄牙及其殖民地、恩德伯里岛、牙买加、特克斯 & 凯科斯群岛和乌拉圭的历史数据。