E.16. 发布版本 12.7 #
发布日期:. 2021-05-13
本次发布包含来自 12.6 的多项修复。有关 12 主版本新特性的说明,请参见第 E.23 节。
E.16.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时,未能调整叶子分区的约束和触发器上的DEFERRABLE或INITIALLY DEFERRED标记。这导致此类约束产生非预期的行为。更新到此版本后,可以执行新的ALTER命令设置所需属性,从而修复行为异常的分区表。此项修改还禁止直接对叶子分区的约束执行这样的
ALTER。唯一受支持的情况是整个分区层次结构具有相同的约束属性,因此此类ALTER必须在分区根表上执行。使用
ALTER TABLE ... INHERIT附加子表时,要求子表中与父表生成列对应的列以相同方式生成(Peter Eisentraut)§禁止将标识列标记为可空(Vik Fearing)§
GENERATED ... AS IDENTITY隐含NOT NULL,因此不允许将其与显式的NULL指定结合使用。允许
ALTER ROLE/DATABASE ... SET设置role、session_authorization和temp_buffers参数(Tom Lane)§以前,过于急切的有效性检查可能拒绝这些命令,即使相关值在之后实际使用时本可以正常工作。这使转储/重载和升级场景中出现了命令顺序方面的隐患。
修复
COMMIT AND CHAIN,使其在当前事务存在有效保存点时正确工作(Fujii Masao)§修复将
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 模式正则表达式中的
\{量词时使用未初始化值的问题(Tom Lane)§m,n\}此错误可能使量词表现为非贪婪模式,即表现得像完整正则表达式中的
{量词。m,n}?使用扩展统计信息估计分组数量时,不要忽略系统列(Tomas Vondra)§
这会导致
SELECT ... GROUP BY a, b, ctid等查询得到异常的估计值。避免估计具有很长固定前缀的正则表达式的选择率时出现除零错误(Tom Lane)§
这通常会产生
NaN选择率值,从而导致断言失败或规划器行为异常。修复 BRIN 索引位图扫描中访问超出表末尾位置的错误(Tomas Vondra)§
如果 BRIN 索引使用的页范围大小不是二的幂,在某些边界情况下,位图扫描可能尝试获取超出表实际末尾的页面,导致“could not open file”错误。
避免从 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 是否确有改进,因此暂时保留现有默认值。在
ALTER CONSTRAINT期间,将正确的触发器 OID 传递给对象修改后钩子(Álvaro Herrera)§在
ALTER CONSTRAINT期间更新触发器属性时,修改后钩子被告知正在更新触发器,但传入的却是约束的 OID,而非触发器的 OID。确保分离 DSM 段期间被中断时仍能完成清理(Thomas Munro)§
此错误可能导致并行查询后未能及时清理临时文件。
修复初始化服务器 SSL 参数时的内存泄漏(Michael Paquier)§
这通常影响很小,但如果反复向 postmaster 发送 SIGHUP 信号,泄漏就会随时间累积。
修复 PL/pgSQL
DO块同时使用复合类型变量和事务控制时的失败(Tom Lane)§以前,此类情况会导致关于元组描述符泄漏的错误。
防止 libpq 收到长度损坏的 ParameterDescription 消息时陷入无限循环(Tom Lane)§
当 initdb 打印如何启动服务器的说明时,使其在 Windows 上显示的 pg_ctl 路径使用反斜杠分隔符(Nitin Jadhav)§
修复 psql,恢复
\connect service=以前的行为(Tom Lane)§something先前的一项缺陷修复导致环境变量(例如
PGPORT)在此情况下覆盖服务文件中的条目。现在恢复以前的行为,使优先级反过来。修复 psql 的
ON_ERROR_ROLLBACK功能,使其正确处理COMMIT AND CHAIN命令(Arthur Nascimento)§以前,这种情况会以“savepoint "pg_psql_temporary_savepoint" does not exist”错误失败。
修复 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_ONLY和HEAP_KEYS_UPDATED同时设置而报错(Julien Rouhaud)§这是
SELECT FOR UPDATE之后的一种有效状态。调整 VPATH 构建规则,以支持较新版本的 Oracle Developer Studio 编译器(Noah Misch)§
修复 Solaris 上针对 Python 3 的 PL/Python 测试(Noah Misch)§