发布日期:. 2021-08-12
本次发布包含来自 13.3 的多项修复。 有关 13 主版本新特性的说明,请参见 Section E.24.
修复重复应用投影步骤时产生错误计划的问题(Tom Lane) §
当两个 ProjectionPath 相互叠加时,规划器可能生成错误的计划。已知唯一能触发这种情况的方式涉及并行排序操作,但也可能存在其他情形。其结果可能是崩溃或错误的查询结果,也可能泄露服务器内存内容。(CVE-2021-3677)
更彻底地禁止 SSL 重新协商(Michael Paquier) §
虽然 SSL 重新协商已被禁用一段时间,但服务器仍会配合客户端发起的重新协商请求。恶意构造的重新协商请求可能导致服务器崩溃(参见 OpenSSL 问题 CVE-2021-3449)。在允许完全禁用此功能的 OpenSSL 版本(即 1.1.0h 及更新版本)上,将其彻底禁用。
在过程内部执行 COMMIT 或 ROLLBACK 后恢复 Portal 级快照(Tom Lane) § § § § §
此项修改修复了紧接着 COMMIT/ROLLBACK 尝试获取经过 TOAST 处理的值时,出现 “no known snapshots” 或 “missing chunk number 0 for toast value” 等错误的情况。
某些扩展可能尝试在任何 Portal 之外执行 SQL 代码。它们有责任在执行前确保存在外层快照。以前,不提供快照可能行得通,也可能不行;现在则会始终以 “cannot execute SQL without an outer snapshot or portal” 错误失败。
避免持久化读取非稳定查询的游标输出时出现异常行为(Tom Lane) § §
以前,我们总会退回起点并重新读取整个查询结果,可能得到与先前执行不同的结果,从而给后续处理造成很大混乱。对于 NO SCROLL 游标,可以只存储查询输出中尚未读取的部分来修复此问题;由于 NO SCROLL 游标不能后退,这样就足够了。带 SCROLL 选项的游标仍存在风险,但文档早已说明,将此选项用于非稳定查询是不安全的。现在进一步加强这些文档警告。
另外,强制 PL/pgSQL 遍历查询结果的 FOR 循环所使用的隐式游标采用 NO SCROLL 模式,以避免在过程内部提交期间持久化这类游标时出现此类问题。
拒绝 SELECT ... GROUP BY GROUPING SETS (()) FOR UPDATE(Tom Lane) §
正如不允许将 FOR UPDATE 与普通 GROUP BY 一起使用一样,这种情况也应被禁止,但相关检查未能正确处理空分组集。最终结果会是执行器中的空指针解引用。
拒绝 WITH 中的查询被重写为仅包含 NOTIFY 的情况(Tom Lane) §
以前,这些情况会导致崩溃。
在 numeric 乘法中,如果结果的小数点后超过 16383 位,则对结果进行舍入,而不报错(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/DROP 与 DROP EXTENSION 并发执行,导致崩溃或目录条目损坏。
修复 ALTER SUBSCRIPTION,使其拒绝空的槽名称(Japin Li) §
将分区表的触发器克隆到新分区时,确保复制其启用状态(Álvaro Herrera) §
避免为 REFRESH MATERIALIZED VIEW CONCURRENTLY 生成的查询中的别名冲突(Tom Lane,Bharath Rupireddy) § §
如果物化视图包含某些名称的列,尤其是 mv 和 newdata,此命令就会失败。
修复 PREPARE TRANSACTION,使其正确检查会话生命周期锁与事务生命周期锁之间的冲突(Tom Lane) §
如果一个事务在同一个咨询锁 ID 值上同时持有会话生命周期锁和事务生命周期锁,就不能预备该事务。以前没有完整检查这一限制,可能导致 PREPARE TRANSACTION 期间发生 PANIC。
修复目标角色在 RLS 策略中被列出多次时 DROP OWNED BY 的异常行为(Tom Lane) §
在 DROP OWNED BY 期间从 RLS 策略中移除角色时,跳过不必要的错误检查(Tom Lane) §
值得一提的是,这修复了某些必须是超级用户才能使用 DROP OWNED BY 的情况。
重新允许在 CREATE COLLATION 命令中使用旧式 Windows 区域设置名称(Thomas Munro) §
以前,由于操作系统无法提供这些区域设置的版本信息,我们会报错。今后或许会决定要求提供版本信息,但目前尚无此规定,因此暂时重新允许这种情况。
禁止在 GENERATED 表达式中使用整行变量(Tom Lane) §
使用整行变量显然违反了生成列不能依赖自身的规则,因此这些情况没有明确定义的行为。实际行为经常包括崩溃。
修复 GENERATED 表达式中 tableoid 的使用(Tom Lane) §
某些代码路径在计算 GENERATED 表达式时,未能为这个系统列提供有效值。
向外部表添加列时,不存储“快速默认值”(Andrew Dunstan) §
由于此类表没有本地堆存储,快速默认值没有用途,却会干扰后续操作。除了阻止 ALTER TABLE 命令创建此类目录条目之外,还调整后续代码,使其能够应对错误存在的此类条目。
允许以事务方式更新索引状态标志(Michael Paquier,Andrey Lepikhov) § §
这可以避免处理实际上并非不可变的索引谓词时发生失败。虽然这种情况不被视为受支持的用法,但这里最初采用非事务更新的原因早已不复存在,因此不妨进行修改。
避免缓存计划中出现 CREATE DOMAIN 或 ALTER DOMAIN 时损坏计划缓存条目(Tom Lane) §
使 WAL 发送进程 在 pg_stat_activity 中显示最新的复制命令(Tom Lane) §
以前,WAL 发送进程 会显示其最新的 SQL 命令,如果它此时正在执行复制操作,就会令人困惑。现在将复制协议命令与 SQL 命令同等显示。
当 postgresql.conf 中的相关条目被移除时,使 pg_settings.pending_restart 显示为 true(Álvaro Herrera) §
对于必须重启 postmaster 才能更改的条目,pending_restart 能正确显示条目已被修改的情况,却无法显示条目被完全移除的情况。
在 64 位 Windows 上,允许 work_mem 乘以 hash_mem_multiplier 的有效值超过 2GB(Tom Lane) §
这使 hash_mem_multiplier 能够实现其预期用途,防止大型哈希聚合溢写到磁盘,即使“大型”意味着数 GB。
修复涉及外部表的普通继承子表的查询所产生的错误计划(Amit Langote) §
在这些情况下,SELECT FOR UPDATE 及相关命令会因断言失败或 “could not find junk column” 错误而失败。
修复 FROM 项标记为 LATERAL 时,对 FROM 中函数的常量结果的上拉处理(Tom Lane) §
修复新备库在边界情况下无法跟随新主库的问题(Dilip Kumar,Robert Haas) § § § § § §
在一组少见的条件组合下,备库可能最终尝试跟随错误的 WAL 时间线。
当事务中止记录的 WAL 重放导致文件截断时,更新最小恢复点(Fujii Masao) §
文件截断是不可逆的,因此在早于该记录的位置停止恢复已不再安全。事务提交的对应情况多年前就已修复,但这一情况被遗漏了。
在复制槽失效后,正确推进最旧所需 WAL 段的边界(Kyotaro Horiguchi) § § § §
如果所有槽都失效,该边界就不会再移动,最终可能使服务器的 WAL 存储空间耗尽。
在 WAL 接收进程 中,避免发生错误后尝试查找系统目录(Masahiko Sawada,Bharath Rupireddy) §
确保备库的启动进程在等待 WAL 到达时及时响应关闭信号(Fujii Masao,Soumyadeep Chakraborty) §
在未能成为事务提交组成员后正确清除共享状态(Amit Kapila) §
在特定时序下,当后续某个会话复用同一个 PGPROC 对象时,这可能导致断言失败。
改进并行构建 B-树索引时排序阶段的进度报告(Matthias van de Meent) §
改进对违反复制协议的情况的检查(Tom Lane) §
逻辑复制工作进程经常使用断言来检查可能由无效或乱序复制命令触发的情况。这似乎并不明智,因此将这些检查改为常规错误检查。
修复逻辑复制工作进程触发分区表的 AFTER 触发器时可能发生的崩溃(Tom Lane) §
修复多个逻辑复制工作进程尝试截断同一个表时的死锁(Peter Smith,Haiying Tang) §
避免出错后留下无效的记录类型哈希表条目(Sait Talha Nisanci) §
这可能导致后续崩溃或内存泄漏。
修复 CREATE TABLE ... AS EXECUTE 在某些错误情况下的计划缓存引用泄漏(Tom Lane) §
修复在并行工作进程之间共享元组描述符的代码中的竞争条件(Thomas Munro) §
在特定时序下,可能发生崩溃。
修复使已过时的复制槽失效与尝试删除或更新该槽并发进行时的竞争条件(Andres Freund,Álvaro Herrera) §
修复释放 BackgroundWorkerSlots 时可能出现的竞争条件(Tom Lane) §
这可能不会修复 Intel 硬件上任何可观察到的缺陷,但内存排序规则较弱的机器可能存在问题。
修复排序代码中潜在的崩溃(Ronan Dunklau) § §
某个代码路径可能尝试释放空指针。在核心服务器使用排序的方式中,这种情况似乎无法触发,但扩展或许能够触发。
增强 B-树倒排列表分裂代码对损坏数据的防御能力(Peter Geoghegan) §
如果尝试插入的项的 TID 与现有条目相同,则抛出错误,而不崩溃。虽然这种情况本不该发生,但已有报告称,当索引与其表不一致时会出现。
防止 SP-GiST 索引插入中的无限循环(Tom Lane) §
如果 INCLUDE 列占用的空间很大,使叶子索引元组无论如何都无法放入一页,text_ops 操作符类就会陷入无限循环,徒劳地尝试让该元组放得下。虽然 v11 之前的版本没有 INCLUDE 列,仍将这一防止循环的修复反向移植到这些版本,因为它似乎能有效防范操作符类中的缺陷。
修复未初始化变量的缺陷,该缺陷可能使 PL/pgSQL 表现得像 INTO 子句指定了 STRICT,即使实际并未指定(Tom Lane) §
不要因 libpq 打印函数中的内存不足而中止进程(Tom Lane) §
在 ecpg 中,允许将 numeric 值 INT_MIN(通常为 -2147483648)转换为整数(John Naylor) §
在 psql 和其他客户端程序中,避免处理编码无效的数据时越过字符串末尾(Tom Lane) §
字符串末尾附近编码不正确的多字节字符,可能导致各种处理循环越过字符串末尾的 NUL。根据随后内存中的内容,其后果可能从没有可检测的问题到程序崩溃不等。这与 CVE-2006-2313 相似,不过这些具体情况似乎不会造成值得关注的安全后果。
修复 pg_dump,使其正确处理分区表上启用状态与父触发器不同的触发器(Justin Pryzby,Álvaro Herrera) §
避免对不同时区创建的归档文件运行 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,使其能够有效地处理生成列(Etsuro Fujita) §
只要外部表中的生成列对应远程表中的生成列,postgres_fdw 现在就能合理地处理生成列。IMPORT FOREIGN SCHEMA 现在默认会以这种方式导入生成列。
在 contrib/postgres_fdw 中,避免发生错误后尝试查找系统目录(Tom Lane) §
虽然这通常能正常工作,但并不十分安全,因为发生的错误可能已经使目录访问无法正常进行。这一修复的副作用是,关于数据转换错误的消息现在会提及查询中的表和列别名(如果使用了别名),而非底层外部表或列的真实名称。
改进隔离测试基础设施(Tom Lane,Michael Paquier) § § § § § § §
允许对隔离测试步骤添加注解,说明预期的完成顺序。这使原本存在竞争的测试用例也能获得稳定结果,无需再像以前那样使用长时间延迟来规避竞争条件(而且以前也并未完全成功)。允许使用不带引号的标识符作为隔离测试的会话或步骤名称(以前,所有此类名称都必须加双引号)。检测隔离测试中未使用的步骤并发出警告。改进隔离测试中查询结果的显示。移除 isolationtester 的“试运行”模式。消除 isolationtester 自身的内存泄漏。
修复 PL/Python 的回归测试,使其在 Python 3.10 下通过(Honza Horak) §
使 printf("%s", NULL) 打印 (null),而不崩溃(Tom Lane) §
这应该能提高服务器在边界情况下的稳健性,并使我们的 printf 实现与常见库保持一致。
修复时间点恢复停止在 ROLLBACK PREPARED 记录处时不正确的日志消息(Simon Riggs) §
改进 ALTER TABLE 对关系种类错误的消息(Kyotaro Horiguchi) §
使涉及“非负”值的错误消息更清晰(Bharath Rupireddy) §
修复 configure,使其支持不再提供独立 libldap_r 库的 OpenLDAP 2.5(Adrian Ho,Tom Lane) § § § §
如果不存在 libldap_r 库,现在会静默假定 libldap 是线程安全的。
增加新的 make 目标 world-bin 和 install-world-bin(Andrew Dunstan) § §
它们分别与 world 和 install-world 相同,但不构建或安装文档。
修复 TAP 测试的 make 规则(prove_installcheck),使其在 PGXS 用法下正常工作(Andrew Dunstan) §
调整 JIT 代码,为即将到来的 LLVM API 变更做好准备(Thomas Munro,Andres Freund) §
LLVM 13 引入了一项不兼容的 API 变更,会使我们以前的 JIT 编译器崩溃。
避免假定 GSSAPI 库返回的字符串以空字符结尾(Tom Lane) §
GSSAPI 规范提供字符串指针和长度。在实践中,字符串后的下一个字节似乎通常为零,因此我们以前的代码没有实际失败;但确实收到了 AddressSanitizer 报错的报告。
允许在 MSVC 上构建 GSSAPI 支持(Michael Paquier) § § §
修复与现代 Kerberos 构建的各种不兼容问题。
在 MSVC 构建中,如果指定了 --with-pgport,则将其包含在 pg_config 报告的 configure 选项中(Andrew Dunstan) § §