E.21. 发布版本 12.2 #
发布日期:. 2020-02-13
本次发布包含来自 12.1 的多项修复。有关 12 主版本新特性的说明,请参见第 E.23 节。
E.21.1. 迁移到版本 12.2
对于运行 12.X 的用户,不需要执行导出/恢复。
但是,如果有任何引用分区表的外键约束,请参阅下方关于该特性缺陷的两项记录。
E.21.2. 变更
为
ALTER ... DEPENDS ON EXTENSION补上缺失的权限检查(Álvaro Herrera)§将对象标记为依赖某个扩展时,没有进行任何权限检查。这一疏漏使任何用户都可以将例程、触发器、物化视图或索引标记为可由任何有权删除该扩展的用户删除。现在要求调用用户拥有指定对象(因而有权删除它)。(CVE-2020-1720)
修复
TRUNCATE ... CASCADE,确保截断所有相关分区(Jehan-Guillaume de Rorthais)§如果使用
CASCADE选项截断分区表的一个分区,且另一个表通过外键引用该分区表,则另一个表也必须被截断。当引用表本身也是分区表时,遗漏了这一检查,可能使违反外键约束的行保留下来。因此,如果分区表之间存在外键约束,且曾对被引用表执行过任何分区级
TRUNCATE,就应检查是否存在违反外键约束的行。最简单的方法是添加一个新的同样的外键约束(添加成功后,删除新约束或原约束)。不过,从锁定的角度看,这样做可能代价过高;在这种情况下,可以选择手动查询不匹配的行。修复未能将外键约束附加到子分区的问题(Jehan-Guillaume de Rorthais)§
向多级分区表第一层以下的层级添加分区时,引用顶层分区表的外键约束未被克隆到新分区,可能导致之后违反约束。分离新分区后再重新附加,是修复此问题代价最低的方法。不过,如果需要修复的分区很多,添加一个新的同样的外键约束可能更合适。
修复对分区表或继承树进行并发更新时可能发生的崩溃(Tom Lane)§
确保在适当情况下,将分区表上的行触发器正确克隆到子分区(Álvaro Herrera)§
创建或附加分区时,可能遗漏用户定义的触发器(但不会遗漏外键或延迟唯一约束的触发器)。
修复逻辑复制订阅者代码,使其在适当情况下执行逐列
UPDATE触发器(Peter Eisentraut)§修复逻辑复制订阅者处理行更新时可能发生的崩溃或数据损坏(Tom Lane,Tomas Vondra)§
只有当订阅者的表包含未从发布者复制、且数据类型按引用传递的列时,此缺陷才会导致可见问题。
修复对已订阅关系进行 DDL 变更后逻辑复制订阅者的崩溃(Jehan-Guillaume de Rorthais,Vignesh C)§
修复数据库崩溃并重启后逻辑复制发布者的失败(Vignesh C)§
确保
pg_replication_slot_advance()对物理复制槽的影响在重启后仍然保留(Alexey Kondratov,Michael Paquier)§ §提高使用
REPLICA IDENTITY FULL的逻辑复制效率(Konstantin Knizhnik)§更新或删除操作中查找现有元组时,返回第一个匹配元组,而非最后一个。
修复基础备份,使其能够处理大于
INT32_MAX的数据库 OID(Peter Eisentraut)§确保并行计划始终在正确的时机关闭(Kyotaro Horiguchi)§
已知这一疏漏会使多批次并行哈希连接产生“temporary file leak”警告。
防止过早关闭位于 Limit 节点下方的 Gather 或 GatherMerge 计划节点(Amit Kapila)§
这可以避免此类计划节点需要被扫描多次时发生失败,例如它位于嵌套循环内侧时。
提高多核 CPU 上并行哈希连接的效率(Gang Deng,Thomas Munro)§
避免没有空闲动态共享内存槽时并行
CREATE INDEX发生崩溃(Thomas Munro)§ §改为回退到非并行索引构建。
避免没有空闲动态共享内存槽时发生内存泄漏(Thomas Munro)§
在临时表上创建、删除或重建索引时,忽略
CONCURRENTLY选项(Michael Paquier,Heikki Linnakangas,Andres Freund)§这可以避免临时表具有
ON COMMIT动作时发生奇怪的失败。对临时表使用CONCURRENTLY本来就没有益处,因为其他会话无法访问该表,额外处理没有意义。修复重置标记为
ON COMMIT DELETE ROWS的临时表上的表达式索引时可能发生的失败(Tom Lane)§修复对
box、range和inet数据类型执行 BRIN 索引操作时可能发生的崩溃(Heikki Linnakangas)§修复 GIN 索引中对已删除页面的处理(Alexander Korotkov)§ § § §
避免可能发生的死锁、对已删除页面状态的不正确更新,以及无法遍历最近删除页面的问题。
修复多行
VALUES列表中包含 SubPlan(子SELECT)时可能发生的崩溃(Tom Lane)§修复
ALTER TABLE的失败:GENERATED表达式引用的列已在同一ALTER命令前面的操作中被添加或更改了类型(Tom Lane)§修复元组转换期间未能为“缺失”属性插入默认值的问题(Vik Fearing,Andrew Gierth)§
当值来自通过
ALTER TABLE ADD COLUMN添加、且具有常量默认值的列时,这可能导致它们被错误地读取为 NULL。修复 FileClose() 失败后发生的崩溃(Noah Misch)§
只有启用
data_sync_retry时才能观察到此问题,否则 FileClose() 失败会被报告为 PANIC。修复对外部表上多个
AFTER ROW触发器的处理(Etsuro Fujita)§修复使用按引用传递的聚合转换状态时发生的罕见崩溃(Andres Freund,Teodor Sigaev)§
改进
to_date()和to_timestamp()中的错误报告(Tom Lane,Álvaro Herrera)§ §报告输入字符串中不正确的月份名或星期名时,可能在多字节字符中间截断输入,导致错误消息的编码不正确,并可能引发后续失败。现在改为在下一个空白处截断。
修复对公元前日期计算
EXTRACT(ISOYEAR FROM时结果相差一的问题(Tom Lane)§timestamp)确保
char类型的<>操作符将无法确定排序规则的错误如实报告,而非报告为“cache lookup failed for collation 0”(Tom Lane)§避免将 TID 扫描当作顺序扫描(Tatsuhito Kasahara)§ §
重构时的疏漏导致 TID 扫描(按 CTID 选择)在统计视图中被计为顺序扫描,并且像顺序扫描一样获取全表谓词锁。后一种行为可能在可串行化事务模式下导致不必要的串行化错误。
避免系统目录中存在自引用视图时
information_schema视图发生栈溢出(Tom Lane)§自引用视图无法正常工作,它总会导致无限递归。尝试执行视图时,我们已能正确处理这种情况,但在查询它是否可自动更新时却未能正确处理。
确保 WAL 发送进程进程在
pg_stat_activity中的事务开始时间始终显示为 NULL(Álvaro Herrera)§ §以前,
xact_start列有时会显示进程启动时间。提高内侧关系非常大时的哈希连接性能(Thomas Munro)§
减少有许多活跃 WAL 发送进程进程时的自旋锁争用(Pierre Ducroquet)§
修复
EXPLAIN输出中“Subplans Removed”字段的位置(Daniel Gustafsson,Tom Lane)§在非文本输出格式中,此字段被输出到“Plans”子组内部,导致输出语法无效。现在按预期将其附加到父级 Append 或 MergeAppend 计划节点。这也会改变该字段在文本输出格式中的位置:如果同一计划节点附加了 InitPlan,“Subplans Removed”现在会出现在它们之前。
修复
EXPLAIN的SETTINGS选项,使其在非文本输出格式中输出空值(Tom Lane)§在非文本输出格式中,请求的字段应当显示,即使其值为空或为零。
如果用户能够读取查询中实际指定的表的相应列,则允许规划器对子表统计信息应用可能泄漏信息的测试(Dilip Kumar,Amit Langote)§
此项修改修复了 CVE-2017-7484 的修复在分区表上引入的性能问题。那次安全修复禁止将可能泄露信息的操作符应用于当前用户无权直接读取的列的统计信息。然而,常见的做法是只在父分区表上授予权限,而不逐一在各个分区上授予权限。在这种情况下,用户可以通过父表读取该列,因此这一安全限制没有意义,只会让规划器的估计不必要地变差。
修复过度折叠与单行子查询的连接所导致的规划器错误(Tom Lane)§
这一错误导致了“failed to construct the join relation”等错误。
修复尝试将
LIKE或正则表达式模式匹配操作符与二进制兼容的索引操作符类匹配时出现的“no = operator for opfamilyNNNN”规划器错误(Tom Lane)§修复为范围操作符
<@和@>计算选择率时在边界情况下发生的崩溃和估算错误(Michael Paquier,Andrey Borodin,Tom Lane)§应用最常见值扩展统计信息时忽略系统列(Tomas Vondra)§
这可避免受影响查询发生“negative bitmapset member not allowed”规划器错误。
修复 BRIN 索引逻辑,使其支持假想 BRIN 索引(Julien Rouhaud,Heikki Linnakangas)§
以前,如果“索引建议器”扩展尝试让规划器生成包含假想 BRIN 索引的计划,就会失败,因为 BRIN 代价估算代码始终尝试实际访问索引的元页面。现在会检查索引是否只是假想索引;如果是,则使用索引参数的默认假设。
改进对带条件
INSTEAD规则的视图尝试使用自动更新时的错误报告(Dean Rasheed)§这种用法从未得到支持,但以前只在执行时才抛出错误,因此它可能被规划器错误掩盖。
禁止返回
record等伪类型的分区键表达式(Tom Lane)§修复索引表达式使用禁止的类型时的错误报告(Amit Langote)§
修复仅包含
VALUES列表的视图的转储,使其能够处理视图输出列被重命名的情况(Tom Lane)§确保计算视图或规则的依赖关系时,将
XMLTABLE结构中使用的数据类型和排序规则考虑在内(Tom Lane)§以前,如果某个类型未在视图中的其他地方被引用,删除该类型就可能破坏使用
XMLTABLE的视图。此修复不会纠正现有视图已记录的依赖关系,仅对新建视图生效。防止 RADIUS 认证参数被意外转换为小写或截断(Marcos David)§
pg_hba.conf解析器错误地将这些字段当作 SQL 标识符,而它们通常并不是。在发送
ReadyForQuery之前向客户端传送收到的NOTIFY消息,而非在之后发送(Tom Lane)§此更改确保,对于 libpq 以及行为类似的其他客户端库,当客户端认为事务已完成时,事务期间收到的所有通知都已可用。这在实际应用中可能没有影响(无论如何,应用都需要处理异步通知),但更便于编写行为可重现的测试用例。
修复使用 GSSAPI 加密时处理非阻塞 I/O 的缺陷(Tom Lane)§
这些错误可能导致数据丢失(通常会引发后续的通信协议违规错误),或造成“活锁”:发送进程在数据尚未全部发送时进入休眠。此外,libpq 未能为每个连接保存独立的加密状态,可能导致使用多个加密数据库连接的应用失败。
即使未编译 GSSAPI 代码,也允许 libpq 解析所有与 GSS 有关的连接参数(Tom Lane)§
这使其行为与我们的 SSL 支持类似:我们早已认为始终接受所有相关参数是可取的,即使某个构建缺少相应特性,导致部分参数被忽略或受到限制。
修复 ecpg 的
PGTYPEStimestamp_fmt_asc()函数对格式代码%b和%B的不正确处理(Tomas Vondra)§由于索引偏差一的错误,这些代码会输出错误的月份名,或可能导致崩溃。
避免 ecpglib 中内存不足失败之后发生的崩溃(Tom Lane)§
修复并行 pg_dump/pg_restore,使其更妥善地处理无法创建工作进程的情况(Tom Lane)§
防止尝试通过信号终止并行 pg_dump/pg_restore 运行时可能发生的崩溃或卡死(Tom Lane)§
在 pg_upgrade 搜索表中不可升级的数据类型时,检查数组和范围的内部类型(Tom Lane)§
对 createuser 的
--connection-limit选项进行更全面的语法检查(Álvaro Herrera)§在更多情况下处理 PL/pgSQL 复合类型变量所引用的具体类型发生变更的情况(Ashutosh Sharma,Tom Lane)§
删除并重新创建 PL/pgSQL 变量所引用的复合类型,可能导致“could not open relation with OID
NNNN”错误。避免
postgres_fdw尝试向远程服务器发送UPDATE remote_tab SET (x,y) = (SELECT ...)之类命令时发生崩溃(Tom Lane)§在
contrib/dict_int中,拒绝小于一的maxlen设置(Tomas Vondra)§这可防止该参数设置不合理时可能发生的崩溃。
在
contrib/tablefunc的crosstab()函数中禁止 NULL 类别值(Joe Conway)§这种情况从未产生有用的结果,而且在某些平台上会导致崩溃。
修复 configure 对 OpenSSL 的
SSL_clear_options()函数的探测,使其适用于 1.1.0 之前的 OpenSSL 版本(Michael Paquier,Daniel Gustafsson)§使用旧版 OpenSSL 构建 PostgreSQL 时,此问题可能导致无法按预期设置 SSL 压缩选项。
将某些超时和统计跟踪 GUC 变量标记为
PGDLLIMPORT,以允许扩展在 Windows 上访问它们(Pascal Legrand)§这适用于
idle_in_transaction_session_timeout、lock_timeout、statement_timeout、track_activities、track_counts和track_functions。避免“slab”内存上下文健全性检查中的内存泄漏(Tomas Vondra)§
这不会影响生产构建,因为它们通常不会启用内存上下文检查;但在调试构建中,这种泄漏可能相当严重。
修复 LWLock 统计机制报告重复统计条目的问题(Fujii Masao)§
由于 hash 表键创建有误,LWLock 统计代码(默认不编译,需要使用
-DLWLOCK_STATS编译)可能为同一个 LWLock 和后端进程报告多个条目。修复导致 Windows 上进程间信号延迟传递的竞争条件(Amit Kapila)§
这使
NOTIFY出现了可见的时序异常,也可能导致其他错误行为。修复对 Windows 的
ReadFile()函数在边界情况下返回的错误结果的处理(Thomas Munro,Juan José Santamaría Flecha)§据目前所知,这一疏漏只导致多余的日志消息,并未造成实际的查询错误行为。
在 Windows 上,发生
ERROR_ACCESS_DENIED文件访问失败后重试几次(Alexander Lakhin,Tom Lane)§ §这有助于处理目标文件已被标记为删除、但尚未实际消失,导致打开文件失败的情况。例如,pg_ctl 在探测 postmaster 是否已经关闭时,经常因此类错误而失败。
在 Windows 上,规避通过 pg_ctl 在 postmaster 停止后很快将其启动时(例如执行
pg_ctl restart),postmaster 日志文件出现的共享冲突(Alexander Lakhin)§