E.10. 发布版本 11.13 #
发布日期:. 2021-08-12
本次发布包含来自 11.12 的多项修复。有关 11 主版本新特性的说明,请参见第 E.23 节。
E.10.2. 变更
修复重复应用投影步骤时产生错误计划的问题(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)修复对
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/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的情况。向外部表添加列时,不存储“快速默认值”(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能正确显示条目已被修改的情况,却无法显示条目被完全移除的情况。修复新备库在边界情况下无法跟随新主库的问题(Dilip Kumar,Robert Haas)
在一组少见的条件组合下,备库可能最终尝试跟随错误的 WAL 时间线。
当事务中止记录的 WAL 重放导致文件截断时,更新最小恢复点(Fujii Masao)
文件截断是不可逆的,因此在早于该记录的位置停止恢复已不再安全。事务提交的对应情况多年前就已修复,但这一情况被遗漏了。
在 WAL 接收进程中,避免发生错误后尝试查找系统目录(Masahiko Sawada,Bharath Rupireddy)
确保备库的启动进程在等待 WAL 到达时及时响应关闭信号(Fujii Masao,Soumyadeep Chakraborty)
在未能成为事务提交组成员后正确清除共享状态(Amit Kapila)
在特定时序下,当后续某个会话复用同一个 PGPROC 对象时,这可能导致断言失败。
增加锁定,避免其他进程并发写入时读取到错误的 relmapper 数据(Heikki Linnakangas)
改进对违反复制协议的情况的检查(Tom Lane)
逻辑复制工作进程经常使用断言来检查可能由无效或乱序复制命令触发的情况。这似乎并不明智,因此将这些检查改为常规错误检查。
修复多个逻辑复制工作进程尝试截断同一个表时的死锁(Peter Smith,Haiying Tang)
修复对推测插入进行逻辑解码时的错误情况和内存泄漏(Dilip Kumar)
避免出错后留下无效的记录类型 hash 表条目(Sait Talha Nisanci)
这可能导致后续崩溃或内存泄漏。
修复
CREATE TABLE ... AS EXECUTE在某些错误情况下的计划缓存引用泄漏(Tom Lane)修复在并行工作进程之间共享元组描述符的代码中的竞争条件(Thomas Munro)
在特定时序下,可能发生崩溃。
修复释放 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 中,允许将
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中,避免发生错误后尝试查找系统目录(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)改进
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)