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

PostgreSQL 10.18 发布说明

E.6. 发布版本 10.18 #

发布日期:. 2021-08-12

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

E.6.1. 迁移到版本 10.18

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

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

E.6.2. 变更

  • 更彻底地禁止 SSL 重新协商(Michael Paquier)

    虽然 SSL 重新协商已被禁用一段时间,但服务器仍会配合客户端发起的重新协商请求。恶意构造的重新协商请求可能导致服务器崩溃(参见 OpenSSL 问题 CVE-2021-3449)。在允许完全禁用此功能的 OpenSSL 版本(即 1.1.0h 及更新版本)上,将其彻底禁用。

  • 拒绝 SELECT ... GROUP BY GROUPING SETS (()) FOR UPDATE(Tom Lane)

    正如不允许将 FOR UPDATE 与普通 GROUP BY 一起使用一样,这种情况也应被禁止,但相关检查未能正确处理空分组集。最终结果会是执行器中的空指针解引用。

  • 拒绝 WITH 中的查询被重写为仅包含 NOTIFY 的情况(Tom Lane)

    以前,这些情况会导致崩溃。

  • numeric 乘法中,如果结果的小数点后超过 16383 位,则对结果进行舍入,而不报错(Dean Rasheed)

  • 修复对 numeric 值计算极大次幂时的边界情况错误和精度损失(Dean Rasheed)

  • 修复 to_char() 使用 EEEE 格式且输入的 numeric 值小于 10^(-1001) 时的除零错误(Dean Rasheed)

  • 修复 pg_size_pretty(bigint),使其对负值的舍入与对正值的舍入方式一致(也与 numeric 版本一致)(Dean Rasheed,David Rowley)

  • 使 pg_filenode_relation(0, 0) 返回 NULL,而不报错(Justin Pryzby)

  • 使 ALTER EXTENSION 在添加或移除成员对象时锁定扩展(Tom Lane)

    以前的代码允许 ALTER EXTENSION ADD/DROPDROP EXTENSION 并发执行,导致崩溃或目录条目损坏。

  • 修复 ALTER SUBSCRIPTION,使其拒绝空的槽名称(Japin Li)

  • 避免为 REFRESH MATERIALIZED VIEW CONCURRENTLY 生成的查询中的别名冲突(Tom Lane,Bharath Rupireddy)

    如果物化视图包含某些名称的列,尤其是 mvnewdata,此命令就会失败。

  • 修复 PREPARE TRANSACTION,使其正确检查会话生命周期锁与事务生命周期锁之间的冲突(Tom Lane)

    如果一个事务在同一个咨询锁 ID 值上同时持有会话生命周期锁和事务生命周期锁,就不能预备该事务。以前没有完整检查这一限制,可能导致 PREPARE TRANSACTION 期间发生 PANIC。

  • 修复目标角色在 RLS 策略中被列出多次时 DROP OWNED BY 的异常行为(Tom Lane)

  • DROP OWNED BY 期间从 RLS 策略中移除角色时,跳过不必要的错误检查(Tom Lane)

    值得一提的是,这修复了某些必须是超级用户才能使用 DROP OWNED BY 的情况。

  • 允许以事务方式更新索引状态标志(Michael Paquier,Andrey Lepikhov)

    这可以避免处理实际上并非不可变的索引谓词时发生失败。虽然这种情况不被视为受支持的用法,但这里最初采用非事务更新的原因早已不复存在,因此不妨进行修改。

  • 避免缓存计划中出现 CREATE DOMAINALTER DOMAIN 时损坏计划缓存条目(Tom Lane)

  • 使 WAL 发送进程 在 pg_stat_activity 中显示最新的复制命令(Tom Lane)

    以前,WAL 发送进程 会显示其最新的 SQL 命令,如果它此时正在执行复制操作,就会令人困惑。现在将复制协议命令与 SQL 命令同等显示。

  • postgresql.conf 中的相关条目被移除时,使 pg_settings.pending_restart 显示为 true(Álvaro Herrera)

    对于必须重启 postmaster 才能更改的条目,pending_restart 能正确显示条目已被修改的情况,却无法显示条目被完全移除的情况。

  • 修复新备库在边界情况下无法跟随新主库的问题(Dilip Kumar,Robert Haas)

    在一组少见的条件组合下,备库可能最终尝试跟随错误的 WAL 时间线。

  • 当事务中止记录的 WAL 重放导致文件截断时,更新最小恢复点(Fujii Masao)

    文件截断是不可逆的,因此在早于该记录的位置停止恢复已不再安全。事务提交的对应情况多年前就已修复,但这一情况被遗漏了。

  • 在 WAL 接收进程 中,避免发生错误后尝试查找系统目录(Masahiko Sawada,Bharath Rupireddy)

  • 确保备库的启动进程在等待 WAL 到达时及时响应关闭信号(Fujii Masao,Soumyadeep Chakraborty)

  • 增加锁定,避免其他进程并发写入时读取到错误的 relmapper 数据(Heikki Linnakangas)

  • 改进对违反复制协议的情况的检查(Tom Lane)

    逻辑复制工作进程经常使用断言来检查可能由无效或乱序复制命令触发的情况。这似乎并不明智,因此将这些检查改为常规错误检查。

  • 修复对推测插入进行逻辑解码时的错误情况和内存泄漏(Dilip Kumar)

  • 修复 CREATE TABLE ... AS EXECUTE 在某些错误情况下的计划缓存引用泄漏(Tom Lane)

  • 修复释放 BackgroundWorkerSlots 时可能出现的竞争条件(Tom Lane)

    这可能不会修复 Intel 硬件上任何可观察到的缺陷,但内存排序规则较弱的机器可能存在问题。

  • 修复排序代码中潜在的崩溃(Ronan Dunklau)

    某个代码路径可能尝试释放空指针。在核心服务器使用排序的方式中,这种情况似乎无法触发,但扩展或许能够触发。

  • 防止 SP-GiST 索引插入中的无限循环(Tom Lane)

    如果 INCLUDE 列占用的空间很大,使叶子索引元组无论如何都无法放入一页,text_ops 操作符类就会陷入无限循环,徒劳地尝试让该元组放得下。虽然 v11 之前的版本没有 INCLUDE 列,仍将这一防止循环的修复反向移植到这些版本,因为它似乎能有效防范操作符类中的缺陷。

  • 确保 SP-GiST 索引插入可以被查询取消请求终止(Tom Lane,Álvaro Herrera)

  • 修复未初始化变量的缺陷,该缺陷可能使 PL/pgSQL 表现得像 INTO 子句指定了 STRICT,即使实际并未指定(Tom Lane)

  • 不要因 libpq 打印函数中的内存不足而中止进程(Tom Lane)

  • ecpg 中,允许将 numericINT_MIN(通常为 -2147483648)转换为整数(John Naylor)

  • psql 和其他客户端程序中,避免处理编码无效的数据时越过字符串末尾(Tom Lane)

    字符串末尾附近编码不正确的多字节字符,可能导致各种处理循环越过字符串末尾的 NUL。根据随后内存中的内容,其后果可能从没有可检测的问题到程序崩溃不等。这与 CVE-2006-2313 相似,不过这些具体情况似乎不会造成值得关注的安全后果。

  • 避免对不同时区创建的归档文件运行 pg_restore 时出现 invalid creation date in header 警告(Tom Lane)

  • 使 pg_upgrade 沿用旧安装实例的 oldestXID 值(Bertrand Drouvot)

    以前,新安装实例的 oldestXID 会被设为一个很旧的值,通常足以强制立即进行防回卷自动清理。从性能角度看,这并不理想;更糟的是,使用较大 autovacuum_freeze_max_age 值的实例可能在升级后不久就遭遇意外的强制关闭。

  • 扩展 pg_upgrade,使其检测应升级的扩展并发出警告(Bruce Momjian)

    现在会生成一个脚本文件,其中包含将扩展升级到新安装实例中默认版本所需的 ALTER EXTENSION UPDATE 命令。

  • 避免 pg_receivewal 在压缩与非压缩 WAL 存储之间切换时出现问题(Michael Paquier)

  • contrib/postgres_fdw 中,避免发生错误后尝试查找系统目录(Tom Lane)

    虽然这通常能正常工作,但并不十分安全,因为发生的错误可能已经使目录访问无法正常进行。这一修复的副作用是,关于数据转换错误的消息现在会提及查询中的表和列别名(如果使用了别名),而非底层外部表或列的真实名称。

  • 改进隔离测试基础设施(Tom Lane,Michael Paquier)

    允许对隔离测试步骤添加注解,说明预期的完成顺序。这使原本存在竞争的测试用例也能获得稳定结果,无需再像以前那样使用长时间延迟来规避竞争条件(而且以前也并未完全成功)。允许使用不带引号的标识符作为隔离测试的会话或步骤名称(以前,所有此类名称都必须加双引号)。检测隔离测试中未使用的步骤并发出警告。改进隔离测试中查询结果的显示。移除 isolationtester 的试运行模式。消除 isolationtester 自身的内存泄漏。

  • 减少强制破坏缓存测试的开销(Tom Lane)

  • 修复 PL/Python 的回归测试,使其在 Python 3.10 下通过(Honza Horak)

  • 使 printf("%s", NULL) 打印 (null),而不崩溃(Tom Lane)

    这应该能提高服务器在边界情况下的稳健性,并使我们的 printf 实现与常见库保持一致。

  • 修复时间点恢复停止在 ROLLBACK PREPARED 记录处时不正确的日志消息(Simon Riggs)

  • 使涉及非负值的错误消息更清晰(Bharath Rupireddy)

  • 修复 configure,使其支持不再提供独立 libldap_r 库的 OpenLDAP 2.5(Adrian Ho,Tom Lane)

    如果不存在 libldap_r 库,现在会静默假定 libldap 是线程安全的。

  • 增加新的 make 目标 world-bininstall-world-bin(Andrew Dunstan)

    它们分别与 worldinstall-world 相同,但不构建或安装文档。

  • 修复 TAP 测试的 make 规则(prove_installcheck),使其在 PGXS 用法下正常工作(Andrew Dunstan)

  • 允许 PostgreSQL 版本 10 使用 ICU 69 及更新版本构建(Peter Eisentraut)

  • 避免假定 GSSAPI 库返回的字符串以空字符结尾(Tom Lane)

    GSSAPI 规范提供字符串指针和长度。在实践中,字符串后的下一个字节似乎通常为零,因此我们以前的代码没有实际失败;但确实收到了 AddressSanitizer 报错的报告。

  • 允许在 MSVC 上构建 GSSAPI 支持(Michael Paquier)

    修复与现代 Kerberos 构建的各种不兼容问题。

  • 在 MSVC 构建中,如果指定了 --with-pgport,则将其包含在 pg_config 报告的 configure 选项中(Andrew Dunstan)