发布日期:. 2019-11-14
本次发布包含来自 11.5 的多项修复。 有关 11 主版本新特性的说明,请参见 Section E.23.
对于运行 11.X 的用户,不需要执行导出/恢复。
但是,如果使用了带有 GiST 索引的 contrib/intarray 扩展,且依赖 <@ 操作符的索引搜索,请参阅下方相关条目。
此外,如果是从早于 11.1 的版本升级,请参见 Section E.22。
修复 ALTER TABLE SET 使用自定义关系选项时的失败(Michael Paquier)
如果没有更改所有父表,则禁止更改多重继承列的类型(Tom Lane)
以前允许这样做,导致对类型已不同步的父表进行查询时失败。
避免在事务块中的 ANALYZE 命令中两次指定同一个目标表时发生失败(Tom Lane)
防止 VACUUM 尝试冻结涉及仍在运行事务的旧 multixact ID(Nathan Bossart,Jeremy Schneider)
这种情况会导致 VACUUM 一直失败,直到旧事务终止。
SET CONSTRAINTS ... DEFERRED 在分区表上执行失败,错误地报告缺少触发器(Álvaro Herrera)
修复父分区表包含已删除列时为分区创建索引发生的失败(Michael Paquier)
修复规划器对使用 ICU 排序规则的 ILIKE 中可进行大小写折叠的字符的测试(Tom Lane)
此错误导致规划器将模式中太多的部分视为固定前缀,使得从 ILIKE 子句生成的索引扫描可能遗漏应当找到的条目。
确保处理查询表达式时也处理 WINDOW 子句中的偏移量表达式(Andrew Gierth)
当偏移量是较复杂的表达式时,这一疏漏可能导致各种失败。例如,如果函数被内联,此类表达式中的函数参数引用就会失败。
修复 WITH CHECK OPTION 表达式和行级安全策略表达式中整行变量的处理(Andres Freund)
以前,这种用法可能导致虚假的行类型不匹配错误。
避免 postmaster 子进程数组已无空闲槽位时,并行查询请求后台工作进程导致 postmaster 失败(Tom Lane)
如果 BEFORE UPDATE 触发器原样返回旧元组,且它并非最后一个此类触发器,则防止可能发生的重复释放(Thomas Munro)
修复 或相关操作包含值为 NULL 的常量数组时发生的崩溃(Tom Lane)x = ANY (array)
修复查询尝试访问 TOAST 表时发生的 “unexpected relkind” 错误(John Hsu,Michael Paquier,Tom Lane)
错误应说明权限被拒绝,但代码重构破坏了这种情况的处理。
在并行工作进程启动期间设置 GUC 参数发生错误时,提供相关的错误上下文行(Thomas Munro)
在可串行化模式下,确保在正确的行版本上获取行级谓词锁(Thomas Munro,Heikki Linnakangas)
如果行的可见版本经过 HOT 更新,锁可能被加在其现已死亡的前一版本上,导致在不易察觉的情况下无法保证可串行化。
确保仅对以读写模式打开的文件应用 fsync()(Andres Freund,Michael Paquier)
某些代码路径尝试在以只读方式打开文件后执行此操作,但在某些平台上,这会导致 “bad file descriptor” 或类似错误。
允许编码转换成功处理比以前更长的字符串(Álvaro Herrera,Tom Lane)
以前,输入字符串有 0.25GB 的硬性上限;现在,只要转换后的输出不超过 1GB,就能够成功转换。
避免堆页面剪枝期间不必要的目录查找(Thomas Munro)
此处已不再需要检查不记录 WAL 的索引,而该检查在某些工作负载下导致了显著的性能问题。至少在理论上,它也存在发生死锁的可能性。
避免为窗口函数创建不必要地庞大的元组存储(Andrew Gierth)
在某些情况下,元组存储会包含源表的所有列,而非仅包含查询所需的列。
修复未能对分组哈希表的相等比较进行 JIT 编译、导致性能损失的问题(Andres Freund)
允许 repalloc() 在大型内存块缩小时归还空间(Tom Lane)
确保归档恢复结束时删除临时 WAL 文件和历史文件(Sawada Masahiko)
避免启用 recovery_min_apply_delay 时归档恢复发生失败(Fujii Masao)
recovery_min_apply_delay 通常不用于这种配置,但它应该能够正常工作。
修复发布者和订阅者对表的复制标识列认定不一致时逻辑复制发生的失败(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。
在逻辑解码中,确保重建快照时正确计入子事务(Masahiko Sawada)
此错误会导致断言失败;尚不清楚它在生产构建中是否有不良影响。
修复后端进程此前曾等待同步复制时,在退出期间发生的竞争条件(Dongming Liu)
修复 ALTER SYSTEM,使其能够处理 postgresql.auto.conf 中的重复条目(Ian Barwick)
ALTER SYSTEM 本身不会产生这种状态,但修改 postgresql.auto.conf 的外部工具可能会。现在会删除目标变量的重复条目,然后将新设置(如有)追加到末尾。
拒绝配置文件中包含空文件名的 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);
恢复 json[b]_populate_record() 和 json[b]_populate_recordset() 从 AS 子句获取类型信息的能力(Tom Lane)
如果记录参数为 NULL 且没有声明复合类型,则尝试改用 AS 子句。虽然不推荐这种用法,但它以前可以工作,现在又恢复了。
避免在 XMLTABLE 中选择命名空间节点时发生崩溃(Chapman Flack)
修复对间隔乘法中边界情况下整数溢出的检测(Yuya Watari)
修复使用 ICU 排序规则时 lower()、upper() 和 initcap() 函数中的内存泄漏(Konstantin Knizhnik)
避免 ispell 文本搜索词典包含错误的词缀数据时发生崩溃(Arthur Zakirov)
修复 GIN 倒排列表的不正确压缩逻辑(Heikki Linnakangas)
如果相邻被索引 TID 之间的距离超过 16TB,GIN 倒排列表条目可能需要 7 字节。处理逻辑中的某一步未与此保持一致,可能尝试将该值写入 6 字节缓冲区。原则上这可能导致栈越界,但在大多数架构上,下一个字节很可能是未使用的对齐填充,因此此缺陷无害。无论如何,此缺陷都很难触发。
修复 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 中,确保名称相似的触发器和行级安全策略对象的输出顺序稳定(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_basebackup 中,直到备份结束才对输出文件执行 fsync(Michael Paquier)
以前的代码在 fsync 较慢时可能导致超时失败。
在源集群在线的情况下运行 pg_rewind 时,像 pg_dump 那样禁用超时(Alexander Kukushkin)
修复使用 -s 选项时,延续的 WAL 记录恰好在页面边界处结束导致 pg_waldump 失败的问题(Andrey Lepikhov)
在 pg_waldump 中,将 newitemoff 字段包含在 B-树页面分裂记录中(Peter Geoghegan)
在使用 --bkp-details 选项的 pg_waldump 中,避免为涉及整页写入的 WAL 记录输出多余换行(Andres Freund)
修复 pg_waldump 中少量的内存泄漏(Andres Freund)
修复设置了较高 --jobs 值的 vacuumdb,使其更妥善地处理文件描述符耗尽的情况(Michael Paquier)
修复 PL/pgSQL,使其更好地处理复合类型的替换(Tom Lane)
涵盖在 PL/pgSQL 函数两次执行之间,复合类型被完全删除、随后又创建了同名新类型的情况。复合类型变量现在会更新以匹配新的定义。
修复 contrib/amcheck,使其在热备期间跳过不记录 WAL 的索引(Andrey Borodin,Peter Geoghegan)
这种情况下,不记录 WAL 的索引未必包含有效数据,因此不要尝试检查它。
修复 contrib/intarray 的 GiST 操作符类,使其在空数组上使用 <@ 时不会失败(Tom Lane)
这样的子句被认为可以使用索引,但索引搜索可能找不到空数组值;显然,这类条目应当直接匹配该搜索。array_column <@ constant_array
唯一可行且能回补到旧版本的修复方法,是让 <@ 索引搜索扫描整个索引,本补丁正是这样做的。遗憾的是,这意味着查询性能很可能比普通顺序扫描还差。
性能受到此更改不利影响的应用有几种选择。可以切换到没有此缺陷的 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 版,以反映斐济和诺福克岛的夏令时法规变更,并修正艾伯塔、奥地利、比利时、不列颠哥伦比亚、柬埔寨、香港、印第安纳(佩里县)、加里宁格勒、肯塔基、密歇根、诺福克岛、韩国和土耳其的历史数据。