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

PostgreSQL 13.3 发布说明

E.21. 发布版本 13.3 #

发布日期:. 2021-05-13

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

E.21.1. 迁移到版本 13.3

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

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

E.21.2. 变更

  • 防止数组下标计算中的整数溢出(Tom Lane) §

    以前,当数组下界加上长度发生整数溢出时,数组代码不会报错。这会使数组中后面的项无法访问(因为它们的下标无法表示为整数),更重要的是还会干扰后续赋值操作。这可能造成内存覆盖,进而导致崩溃或非预期的数据修改。(CVE-2021-32027)

  • 修复 INSERT ... ON CONFLICT ... UPDATE 目标列表中对 junk 列的错误处理(Tom Lane) §

    如果 UPDATE 列表包含任何多列子查询(它们除了产生正式结果外,还会产生 junk 列),UPDATE 路径最终会存储包含额外 junk 列值的元组。短期内这基本无害,但如果向表中添加新列,这些值就会变得可访问;如果它们与新增列的数据类型不匹配,就可能导致异常。

    此外,在支持跨分区更新的版本中,由此类情况触发的跨分区更新存在相反的问题:junk 列被从目标列表中移除,通常会因多列子查询机制失效而立即崩溃。(CVE-2021-32028)

  • 修复涉及连接的跨分区更新中 UPDATE ... RETURNING 输出可能计算不正确的问题(Amit Langote,Etsuro Fujita) § §

    如果对分区表的 UPDATE 使某行被移动到另一个行类型在物理上不同的分区(例如,已删除列的集合不同),为该行计算 RETURNING 结果时可能报错或得到错误的结果。只有当 UPDATE 涉及将其他表连接到目标表时,才会出现此错误。(CVE-2021-32029)

  • 修复分区表中约束可延迟属性的调整(Álvaro Herrera) §

    对分区表的外键约束执行 ALTER TABLE ... ALTER CONSTRAINT 时,未能调整叶子分区的约束和触发器上的 DEFERRABLEINITIALLY DEFERRED 标记。这导致此类约束产生非预期的行为。更新到此版本后,可以执行新的 ALTER 命令设置所需属性,从而修复行为异常的分区表。

    此项修改还禁止直接对叶子分区的约束执行这样的 ALTER。唯一受支持的情况是整个分区层次结构具有相同的约束属性,因此此类 ALTER 必须在分区根表上执行。

  • 使用 ALTER TABLE ... INHERIT 附加子表时,要求子表中与父表生成列对应的列以相同方式生成(Peter Eisentraut) §

  • 禁止将标识列标记为可空(Vik Fearing) §

    GENERATED ... AS IDENTITY 隐含 NOT NULL,因此不允许将其与显式的 NULL 指定结合使用。

  • 允许 ALTER ROLE/DATABASE ... SET 设置 rolesession_authorizationtemp_buffers 参数(Tom Lane) §

    以前,过于急切的有效性检查可能拒绝这些命令,即使相关值在之后实际使用时本可以正常工作。这使转储/重载和升级场景中出现了命令顺序方面的隐患。

  • 确保 REINDEX CONCURRENTLY 保留为索引设置的统计目标(Michael Paquier) § §

  • 修复 COMMIT AND CHAIN,使其在当前事务存在有效保存点时正确工作(Fujii Masao) §

  • 修复 WITH RECURSIVE 处理中的列表操作缺陷(Michael Paquier,Tom Lane) §

    足够深的 WITH 结构嵌套(至少七层)会触发核心转储,或错误地报告 WITH 嵌套有误。

  • 修复将 COLLATE 表达式的结果强制转换为不支持排序规则的类型时的缺陷(Tom Lane) §

    这会生成一棵语法解析树,其中 COLLATE 看起来被应用于一个不支持排序规则的值。虽然这通常没有实际影响(因为 COLLATE 在运行时没有作用),但仍有可能构造出在转储/重载期间被拒绝的视图。

  • 修复为 AFTER 触发器保存元组时的释放后使用缺陷(Amit Langote) §

    这在某些情况下可能导致崩溃。

  • 禁止通过快速路径线协议消息调用窗口函数和过程(Tom Lane) §

    这里只支持普通函数。虽然尝试调用聚合函数已经会失败,但调用窗口函数会导致崩溃,而调用过程只有在过程不进行事务控制时才能正常工作。

  • 扩展 pg_identify_object_as_address(),使其支持事件触发器(Joel Jacobson) § §

  • 修复 to_char() 对负时间间隔使用罗马数字月份格式代码的处理(Julien Rouhaud) §

    以前,此类情况通常会导致崩溃。

  • 检查 pg_import_system_collations() 的参数是否为有效的模式 OID(Tom Lane) §

  • 修复解析 BRE 模式正则表达式中的 \{m,n\} 量词时使用未初始化值的问题(Tom Lane) §

    此错误可能使量词表现为非贪婪模式,即表现得像完整正则表达式中的 {m,n}? 量词。

  • 修复排序键涉及聚合函数或窗口函数的某些情况下出现的 could not find pathkey item to sort 规划器错误(James Coleman,Tom Lane) §

  • 使用扩展统计信息估计分组数量时,不要忽略系统列(Tomas Vondra) §

    这会导致 SELECT ... GROUP BY a, b, ctid 等查询得到异常的估计值。

  • 避免估计具有很长固定前缀的正则表达式的选择率时出现除零错误(Tom Lane) §

    这通常会产生 NaN 选择率值,从而导致断言失败或规划器行为异常。

  • 修复 BRIN 索引位图扫描中访问超出表末尾位置的错误(Tomas Vondra) §

    如果 BRIN 索引使用的页范围大小不是二的幂,在某些边界情况下,位图扫描可能尝试获取超出表实际末尾的页面,导致 could not open file 错误。

  • 修复匹配元组很多时,GIN tsvector 索引搜索可能返回错误结果的问题(Tom Lane) §

    如果索引匹配项的数量足够多,导致存储它们的位图变为有损位图(阈值取决于 work_mem),代码就可能错误判断是否需要重新检查,从而返回实际上并不匹配查询的行。

  • 修复 Windows 上 WAL 段回收的并发问题(Michael Paquier) §

    这撤销了一项会间歇性产生 could not rename file ...: Permission denied 日志消息的修改。虽然没有严重后果,但大量无用日志令人困扰。

  • 避免从 WAL 恢复未提交的两阶段事务时发生不正确的时间线变更(Soumyadeep Chakraborty,Jimmy Yih,Kevin Yeap) §

    此错误可能使后续 WAL 记录在错误的时间线 ID 下写入,导致之后出现一致性问题,甚至完全无法重启服务器。

  • 确保关闭备库的启动进程时释放锁(Fujii Masao) §

    在备库仍处于恢复状态时将其关闭,可能会留下某些仍被持有的锁。这会导致调试构建中的断言失败;尚不清楚在生产构建中是否可能造成严重后果。

  • 修复逻辑复制工作进程执行 ALTER SUBSCRIPTION REFRESH 时的崩溃(Peter Smith) §

    核心代码不会这样做,但副本触发器可能会。

  • 确保在较新版本的 FreeBSD 上默认使用 wal_sync_method = fdatasync(Thomas Munro) §

    FreeBSD 13 支持 open_datasync,通常它会成为默认选择。但尚不清楚这对 Postgres 是否确有改进,因此暂时保留现有默认值。

  • 禁用 vacuum_cleanup_index_scale_factor 参数及存储选项(Peter Geoghegan) § §

    事实证明,跟踪过期索引统计信息的做法与 autovacuum_vacuum_insert_threshold 参数配合不当,会导致不必要的全索引扫描,进而降低自动清理性能。后者的机制似乎更好,因此移除过期统计信息逻辑。控制该逻辑的参数 vacuum_cleanup_index_scale_factor 将在 v14 中完全移除。在 v13 中,为避免破坏现有配置文件,该参数仍然存在,但已不再产生任何作用。

  • ALTER CONSTRAINT 期间,将正确的触发器 OID 传递给对象修改后钩子(Álvaro Herrera) §

    ALTER CONSTRAINT 期间更新触发器属性时,修改后钩子被告知正在更新触发器,但传入的却是约束的 OID,而非触发器的 OID。

  • 确保分离 DSM 段期间被中断时仍能完成清理(Thomas Munro) §

    此错误可能导致并行查询后未能及时清理临时文件。

  • 修复服务器中多种较小的内存泄漏(Tom Lane,Andres Freund) § § § § § § §

  • 修复共享内存中 WAL 接收进程 统计信息里的未初始化变量(Fujii Masao) §

    此错误在大多数平台上无害,但在缺乏原子变量或自旋锁支持的平台上可能造成问题。

  • 在编译时包含了 dtrace 支持但未启用时,降低 LWLock 操作中 dtrace 探针的开销(Peter Eisentraut) § §

  • 修复 PL/pgSQL DO 块同时使用复合类型变量和事务控制时的失败(Tom Lane) §

    以前,此类情况会导致关于元组描述符泄漏的错误。

  • 防止 libpq 收到长度损坏的 ParameterDescription 消息时陷入无限循环(Tom Lane) §

  • initdb 打印如何启动服务器的说明时,使其在 Windows 上显示的 pg_ctl 路径使用反斜杠分隔符(Nitin Jadhav) §

  • 修复 psql,恢复 \connect service=something 以前的行为(Tom Lane) §

    先前的一项缺陷修复导致环境变量(例如 PGPORT)在此情况下覆盖服务文件中的条目。现在恢复以前的行为,使优先级反过来。

  • 修复 psqlON_ERROR_ROLLBACK 功能,使其正确处理 COMMIT AND CHAIN 命令(Arthur Nascimento) §

    以前,这种情况会以 savepoint "pg_psql_temporary_savepoint" does not exist 错误失败。

  • psql 中,避免首次出现 could not print result table 错误后反复发生同类错误(Álvaro Herrera) §

  • 修复 psql\e 及相关命令检测文件修改时的竞争条件(Laurenz Albe) §

    输入速度非常快的用户可能使代码基于文件时间戳对临时编辑文件是否更改的判断失准。

  • 修复 pg_dump 对分区表中生成列的转储(Peter Eisentraut) §

    上一个小版本引入的一项修复只应应用于传统继承表,不应应用于分区表。

  • 修复 pg_restore 中遗漏的文件版本检查(Tom Lane) §

    从不支持定位的来源读取自定义格式归档时,pg_restore 忽略了检查归档版本。如果输入的归档版本比它所支持的版本更新,之后就会以混乱的方式失败。

  • pg_upgrade 增加对包含不可升级数据类型的用户表的检查(Tom Lane) §

    修复对不可升级的数据类型嵌入容器类型(例如数组或范围)中的某些情况的检测。另外,如果用户表包含系统定义的复合类型的列,则不允许升级,因为这些类型的 OID 在不同版本之间并不稳定。

  • 修复 pg_checksums 中不正确的进度报告计算(Shinya Kato) §

  • 修复 pg_waldump,使其在生成逐记录统计信息时正确统计 XACT 记录(Kyotaro Horiguchi) §

  • 修复 contrib/amcheck,使其不再因元组标志 HEAP_XMAX_LOCK_ONLYHEAP_KEYS_UPDATED 同时设置而报错(Julien Rouhaud) §

    这是 SELECT FOR UPDATE 之后的一种有效状态。

  • 调整 VPATH 构建规则,以支持较新版本的 Oracle Developer Studio 编译器(Noah Misch) §

  • 修复 Solaris 上针对 Python 3 的 PL/Python 测试(Noah Misch) §