E.22. 发布版本 12.1 #
发布日期:. 2019-11-14
本次发布包含来自 12.0 的多项修复。有关 12 主版本新特性的说明,请参见第 E.23 节。
E.22.1. 迁移到版本 12.1
对于运行 12.X 的用户,不需要执行导出/恢复。
E.22.2. 变更
修复
ALTER TABLE添加没有默认值的列,同时进行需要重写表的其他更改时发生的崩溃(Andres Freund)§ §修复
REINDEX CONCURRENTLY中的锁处理(Michael Paquier)§ §REINDEX CONCURRENTLY遗漏了对新索引版本获取会话级锁,可能允许其他会话过早地操作它。此外,如果查询取消或会话终止中断在不恰当的时刻到达,可能导致REINDEX CONCURRENTLY未能释放它所持有的会话级锁。避免报告
CREATE INDEX CONCURRENTLY或REINDEX CONCURRENTLY命令的进度时因竞争条件而发生的崩溃(Álvaro Herrera)§避免在
REINDEX CONCURRENTLY期间创建重复的依赖条目(Michael Paquier)§此缺陷导致
pg_depend膨胀,但没有更严重的后果。防止
VACUUM尝试冻结涉及仍在运行事务的旧 multixact ID(Nathan Bossart,Jeremy Schneider)§这种情况会导致
VACUUM一直失败,直到旧事务终止。修复尝试按表达式索引执行
CLUSTER时发生的“wrong type of slot”错误(Andres Freund)§SET CONSTRAINTS ... DEFERRED在分区表上执行失败,错误地报告缺少触发器(Álvaro Herrera)§修复父分区表包含已删除列时为分区创建索引发生的失败(Michael Paquier)§
修复对分区表中已索引列的删除(Amit Langote,Michael Paquier)§ §
以前,这可能失败并报告有关索引依赖关系的错误。正确行为应是自动删除这些索引。
确保分区索引在并发重建失败后仍可被删除(Michael Paquier)§
这种情况下,索引的
pg_class.relispartition标志被留在了错误状态,导致DROP INDEX失败。修复逐分区连接中对等价类成员的处理(Amit Langote)§
这一疏漏可能导致无法使用可行的逐分区连接计划,或发生“could not find pathkey item to sort”规划器失败。
确保处理查询表达式时也处理
WINDOW子句中的偏移量表达式(Andrew Gierth)§当偏移量是较复杂的表达式时,这一疏漏可能导致各种失败。例如,如果函数被内联,此类表达式中的函数参数引用就会失败。
避免 postmaster 子进程数组已无空闲槽位时,并行查询请求后台工作进程导致 postmaster 失败(Tom Lane)§
修复对带有
BEFORE UPDATE触发器的表进行 EvalPlanQual 复检所引发的崩溃(Andres Freund)§修复查询尝试访问 TOAST 表时发生的“unexpected relkind”错误(John Hsu,Michael Paquier,Tom Lane)§
错误应说明权限被拒绝,但代码重构破坏了这种情况的处理。
在并行工作进程启动期间设置 GUC 参数发生错误时,提供相关的错误上下文行(Thomas Munro)§
确保仅对以读写模式打开的文件应用
fsync()(Andres Freund,Michael Paquier)§ §某些代码路径尝试在以只读方式打开文件后执行此操作,但在某些平台上,这会导致“bad file descriptor”或类似错误。
允许编码转换成功处理比以前更长的字符串(Álvaro Herrera,Tom Lane)§
以前,输入字符串有 0.25GB 的硬性上限;现在,只要转换后的输出不超过 1GB,就能够成功转换。
避免为窗口函数创建不必要地庞大的元组存储(Andrew Gierth)§
在某些情况下,元组存储会包含源表的所有列,而非仅包含查询所需的列。
允许
repalloc()在大型内存块缩小时归还空间(Tom Lane)§确保归档恢复结束时删除临时 WAL 文件和历史文件(Sawada Masahiko)§
避免启用
recovery_min_apply_delay时归档恢复发生失败(Fujii Masao)§recovery_min_apply_delay通常不用于这种配置,但它应该能够正常工作。在崩溃恢复期间忽略
restore_command、recovery_end_command和recovery_min_apply_delay设置(Fujii Masao)§ §现在这些设置可以在
postgresql.conf中指定,因此可能在崩溃恢复期间被启用,但此时遵循这些设置并不合适。应忽略它们,直到崩溃恢复完成。修复发布者和订阅者对表的复制标识列认定不一致时逻辑复制发生的失败(Jehan-Guillaume de Rorthais,Peter Eisentraut)§ §
在订阅者上将发布者根本不存在的列声明为复制标识的一部分,会导致“negative bitmapset member not allowed”错误。
避免逻辑复制 WAL 发送进程关闭期间出现不必要的延迟(Craig Ringer,Álvaro Herrera)§
修复逻辑复制 WAL 接收进程进程中的超时处理(Julien Rouhaud)§
错误的逻辑导致
wal_receiver_timeout在逻辑复制部署中无法生效。为逻辑解码的复制消息正确添加时间戳(Jeff Janes)§
例如,这一疏漏导致
pg_stat_subscription.last_msg_send_time通常显示为 NULL。修复后端进程此前曾等待同步复制时,在退出期间发生的竞争条件(Dongming Liu)§
避免在使用 PAM 认证时记录有关已放弃连接的报错消息(Tom Lane)§
基于 libpq 的客户端在需要密码时通常会尝试连接两次,因为它们直到第一次连接尝试失败后才会提示用户输入密码。因此,服务器在客户端收到密码请求后关闭连接时,不会生成无用的日志消息。然而,PAM 认证代码没有遵循这一约定,会为实际上并未发生的认证失败生成多条消息。
修复
bitshiftright()的错误行为(Tom Lane)§ §当位串长度不是 8 的倍数时,位串右移操作符未能将结果最后一个字节中的填充空间清零。虽然大多数操作看不到这些填充位,但其中任何非零位都会导致意外的比较行为,因为位串比较预期这些额外的位始终为零,并未特意忽略它们。
如果由于将
bitshiftright()的输出保存在表中而导致数据不一致,可以使用类似以下语句进行修复:UPDATE mytab SET bitcol = ~(~bitcol) WHERE bitcol != ~(~bitcol);
修复搜索字符串为空时,文本
position()函数(也称为strpos())的结果(Tom Lane)§按历史行为和 SQL 标准,这种情况下结果应为一,但 12.0 返回了零。
修复对间隔乘法中边界情况下整数溢出的检测(Yuya Watari)§
避免清理 GiST 索引时发生内存泄漏(Dilip Kumar)§
在 Windows 上,识别“Norwegian (Bokmål)”区域设置名称的更多拼写形式(Tom Lane)§
修复 libpq,使其允许整数参数的字符串值包含尾部空白(Michael Paquier)§ §
版本 12 加强了 libpq 对整数参数的验证,但禁止尾部空白似乎并不合适。
在 libpq 中,因
connect_timeout参数值语法无效而失败后,正确报告CONNECTION_BAD连接状态(Lars Kanis)§避免 ECPG 客户端在定义了
ENABLE_NLS的情况下包含ecpglib.h时编译失败(Tom Lane)§这种风险由位置不当的声明造成:
ecpg_gettext()不应对客户端代码可见。修复分区表上外键约束的并行恢复调度(Álvaro Herrera)§
pg_dump 未能输出分区表外键的完整依赖信息。这可能让并行 pg_restore 过早地尝试重新创建外键约束。
在 pg_dump 中,确保名称相似的触发器和行级安全策略对象的输出顺序稳定(Benjie Gillam)§
以前,如果不同表上的两个触发器同名,它们会按 OID 排序,这不如按表名排序合适。RLS 策略也存在同样的问题。
在 pg_upgrade 中拒绝包含
sql_identifier类型列的表,因为该类型在版本 12 中更改了表示形式(Tomas Vondra)§ §改进 pg_upgrade 对使用了表示形式已变更的数据类型(如
line)的检查(Tomas Vondra)§ §当所关注的数据类型是某个已存储域类型或复合类型列的底层类型时,以前的代码可能漏检。
在带有
--dry-run选项的 pg_rewind 中,避免更新pg_control(Alexey Kondratov)§这可能导致之后的 pg_rewind 尝试失败。
修复使用
-s选项时,延续的 WAL 记录恰好在页面边界处结束导致 pg_waldump 失败的问题(Andrey Lepikhov)§在使用
--bkp-details选项的 pg_waldump 中,避免为涉及整页写入的 WAL 记录输出多余换行(Andres Freund)§修复 pg_waldump 中少量的内存泄漏(Andres Freund)§
恢复将
pqsignal()作为 libpq 的导出符号(Tom Lane)§此前移除此函数的理由是客户端都不应使用它,但事实证明,这会使很旧版本的 psql 无法使用当前的 libpq,也可能影响其他应用。
修复 configure 对 libperl 是否存在的测试,使其适用于近期的 Red Hat 发行版(Tom Lane)§ §
以前,如果用户将
CFLAGS设置为-O0,此测试可能失败。确保为 PowerPC 上的自旋锁生成正确的代码(Noah Misch)§
以前的自旋锁代码允许编译器为不接受零号寄存器的汇编指令选择该寄存器,导致构建失败。我们仅见过一份很久以前的报告与此缺陷吻合,但它可能给尝试构建修改过的 PostgreSQL 代码或使用非常规编译器选项的用户带来问题。
在 AIX 上不再使用编译器选项
-qsrcmsg(Noah Misch)§这避免了 xlc v16.1.0 的内部编译器错误,除了改变编译器错误消息的格式之外,几乎没有其他影响。
修复 MSVC 构建过程,使其能够处理 OpenSSL 文件路径中的空格(Andrew Dunstan)§