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

PostgreSQL 10.14 发布说明

E.10. 发布版本 10.14 #

发布日期:. 2020-08-13

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

E.10.1. 迁移到版本 10.14

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

但是,如果是从早于 10.11 的版本升级,请参见 Section E.13

E.10.2. 变更

  • 在逻辑复制 WAL 发送进程 和应用工作进程中设置安全的 search_path(Noah Misch)

    发布者或订阅者数据库中的恶意用户,都可能导致以运行复制的角色身份执行任意 SQL 代码,而该角色通常是超级用户。这里的一部分风险与 CVE-2018-1058 中所述的风险相同,本补丁通过确保复制发送进程和接收进程以空的 search_path 设置运行来缓解这些风险。(与 CVE-2018-1058 一样,这一改动可能使被复制表的 DDL 中未充分限定的名称出现问题。)其他风险则是复制不可信角色所属对象所固有的;我们最多只能在文档中说明存在需要考虑的风险。(CVE-2020-14349)

  • 提高 contrib 模块安装脚本的安全性(Tom Lane)

    如果攻击者能够在扩展的目标模式或某个前置扩展的模式中创建对象,就可以针对扩展安装脚本实施与 CVE-2018-1058 中所述类似的攻击。由于安装扩展通常需要超级用户权限,这可能成为获取超级用户权限的一条途径。为缓解这一风险,更谨慎地设置运行安装脚本时使用的 search_path;在脚本中禁用 check_function_bodies;并修正一些 contrib 模块中用于调整系统目录的查询,确保它们安全。同时提供文档,帮助第三方扩展作者编写安全的安装脚本。这并不是完整的解决方案;如果安装时不够谨慎,依赖其他扩展的扩展仍可能面临风险。(CVE-2020-14350)

  • 在逻辑复制 WAL 发送进程 中,修复发送保活消息后未能发送反馈消息的问题(Álvaro Herrera)

    使用内置逻辑复制时,这个问题相对较小,因为内置 WAL 接收进程 本来就会相当频繁地发送反馈回复(从而清除错误状态)。但对于 pglogical 等其他复制系统,它会造成显著的性能问题。

  • 修复逻辑复制订阅者中特定列 UPDATE 触发器的触发(Tom Lane)

    代码忽略了发布者和订阅者的表中列编号可能不同的情况,因此如果列编号确实不同,就可能错误判断应触发哪些触发器。

  • 修复 ts_headline() 执行缓慢的问题(Tom Lane)

    上一批小版本中添加的短语搜索修复,可能使 ts_headline() 处理长文档时耗费极不合理的时间;更糟的是,在出现问题的循环中无法取消查询。

  • 确保 repeat() 函数可以被查询取消中断(Joe Conway)

  • 修复 pg_current_logfile(),使其结果在 Windows 上不包含回车符(\r)(Tom Lane)

  • 修复对 numeric 类型列进行并行聚合时对 NaN 输入的错误处理(Tom Lane)

    如果某些部分聚合工作进程只找到 NaN,而其他工作进程只找到非 NaN 值,结果就会被错误合并,可能导致整体结果错误(即本应为 NaN 时却不是)。

  • 拒绝大于 24 小时的日内时间值(Tom Lane)

    日期时间输入代码的本意是允许 24:00:00 或等价的 23:59:60,但不允许更大的值。然而,范围检查的代码有误,会接受 23:59:60.nnn,其中小数秒 nnn 可以非零。对于时间戳值,这会使其跨入下一天的第一秒。对于 timetimetz 值,存储的值实际上会超过 24 小时,从而导致转储/重载失败,并可能引发其他异常行为。

  • 撤销 EXPLAIN 非文本输出格式中为索引名称添加双引号的行为(Tom Lane,Euler Taveira)

  • 修复 EXPLAIN 对使用 Gather Merge 节点的计划中并行工作进程的资源使用统计,尤其是缓冲区访问统计(Jehan-Guillaume de Rorthais)

  • 修复 ALTER TABLE 中重新验证约束的时机(David Rowley)

    如果 ALTER TABLE 需要完全重写表内容(例如更改列的数据类型),又需要扫描表以重新验证外键或 CHECK 约束,有时会按错误顺序执行,导致 could not read block 0 in file "base/nnnnn/nnnnn": read only 0 of 8192 bytes 等奇怪错误。

  • 规避 pg_subscription.subslotnamepg_subscription_rel.srsublsn 上不正确的非空标记(Tom Lane)

    引导目录数据错误地将这两个目录列标记为始终非空。在现有安装实例中不容易修正这一错误(不过 v13 及更新版本将具有正确标记)。主要依赖该标记正确性的地方是启用 JIT 的元组解构,因此让它显式忽略这两列的标记。另外,调整某些未检查是否为空就访问 srsublsn 的 C 代码;由此引发崩溃的可能性很低,但或许并非不可能。

  • 处理附加到 FROM 子句中未扁平化的子 SELECT 上的限制子句里的 LATERAL 引用(Tom Lane)

    这一疏漏可能导致查询执行时断言失败或崩溃。

  • 避免认为从未分析过的外部表具有零个元组(Tom Lane)

    这主要影响规划器对 GROUP BY 将产生的分组数量的估计。

  • 移除 BRIN 索引取消汇总过程中关于 leftover placeholder tuple 的错误警告(Álvaro Herrera)

    取消清理后,这种情况可以正常出现,因此对此发出警告会产生过多噪声。

  • 改进服务器 buffile 模块中的错误处理(Thomas Munro)

    修复某些无法区分 I/O 错误与到达 EOF,或完全未报告 I/O 错误的情况。另外,在适当位置增加块号、字节数等详细信息。

  • 修复 SERIALIZABLE 隔离模式中的冲突检查异常(Peter Geoghegan)

    如果一个并发插入的元组被另一个并发事务更新,且两个元组版本对当前事务的快照都不可见,序列化冲突检查就可能错误判断该元组是否与当前事务的结果有关。这可能允许本应因序列化错误而失败的可序列化事务提交。

  • 避免将已失效的 B-树索引条目反复标记为失效(Masahiko Sawada)

    虽然功能上无害,但在启用了校验和或 wal_log_hints 时,这会产生无用的 WAL 流量。

  • 修复某些代码路径修改 pg_control 前未获取正确锁的问题(Nathan Bossart,Fujii Masao)

    这一疏漏可能使 pg_control 以不一致的校验和写出,导致之后出现问题,包括在下次 pg_control 更新之前崩溃时无法重启数据库。

  • 修复 currtid()currtid2() 中的错误(Michael Paquier)

    这些函数没有文档记录,且仅由很早版本的 ODBC 驱动使用。它们包含编码错误,可能导致崩溃,或在应用于没有存储的关系时产生 could not open file 等令人困惑的错误消息。

  • 避免持有自旋锁时调用 elog()palloc()(Michael Paquier,Tom Lane)

    复制槽相关逻辑有几处违反了这一编码规则。虽然出现问题的可能性很低,但被调用函数一旦出错,就会导致自旋锁卡住。

  • 修复逻辑复制订阅者中的断言,以允许使用 REPLICA IDENTITY FULL(Euler Taveira)

    这只是一个不正确的断言,因此不影响标准的生产构建。

  • pg_dumppg_basebackup 中正确报告磁盘空间不足错误(Justin Pryzby,Tom Lane,Álvaro Herrera)

    某些代码路径可能产生 could not write file: Success 之类不合理的报告。

  • 修复同时具有表级权限和逐列权限的表的并行恢复(Tom Lane)

    必须先应用表级权限授予,但并行恢复未能可靠地保证这一顺序,可能导致 tuple concurrently updated 错误,或丢失某些逐列权限授予。修复方式是在归档文件中为这些条目添加依赖链接,因此必须使用修正后的 pg_dump 重新转储,才能确保问题不再发生。

  • 确保 pg_upgrade 运行时,将目标集群中的 vacuum_defer_cleanup_age 设为零(Bruce Momjian)

    如果目标集群的配置已将 vacuum_defer_cleanup_age 设为非零值,就会使系统目录的冻结无法正常进行,进而使升级以令人困惑的方式失败。现在确保在升级期间覆盖此类设置。

  • 修复 pg_recvlogical,使其在退出前读取完待处理消息(Noah Misch)

    否则,复制发送进程可能检测到发送失败并退出,而未对复制槽的 LSN 位置进行预期的最终更新。这会导致下次连接后重新传输数据。另外,还可能遗漏在 pg_recvlogical 想要消费的最后一条数据之后发送的错误消息。

  • 修复 pg_rewind 对源数据目录中刚删除的文件的处理(Justin Pryzby,Michael Paquier)

    使用在线源数据库时,可能发生并发文件删除;但如果删除发生在看到文件目录项与使用 stat() 检查它之间,pg_rewind 就会处理失当。

  • 使 pg_test_fsync 在 Windows 上使用二进制 I/O 模式(Michael Paquier)

    以前,它以文本模式写入测试文件,无法准确反映 PostgreSQL 的实际用法。

  • 修复 contrib/dblink 未能正确初始化本地状态的问题(Joe Conway)

    在特定条件组合下,这可能导致 dblink_close() 发出意外的远程 COMMIT

  • 修复 contrib/pgcryptodeflate() 的错误使用(Tom Lane)

    由于未正确遵循 zlib 的 API 要求,pgp_sym_encrypt 函数可能产生不正确的压缩数据。尚未收到使用原版 zlib 时出现此错误的报告,但使用 IBM 的 zlibNX 实现时可以观察到。

  • 修复 contrib/pgcryptopgp_sym_decrypt 函数中解压缩逻辑的边界情况(Kyotaro Horiguchi,Michael Paquier)

    压缩流可以合法地以空包结束,但解压缩器未能处理这种情况,并会报告数据损坏。

  • 使用 POSIX 标准的 strsignal() 代替 BSD 风格的 sys_siglist[](Tom Lane)

    这避免了使用很新版本的 glibc 时构建失败。

  • 支持使用 Microsoft Visual Studio 2015 及更新版本构建我们的 NLS 代码(Juan José Santamaría Flecha,Davinder Singh,Amit Kapila)

  • 避免源代码树上方数级目录中存在名为 configure 的文件时,MSVC 安装脚本可能发生的失败(Arnold Müller)

    这可能使通过查找 configure 来识别源代码树顶层的某些逻辑产生混淆。