E.9. 版本 9.6.16 #
发布日期:. 2019-11-14
此版本包含自 9.6.15 以来的多种修复。有关 9.6 大版本中新特性的信息,参见第 E.25 节。
E.9.1. 迁移到版本 9.6.16
对于运行 9.6.X 的用户,不需要转储/恢复。
不过,如果你在 contrib/intarray 扩展中使用了 GiST
索引,并且依赖 <@ 操作符的索引搜索,请参见下面相关条目。
另外,如果你是从 9.6.9 之前的版本升级,参见第 E.16 节。
E.9.2. 变更
修复带自定义关系选项时
ALTER TABLE SET的失败(Michael Paquier)如果不是所有父表都被更改,禁止更改多重继承列的类型(Tom Lane)
此前这是允许的,随后对此时已不同步的父表的查询会失败。
防止
VACUUM尝试冻结涉及仍在运行的事务的旧多事务 ID(Nathan Bossart、Jeremy Schneider)这种情况会导致
VACUUM失败,直到旧事务结束。确保查询表达式被改写时
WINDOW子句中的偏移表达式也得到处理(Andrew Gierth)这一疏漏可能在偏移是非平凡表达式时导致各种失败。一个例子是,如果函数被内联,此类表达式中的函数参数引用会失败。
修复
WITH CHECK OPTION表达式和行级安全策略表达式中整行变量的处理(Andres Freund)此前,这种用法可能导致关于行类型不匹配的虚假错误。
避免并行查询在没有空闲 postmaster 子进程数组槽位时请求后台工作者导致 postmaster 失败(Tom Lane)
防止
BEFORE UPDATE触发器原样返回旧元组且它不是最后一个此类触发器时可能的双重释放(Thomas Munro)在并行工作者启动期间设置 GUC 参数发生错误时提供相关的错误上下文行(Thomas Munro)
在可序列化模式下,确保对正确版本的行获取行级谓词锁(Thomas Munro、Heikki Linnakangas)
如果行的可见版本经过 HOT 更新,锁可能被加到它现已死亡的前身上,导致细微的序列化保证失败。
确保
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通常不用于这种配置,但它应当能工作。避免逻辑复制 walsender 关闭期间的不必要延迟(Craig Ringer、Álvaro Herrera)
为逻辑解码正确地为复制消息打时间戳(Jeff Janes)
这一疏漏导致例如
pg_stat_subscription.last_msg_send_time通常读作 NULL。在逻辑解码中,确保重建快照时正确统计子事务(Masahiko Sawada)
这个错误导致断言失败;生产构建中是否存在不良影响尚不清楚。
修复后端进程此前等待过同步复制时,后端退出期间的竞态条件(Dongming Liu)
修复
ALTER SYSTEM应对postgresql.auto.conf中重复条目的问题(Ian Barwick)ALTER SYSTEM本身不会产生这种状态,但修改postgresql.auto.conf的外部工具可能这样做。目标变量的重复条目现在会被移除,然后新的设置(如果有)会被追加到末尾。拒绝配置文件中文件名为空的 include 指令,并更清晰地报告 include 文件递归(Ian Barwick、Tom Lane)
避免使用 PAM 认证时记录关于废弃连接的抱怨(Tom Lane)
基于 libpq 的客户端在需要密码时通常会做两次连接尝试,因为它们直到第一次连接尝试失败才提示用户输入密码。因此服务器的编码被设计成当客户端在被要求输入密码时关闭连接不产生无用的日志垃圾。然而 PAM 认证代码没有收到这份备忘,会生成几条关于幻影认证失败的消息。
修复
time with time zone输入中某些未检测到不完整日期规格的情况(Alexander Lakhin)如果指定的时区 UTC 偏移量随时间变化,那么也必须指定日期才能解析偏移量。根据所用的语法,这一检查在某些情况下未被强制执行,允许产生虚假输出。
修复
bitshiftright()的错误行为(Tom Lane)当位串长度不是 8 的倍数时,位串右移操作符未能把结果最后一字节中存在的填充空间清零。虽然对大多数操作不可见,但那里的任何非零位都会导致意外的比较行为,因为位串比较不会特意忽略多余的位,而是预期它们始终为零。
如果你因把
bitshiftright()的输出保存到表中而有不一致的数据,可以用类似下面的语句修复:UPDATE mytab SET bitcol = ~(~bitcol) WHERE bitcol != ~(~bitcol);
修复间隔乘法中边界整数溢出的检测(Yuya Watari)
避免
ispell文本搜索词典包含错误词缀数据时崩溃(Arthur Zakirov)修复 GIN posting 列表的错误压缩逻辑(Heikki Linnakangas)
如果相邻被索引 TID 之间的距离超过 16TB,一个 GIN posting 列表项可能需要 7 字节。逻辑中的一步与此不同步,可能试图把值写入 6 字节缓冲区。原则上这可能导致栈越界,但在大多数体系结构上,下一个字节很可能是未使用的对齐填充,使该 bug 无害。无论如何,这个 bug 都很难被触发到。
修复 KNN-GiST 中对无穷大、NaN 和 NULL 值的处理(Alexander Korotkov)
如果为非空列值计算的某些距离是无穷大或 NaN,查询的输出顺序可能错误(与普通排序的结果不同)。
修复 KNN-SP-GiST 中对 NULL 搜索的处理(Nikita Glukhov)
在 Windows 上,识别 “Norwegian (Bokmål)” 区域名的更多拼法(Tom Lane)
避免 ECPG 客户端在定义了
ENABLE_NLS的情况下包含ecpglib.h时编译失败(Tom Lane)这个风险是由一个错位的声明造成的:
ecpg_gettext()不应对客户端代码可见。在 psql 中,意外连接丢失并成功重连之后重新同步关于服务器的内部状态(Peter Billen、Tom Lane)
通常这是不必要的,因为状态反正会相同。但在边界情况下可能有关系,例如连接可能通向几台服务器之一。这一更改使 psql 重新发出它在启动时会发出的任何交互式消息,例如关于是否使用 SSL。
避免 psql 中平台相关的空指针解引用(Quentin Rameau)
修复 pg_dump 对视图中循环依赖的处理(Tom Lane)
某些情况下视图可能依赖于 pg_dump 需要在视图之后转储的对象;最常见的例子是在主键列上使用
GROUP BY的查询在没有主键时可能在语义上无效。现在通过发出一个仅建立视图列名和类型的虚拟CREATE VIEW命令、之后再发出带完整视图定义的CREATE OR REPLACE VIEW来处理。此前虚拟定义实际上是一条CREATE TABLE命令,之后通过CREATE RULE命令自动转换成视图。这种新方法在 PostgreSQL 版本 10 及之后已经成功使用。现在把它向后移植到较旧的版本,是因为有报告称以前的方法会导致关于视图副本身份状态的虚假错误消息。这一更改还避免了在涉及此类视图的恢复期间尝试使用--clean选项时的问题。在 pg_dump 中,确保同名触发器和行级安全策略对象的稳定输出顺序(Benjie Gillam)
此前,如果不同表上的两个触发器同名,它们会按基于 OID 的顺序排序,这不如按表名排序理想。RLS 策略同理。
修复 pg_dump 重新与 8.3 之前的源服务器工作的问题(Tom Lane)
此前的一次修复使 pg_dump 总是试图查询
pg_opfamily,但该目录在 8.3 版之前不存在。在 pg_restore 中,把
-f -当作“输出到 stdout”(Álvaro Herrera)这使 pg_restore 的行为与其他一些应用同步,特别是使 v12 之前的分支表现得与版本 12 的 pg_restore 相似,简化了跨多个 PostgreSQL 版本的转储/恢复脚本的创建。在此更改之前,pg_restore 把这种开关解释为“输出到名为
-的文件”,但很少有人会想要那样。改进 pg_upgrade 对使用表示已更改的数据类型(如
line)的检查(Tomas Vondra)原来的编码可能被所关注数据类型构成域或复合类型的存储列底层的情况所欺骗。
检测 pg_basebackup 期间的文件读取错误(Jeevan Chalke)
在带在线源集簇的 pg_rewind 中,禁用超时,与 pg_dump 的做法类似(Alexander Kukushkin)
修复 pg_waldump 使用
-s选项且延续 WAL 记录恰好在页边界结束时失败的问题(Andrey Lepikhov)在 pg_waldump 中,在 btree 页分裂记录中包含
newitemoff字段(Peter Geoghegan)在 pg_waldump 使用
--bkp-details选项时,避免为涉及整页写入的 WAL 记录输出多余换行(Andres Freund)修复 pg_waldump 中的小内存泄漏(Andres Freund)
修复 vacuumdb 使用高
--jobs选项时更好地处理文件描述符耗尽(Michael Paquier)修复
contrib/intarray的 GiST 操作符类在空数组使用<@时不失败的问题(Tom Lane)像
这样的子句被认为可索引,但索引搜索可能找不到空数组值;当然,这种条目应当平凡地匹配搜索。array_column<@constant_array唯一实际可向后移植的修复要求
<@索引搜索扫描整个索引,本补丁就是这么做的。这很不幸:这意味着查询性能可能比 plain 顺序扫描更差。性能受此更改不利影响的应用有两种选择。可以改用没有此 bug 的 GIN 索引,或者把
替换为array_column<@constant_array。后者的性能与之前大致相同,并且会找到给定常数数组的所有非空子集——这本来就是以前对该查询唯一能可靠期望得到的。array_column<@constant_arrayANDarray_column&&constant_array允许
configure --with-python在只能找到python3或只能找到python2时成功(Peter Eisentraut、Tom Lane)先搜索
python,再搜索python3,再搜索python2,使 configure 在没有名为python的可执行文件这一日益常见的情况下也能成功。仍然可以通过设置PYTHON环境变量覆盖这一选择。修复 configure 的 libperl 存在性测试,使其在最近的 Red Hat 版本上工作(Tom Lane)
此前,如果用户把
CFLAGS设为-O0,它可能失败。确保 PowerPC 上自旋锁的正确代码生成(Noah Misch)
原来的自旋锁编码允许编译器为一条不接受寄存器零的汇编指令选择寄存器零,导致构建失败。我们只见过一份很久以前与此 bug 匹配的报告,但它可能给尝试构建修改过的 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,涉及斐济和诺福克岛的夏令时法规变更,以及艾伯塔、奥地利、比利时、不列颠哥伦比亚、柬埔寨、香港、印第安纳(佩里县)、加里宁格勒、肯塔基、密歇根、诺福克岛、韩国和土耳其的历史修正。