E.2. 版本 12.1

E.2.1. 迁移到版本 12.1
E.2.2. 更改列表

发行日期: 2019-11-14

这个版本包含了12.0版本的各种修复。关于12.0版的新功能,请参见 第 E.3 节.

E.2.1. 迁移到版本 12.1

运行12.X的用户不需要转储/恢复。

E.2.2. 更改列表

  • ALTER TABLE添加了一个没有默认值的列,同时进行其他需要重写表的更改时,修复崩溃。 (Andres Freund)

  • 修正 REINDEX CONCURRENTLY中的锁定处理。 (Michael Paquier)

    REINDEX CONCURRENTLY 忽略了对新索引版本的会话级锁定,从而有可能允许其他会话过早地对其进行操作。此外,在错误的时间出现的查询取消或会话终止中断也可能导致无法释放 REINDEX CONCURRENTLY 所持有的会话级锁。

  • 当报告CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY命令的进度时,避免因竞赛条件而崩溃。 (Álvaro Herrera)

  • 避免在 REINDEX CONCURRENTLY 中创建重复的依赖项。(Michael Paquier)

    这个bug导致pg_depend中的臃肿,但没有比这更糟糕的后果。

  • 防止VACUUM试图冻结涉及仍在运行的事务的旧的多重act ID。 (Nathan Bossart, Jeremy Schneider)

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

  • wrong type of slot当试图在表达式索引上执行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_commandrecovery_end_commandrecovery_min_apply_delay设置。(Fujii Masao)

    现在,这些设置可以在postgresql.conf中指定,它们可以在崩溃恢复期间被打开,但在那时尊重它们是不可取的。忽略这些设置,直到崩溃恢复完成。

  • 当发布者和订阅者对表的复制标识列有冲突时,修复逻辑复制失败。 (Jehan-Guillaume de Rorthais, Peter Eisentraut)

    在订阅者上声明一列是复制身份的一部分,而在发布者上根本不存在,这就导致了negative bitmapset member not allowed错误。

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

  • 修复逻辑复制 walreceiver 进程中的超时处理。 (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标准,在这种情况下,结果应该是1,但12.0返回0。

  • 修正区间乘法中的边例整数溢出检测。(Yuya Watari)

  • 避免在ispell文本搜索词典包含错误的词缀数据时发生崩溃。(Arthur Zakirov)

  • 避免vacuum清空回收GiST索引时的内存泄漏。 (Dilip Kumar)

  • 在 Windows 上,可识别 挪威语 (Bokmål) 地区名称的其他拼写。(Tom Lane)

  • 修正libpq,允许整数参数的字符串值尾部有空格。(Michael Paquier)

    第12版收紧了libpq对整数参数的验证,但不允许尾部留白似乎并不可取。

  • libpq中,由于语法上无效的connect_timeout参数值导致失败后,正确报告CONNECTION_BAD连接状态。(Lars Kanis)

  • 如果ECPG客户端包含ecpglib.h,同时定义了ENABLE_NLS,则避免编译失败。 (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)

    前面的编码可能会被相关数据类型支持一个域或复合类型的存储列的情况所欺骗。

  • pg_rewind中使用--dry-run选项,避免更新pg_control。 (Alexey Kondratov)

    这可能会导致后续pg_rewind尝试失败。

  • 修正pg_waldump中的失败,用 -s选项,当一个延续的WAL记录正好在一个页面边界上结束时。 (Andrey Lepikhov)

  • pg_waldump中,使用--bkp-details选项,避免为涉及全页写入的WAL记录发出额外的换行。(Andres Freund)

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

  • pqsignal()作为导出的libpq符号放回。 (Tom Lane)

    这个功能被删除了,理由是没有客户端应该使用它,但这会破坏当前libpqpsql的老版本,也许还有其他应用程序的使用。

  • 修正configure对libperl存在的测试,使其在最近的Red Hat版本上运行。 (Tom Lane)

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

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

    以前的自旋锁编码允许编译器选择寄存器零,用于不接受该寄存器的汇编指令,导致构建失败。 我们只看到一个很久以前的报告与这个bug相吻合,但它可能会给试图构建修改后的PostgreSQL代码或使用非典型编译器选项的人带来问题。

  • 在AIX上,不要使用编译器选项-qsrcmsg。 (Noah Misch)

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

  • 修正MSVC构建过程中对OpenSSL文件路径中空格的处理。 (Andrew Dunstan)