E.3. 11.6 版

发布日期: 2019-11-14

此版本包含自 11.5 起的各种修复程序。有关主要版本 11 中新功能的信息,请参阅Section E.9

E.3.1. 迁移到版本 11.6

运行 11.X 的用户不需要转储/还原。

但是,如果您将contrib/intarrayextensions 与 GiST 索引一起使用,并且依赖于<@运算符的索引搜索,请参阅下面的条目。

另外,如果要从 11.1 之前的版本升级,请参见Section E.8

E.3.2. Changes

  • 使用自定义关联选项修复ALTER TABLE SET的失败(Michael Paquier)

  • 如果并非所有父表都被更改,则不允许更改乘法继承列的类型(Tom Lane)

以前,这是允许的,因此对现在不同步的父级的查询将失败。

  • 如果在事务块(Tom Lane)内的ANALYZE命令中两次指定了相同的目标表,则避免失败

  • 阻止VACUUM尝试冻结涉及仍在运行的 Transaction 的旧多产品 ID(Nathan Bossart,Jeremy Schneider)

这种情况将导致VACUUM失败,直到旧事务终止。

  • SET CONSTRAINTS ... DEFERRED在分区表上失败,错误地抱怨缺少触发器(ÁlvaroHerrera)

  • 如果父分区表包含任何删除的列,则为分区创建索引时修复失败(Michael Paquier)

  • 使用 ICU 排序规则(Tom Lane)修复计划程序对ILIKE中的大小写可折叠字符的测试

此错误导致计划人员将太多模式视为固定前缀,因此从ILIKE子句派生的 indexscans 可能会丢失他们应找到的条目。

  • 确保在处理查询的表达式时处理WINDOW子句中的偏移量表达式(Andrew Gierth)

当偏移量是非平凡的表达式时,这种疏忽可能导致各种各样的失败。一个示例是,如果内联函数,则此类表达式中的函数参数引用将失败。

  • 修复了处理WITH CHECK OPTION表达式和行级安全策略表达式中的整行变量(Andres Freund)

以前,这种用法可能会导致有关行类型不匹配的虚假错误。

  • 如果在没有邮局主管子进程数组插槽可用的情况下并行查询请求后台工作程序,则避免邮局主管失败(Tom Lane)

  • 如果BEFORE UPDATE触发器按原样返回旧 Tuples,而不是最后一个这样的触发器,则防止可能的双重释放(Thomas Munro)

  • 如果x = ANY (array)或相关操作包含常量 null 数组(Tom Lane),则修复崩溃

  • 当查询尝试访问 TOAST 表时修复“意外的 relkind”错误(John Hsu,Michael Paquier,Tom Lane)

该错误应表明权限被拒绝,但是这种情况在代码重构期间被破坏了。

  • 在并行工作程序启动期间设置 GUC 参数时发生错误时,提供相关的错误上下文行(Thomas Munro)

  • 在可序列化模式下,确保在正确的行版本(Thomas Munro,Heikki Linnakangas)上获取行级谓词锁

如果该行的可见版本进行了 HOT 更新,则该锁可能会在其已死的前任上获得锁定,从而导致微不足道的故障,无法保证序列化。

  • 确保fsync()仅应用于以读/写方式打开的文件(Andres Freund,Michael Paquier)

某些代码路径在以只读方式打开文件后尝试执行此操作,但是在某些平台上会导致“错误的文件 Descriptors”或类似错误。

  • 允许编码转换在更长的字符串上成功完成(ÁlvaroHerrera,Tom Lane)

以前,Importing 字符串的硬性限制为 0.25GB,但现在只要转换后的输出不超过 1GB,它就可以使用。

  • 避免在堆页面修剪期间进行不必要的目录查找(Thomas Munro)

在此不再需要检查未记录的索引,并且该检查在某些工作负载中导致了严重的性能问题。从理论上讲,也至少存在死锁的可能性。

  • 避免为窗口函数创建不必要的大型 Tuples 存储(Andrew Gierth)

在某些情况下,Tuples 存储将包括源表的所有列,而不仅仅是查询所需的列。

  • 修复了无法对哈希表进行分组的 JIT 编译相等性比较失败,从而导致性能损失的问题(Andres Freund)

  • 减小大块时,允许repalloc()退回空间(Tom Lane)

  • 确保在存档恢复结束时删除临时的 WAL 和历史文件(泽田正彦)

  • 如果启用了recovery_min_apply_delay,请避免归档恢复失败(Fujii Masao)

recovery_min_apply_delay通常不在此配置中使用,但应该可以使用。

  • 当发布者和订阅者对表的副本标识列有不同的想法时,修复逻辑复制失败(Jehan-Guillaume de Rorthais,Peter Eisentraut)

如果在发布服务器上根本不存在一列,则在订阅服务器上将其声明为副本身份的一部分,将导致“负的 bitmapset 成员不允许”错误。

  • 避免在逻辑复制 walsender 关机期间出现不必要的延迟(Craig Ringer,ÁlvaroHerrera)

  • 修复逻辑复制 walreceiver 进程中的超时处理(Julien Rouhaud)

错误的逻辑阻止wal_receiver_timeout在逻辑复制部署中工作。

  • 正确地为时间戳复制消息进行逻辑解码(Jeff Janes)

例如,这种疏忽导致了pg_stat_subscriptionlast_msg_send_time通常读为 NULL。

  • 在逻辑解码中,请确保在重建快照时正确考虑了子事务(泽田正彦)

该错误导致 assert 失败。目前尚不清楚生产版本中是否存在任何不良影响。

  • 当后端进程先前已 await 同步复制发生时,修复后端退出期间的竞争状况(刘东明)

  • 修复ALTER SYSTEM以处理postgresql.auto.conf中的重复条目(Ian Barwick)

ALTER SYSTEM本身不会生成这种状态,但是修改postgresql.auto.conf的外部工具可以生成这种状态。现在将删除目标变量的重复条目,然后在末尾附加新设置(如果有)。

  • 拒绝配置文件中包含空文件名的包含指令,并更清楚地报告包含文件的递归(Ian Barwick,Tom Lane)

  • 使用 PAM 身份验证时,避免记录有关废弃连接的投诉(Tom Lane)

基于 libpq 的 Client 端通常在需要密码时会进行两次连接尝试,因为在第一次连接尝试失败之前,它们不会提示用户 Importing 密码。因此,当 Client 端在询问密码时关闭连接时,服务器被编码为不会产生无用的日志垃圾邮件。但是,PAM 身份验证代码尚未获得该备忘,并且会生成一些有关幻像身份验证失败的消息。

  • 修复了在time with time zoneImporting 中未检测到日期规范不完整的某些情况(亚历山大·拉欣)

如果指定了时区 UTC 偏移量的时区,那么日期也必须是正确的,以便可以解决偏移量。根据使用的语法,在某些情况下不会强制执行此检查,从而导致产生伪造的输出。

  • 修复bitshiftright()(Tom Lane)的不良行为

当位串长度不是 8 的倍数时,位串右移运算符无法将结果的最后一个字节中存在的填充空间清零。尽管对于大多数操作不可见,但任何非零位都将导致意外的比较行为,因为位串比较不会费心忽略多余的位,期望它们始终为零。

如果由于将bitshiftright()的输出保存在表中而导致数据不一致,则可以使用以下方法修复它:

UPDATE mytab SET bitcol = ~(~bitcol) WHERE bitcol != ~(~bitcol);
  • 恢复从json[b]_populate_record()json[b]_populate_recordset()(Tom Lane)的AS子句中获取类型信息的能力

如果 record 参数为 NULL 并且没有声明的复合类型,请尝试使用AS子句。不建议使用此方法,但是它曾经可以使用,现在又可以使用。

  • XMLTABLE中选择名称空间节点时避免崩溃(查普曼·弗拉克)

  • 修复间隔乘法中边缘情况整数溢出的检测(Yuya Watari)

  • 修复使用 ICU 归类时lower()upper()initcap()函数中的内存泄漏(Konstantin Knizhnik)

  • 如果ispell文本搜索词典包含错误的词缀数据,请避免崩溃(Arthur Zakirov)

  • 修复了 GIN 发布列表的错误压缩逻辑(Heikki Linnakangas)

如果相邻索引的 TID 之间的距离超过 16TB,则 GIN 发布列表项可能需要 7 个字节。逻辑中的一个步骤与此不同步,可能会尝试将值写入 6 字节缓冲区。原则上,这可能会导致堆栈溢出,但是在大多数体系结构上,下一个字节很可能是未使用的对齐填充,从而使该漏洞无害。无论如何,该错误都很难被发现。

  • 修复了 KNN-GiST(Alexander Korotkov)中无穷大,NaN 和 NULL 值的处理

如果为非空列值计算的某些距离是无穷大或 NaN,则查询的输出 Sequences 可能是错误的(不同于普通排序的结果)。

  • 修复在 KNN-SP-GiST(Nikita Glukhov)中搜索 NULL 的处理

  • 在 Windows 上,识别“挪威语(Bokmål)”区域设置名称(汤姆巷)的其他拼写

  • 如果 ECPGClient 端在定义ENABLE_NLS时包含ecpglib.h,则避免编译失败(Tom Lane)

此风险是由错误放置的声明造成的:ecpg_gettext()对 Client 端代码不可见。

  • 在 psql 中,在意外的连接丢失和成功的重新连接之后,重新同步服务器的内部状态(Peter Billen,Tom Lane)

通常,这是不必要的,因为无论如何状态都是相同的。但这在某些情况下可能很重要,例如在哪里连接可能会导致几台服务器之一。此更改使 psql 重新发出启动时可能发出的任何交互式消息,例如有关是否正在使用 SSL 的消息。

  • 在 psql 中避免特定于平台的空指针取消引用(Quentin Rameau)

  • 在 pg_dump 中,确保类似名称的触发器和行级安全策略对象的稳定输出 Sequences(Benjie Gillam)

以前,如果不同表上的两个触发器具有相同的名称,则将按基于 OID 的 Sequences 对其进行排序,这比按表名对它们进行排序不太可取。对于 RLS 策略也是如此。

  • 修复 pg_dump 以再次与 8.3 之前的源服务器一起工作(Tom Lane)

先前的修复导致 pg_dump 始终尝试查询pg_opfamily,但是该目录在 8.3 版之前不存在。

  • 在 pg_restore 中,将-f -视为“输出到 stdout”(ÁlvaroHerrera)

这可以使 pg_restore 的行为与其他一些应用程序同步,特别是使 v12 之前的分支的行为类似于版本 12 的 pg_restore,从而简化了可在多个 PostgreSQL 版本中工作的转储/恢复脚本的创建。在进行此更改之前,pg_restore 将此开关解释为“输出到名为-的文件”的意思,但是很少有人希望这么做。

  • 改进 pg_upgrade 对使用已更改表示形式的数据类型的检查,例如line(Tomas Vondra)

如果感兴趣的数据类型位于域或复合类型的存储列的下面,则可能会愚弄以前的编码。

  • 在 pg_basebackup 期间检测文件读取错误(Jeevan Chalke)

  • 在 pg_basebackup 中,直到备份结束后才同步输出文件(Michael Paquier)

如果 fsync 很慢,则先前的编码可能会导致超时失败。

  • 在具有在线源集群的 pg_rewind 中,禁用超时,就像 pg_dump 一样(Alexander Kukushkin)

  • 当连续 WAL 记录正好在页面边界处结束时,使用-s选项修复 pg_waldump 中的失败(Andrey Lepikhov)

  • 在 pg_waldump 中,将newitemoff字段包含在 btree 页面拆分 Logging(Peter Geoghegan)

  • 在具有--bkp-details选项的 pg_waldump 中,避免为涉及全页写入的 WAL 记录释放额外的换行符(Andres Freund)

  • 修复 pg_waldump(Andres Freund)中的小内存泄漏

  • 使用高--jobs选项修复 vacuumdb,以更好地处理文件 Descriptors 不足的问题(Michael Paquier)

  • 修复 PL/pgSQL 以更好地处理复合类型的替换(Tom Lane)

涵盖在执行 PL/pgSQL 函数之间完全删除复合类型,然后创建同名新类型的情况。现在,复合类型的变量将更新以匹配新定义。

  • 修复contrib/amcheck以在热备份期间跳过未记录的索引(Andrey Borodin,Peter Geoghegan)

在此上下文中,未记录的索引不一定包含有效数据,因此请勿尝试对其进行检查。

  • 修复contrib/intarray的 GiST opclass 不会因带有<@的空数组而失败(Tom Lane)

诸如array_column <@ constant_array之类的子句被视为可索引的,但是索引搜索可能找不到空数组值。当然,此类条目应与搜索简单匹配。

唯一可行的可后补丁修补程序需要使<@索引搜索扫描整个索引,而此修补程序正是这样做的。这很不幸:这意味着查询性能可能比普通 Sequences 扫描要差。

性能受到此更改不利影响的应用程序有两种选择。他们可以切换到没有此错误的 GIN 索引,也可以将array_column <@ constant_array替换为array_column <@ constant_array AND array_column && constant_array。这将提供与以前几乎相同的性能,并且将找到给定常量数组的所有非空子集,这是查询之前可以可靠地期望的所有子集。

  • 修复 configure 的是否存在 libperl 的测试,以便它可以在 Red Hat 的最新发行版中使用(Tom Lane)

以前,如果用户将CFLAGS设置为-O0,它可能会失败。

  • 确保在 PowerPC 上正确生成自旋锁的代码(Noah Misch)

先前的自旋锁编码允许编译器选择寄存器零,以与不接受该寄存器的汇编指令一起使用,从而导致构建失败。我们仅看到一个与此错误相符的长期报告,但是对于试图构建经过修改的 PostgreSQL 代码或使用非典型编译器选项的人来说,这可能会引起问题。

  • 在 PowerPC 上,避免依赖 xlc 编译器的__fetch_and_add()函数(Noah Misch)

xlc 13 及更高版本以与我们的用法不兼容的方式解释此功能,从而导致无法使用 PostgreSQL。通过改用自定义汇编代码进行修复。

  • 在 AIX 上,请勿使用编译器选项-qsrcmsg(Noah Misch)

这避免了 xlc v16.1.0 的内部编译器错误,除了更改编译器错误消息的格式外,几乎没有其他后果。

  • 修复 MSVC 生成过程,以处理 OpenSSL 文件路径中的空格(Andrew Dunstan)

  • 将时区数据文件更新为 tzdata 版本 2019c,以进行斐济和诺福克岛 DST 法律变更,以及阿尔伯塔省,奥地利,比利时,不列颠哥伦比亚省,柬埔寨,香港,印第安纳 State(佩里县),加里宁格勒,肯塔基 State,密歇根 State,诺福克郡的历史更正岛,韩国和土耳其。