PostgreSQL 13.1 中文入门教程 PostgreSQL 版本 13.1

2024-02-25 开发教程 PostgreSQL 13.1 中文入门教程 匿名 2
E.1.1. 迁移到13.1版
E.1.2. 更改

发行日期: 2020-11-12

这个版本包含了13.0的各种修复。 有关第13版的新功能的信息, 详见 第 E.2 节.

E.1.1. 迁移到13.1版

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

E.1.2. 更改

  • DECLARE CURSOR ... WITH HOLD以及在索引表达式和物化视图查询中触发延迟触发器(Noah Misch)。

    这实质上是“安全限制操作”沙箱机制的一个漏洞。 拥有创建非临时SQL对象权限的攻击者可以利用这一漏洞,以超级用户身份执行任意SQL代码。

    PostgreSQL项目感谢Etienne Stalmans报告这个问题。 (CVE-2020-25695)

  • 修正在 pg_dump, pg_restore, clusterdb, reindexdb, 和 vacuumdb 中复杂连接字符串参数的使用。(Tom Lane)

    pg_dump和pg_restore的-d参数, 或者提到的其他程序的--maintenance-db参数,可以是一个“连接字符串”,包含多个连接参数而不仅仅是一个数据库名称。 在这些程序需要启动额外连接的情况下,例如并行处理或处理多个数据库,连接字符串被遗忘了,只有基本的连接参数(数据库名称、主机、端口和用户名)被用于额外连接。 如果连接字符串包括任何其他重要信息,如非默认的SSL或GSS参数,这可能导致连接失败。更糟糕的是,连接可能会成功,但没有按照预期进行加密 ,或者容易受到中间人攻击,而预期的连接参数本可以防止这种攻击。 (CVE-2020-25694)

  • 当psql的connect命令重新使用连接参数时,确保以前的连接字符串中所有未被覆盖的参数被重新使用。(Tom Lane)

    这就避免了由于遗漏相关参数(如非默认的SSL或GSS选项)而导致重新连接失败的情况。 更糟糕的是,重新连接可能会成功,但没有按照预期进行加密,或者容易受到中间人攻击,而预期的连接参数本可以防止这种攻击。 这与刚才提到的pg_dump等的问题基本相同,尽管psql的行为更加复杂, 因为用户可能有意覆盖一些连接参数。 (CVE-2020-25694)

  • 防止psql的\gset命令修改特别处理的变量 (Noah Misch)

    没有前缀的\gset会覆盖服务器告诉它的任何变量。 因此,被攻击的服务器可以设置特殊处理的变量,如PROMPT1,从而有能力在用户会话中执行任意的shell代码。

    PostgreSQL 项目感谢 Nick Cleaton 报告这个问题。 (CVE-2020-25696)

  • 修复复制协议的意外中断 (Álvaro Herrera)

    一个wal发送者报告了START_REPLICATION的两个命令完成事件。 这是没有记录的,而且显然是无意的;所以我们没有注意到,13.0后的一个变化删除了重复的事件。 然而事实证明,wal接收者在一些代码路径中需要额外的事件。最实用的修复方法是宣布额外的事件是协议的一部分并恢复生成它。

  • 确保SLRU目录在检查点期间被正确地同步。 (Thomas Munro)

    这可以防止在随后的操作系统崩溃中可能出现的数据丢失。

  • 为具有BYPASSRLS属性的用户修复ALTER ROLE。(Tom Lane, Stephen Frost)

    BYPASSRLS属性只允许由超级用户更改,但其他ALTER ROLE操作, 如密码更改,应该只允许普通的权限检查。 以前的编码错误地将这种角色的所有更改都限制在超级用户身上。

  • 当有子表时,禁用ALTER TABLE ONLY ... DROP EXPRESSION(Peter Eisentraut)

    目前的实现无法正确处理这种情况,所以暂时禁止它。

  • 确保ALTER TABLE ONLY ... ENABLE/DISABLE TRIGGER不会递归到子表。 (Álvaro Herrera)

    以前,ONLY标志被忽略。

  • 允许LOCK TABLE在一个自引用的视图上成功。(Tom Lane)

    它之前抛出了一个无限递归错误,但似乎没有必要禁止这种情况。

  • 在整个REINDEX CONCURRENTLY中保留关于一个索引的统计数据。(Michael Paquier, Fabrízio de Royes Mello)

    非并发重建索引一直保留着这样的统计数据。

  • 修正REINDEX CONCURRENTLY的不正确进度报告 (Matthias van de Meent, Michael Paquier)

  • 确保GENERATED列在它们所依赖的列通过规则或可更新的视图被更新时被更新。(Tom Lane)

    这个修正也解决了在这种情况下可能无法触发特定列的触发器的问题。

  • 修复依赖排序的分区绑定表达的故障 (Tom Lane)

  • 支持text数组的散列 (Peter Eisentraut)

    如果数组元素类型是可整理的,数组散列就会失败。值得注意的是,这妨碍了使用以文本数组列作为分区键的哈希分区。

  • 防止跨类型日期时间比较中的内部溢出 (Nikita Glukhov, Alexander Korotkov, Tom Lane)

    以前,如果日期超过了时间戳的有效范围,比较日期和时间戳会失败。在时区旋转过程中,也有涉及接近极限的时间戳值溢出的边界情况。

  • 在函数 to_date()to_timestamp()中修正负数年份向公元前的日期逐一转换的问题(Dar Alathar-Yemen, Tom Lane)

    另外,分配负数年和明确的“BC”标记的组合来抵消并产生AD。

  • 允许jsonpath.datetime()方法接受ISO 8601格式的时间戳。(Nikita Glukhov)

    这不是SQL所要求的,但它似乎是合适的,因为我们的to_json()函数为Javascript的兼容性生成了该时间戳格式。

  • 确保当archive_mode被设置为always时,备用服务器将归档WAL时间线历史文件。(Grigory Smolkin, Fujii Masao)

    这种疏忽可能会导致随后的PITR恢复尝试失败。

  • 修复在使用kqueue()的平台上检测postmaster过早死亡的边缘情况。 (Thomas Munro)

  • 避免在排序键为volatile表达式时产生不正确的增量排序计划 (James Coleman)

  • 修正在GEQO规划过程中考虑分区连接时可能出现的崩溃。(Tom Lane)

  • 修复TOAST解压中可能出现的无限循环或损坏的输出数据 (Tom Lane)

  • 在只清理VACUUMs时,修正对B树索引中条目数量的计数。 (Peter Geoghegan)

  • 确保在将数据插入BRIN索引之前,对其进行清空处理。 (Tomas Vondra)

    索引条目不应该包含行外的TOAST指针,但BRIN没有收到这个备忘录。 这可能会导致诸如“missing chunk number 0 for toast value NNN”的错误。(如果你在现有的索引中遇到这样的错误,REINDEX应该足以解决它)。

  • 修正缓冲的GiST索引构建,以便在索引包含列的情况下工作 (Pavel Borisov)

  • 修正在pg_hba_file_rules视图中使用getnameinfo()的不方便性。 (Tom Lane)

    在FreeBSD 11上,可能还有其他平台,视图的addressnetmask列由于这个错误而总是为空。

  • 避免debug_query_string为NULL,启动一个并行worker时崩溃。 (Noah Misch)

  • 避免在BEFORE ROW UPDATE触发器返回已删除或“缺失”列的表的“旧”行时出现失败。 (Amit Langote, Tom Lane)

    这种抑制更新的方法可能导致崩溃。 意外的CHECK约束失败,或者不正确的RETURNING输出,因为“missing”列在这些方面会被读作NULL。 (如果一个列是由ALTER TABLE ADD COLUMN添加的,而且有一个非NULL,带有常量的默认值,那么这个列就是 “missing”)。 被删除的列也会造成麻烦。

  • 修正EXPLAIN对增量排序计划的输出,以便在XML输出模式下有正确的标签嵌套。(Daniel Gustafsson)

  • 在通过共享内存队列传输非常大的有效载荷时,避免不必要的失败 (Markus Wanner)

  • 修正在SQL语言函数中某些情况下遗漏结果数据类型的强制性问题 (Tom Lane)

    这可能导致错误的结果或崩溃,这取决于所涉及的数据类型。

  • 修正JIT代码生成中对模板函数属性的不正确处理 (Andres Freund)

    这已被证明在s390x上导致崩溃,而且很可能在其他平台上也有其他情况。

  • 改进为PPC上的compare_exchange和fetch_add操作生成的代码 (Noah Misch)

  • 修复RLS策略下的relation缓存内存泄漏问题 (Tom Lane)

  • 修复函数index_get_partition()中的边缘案例内存泄露。 (Justin Pryzby)

  • 当SIGHUP处理决定不重启就不能应用新的GUC变量值时,修复小的内存泄漏。 (Tom Lane)

  • 修复PL/pgsql的CALL处理中的内存泄漏。(Pavel Stehule, Tom Lane)

  • 在Windows的libpq中,每个进程调用WSAStartup()一次,WSACleanup()完全不调用。 (Tom Lane, Alexander Lakhin)

    以前,libpq在连接开始时调用WSAStartup(),在连接清理时调用WSACleanup()。然而,调用WSACleanup()似乎会干扰其他的程序操作;特别是,我们观察到很少的失败,无法向stdout发出预期的输出。 省略这个调用似乎没有什么不好的影响,所以就这么做吧。这也消除了程序执行一系列数据库连接时重复加载和卸载DLL的性能问题)。

  • 修复ecpg库在Windows下的per-thread初始化逻辑 (Tom Lane, Alexander Lakhin)

    多线程ecpg应用程序可能由于不正确的锁定而出现罕见的错误行为。

  • 修正ecpg对B'...'X'...'字样的错误处理。 (Shenhao Wang)

  • 在Windows上,使psql以文本模式而不是二进制模式读取回车键命令的输出。 (Tom Lane)

    这确保了对换行的正确处理。

  • 确保pg_dump收集扩展配置表的每列信息 (Fabrízio de Royes Mello, Tom Lane)

    如果不这样做,在指定--inserts时,会导致崩溃,或者在使用COPY重新加载表的数据时,未指定的(尽管通常是正确的)COPY命令。

  • 使pg_upgrade检查目标集群中的表空间目录是否预先存在 (Bruce Momjian)

  • 修复contrib/pgcrypto中潜在的内存泄漏。 (Michael Paquier)

  • contrib/pgcrypto中增加对一种不太可能的失败情况的检查。 (Daniel Gustafsson)

  • 修正最近添加的timetz测试案例,使其在美国不遵守夏令时的情况下发挥作用。 (Tom Lane)

  • 根据斐济、摩洛哥、巴勒斯坦、加拿大育空地区、麦夸里岛和凯西站(南极洲)的夏令时法律变化,更新时区数据文件至tzdata2020d版本;以及法国、匈牙利、摩纳哥和巴勒斯坦的历史修正。

  • 将我们的时区库副本与IANA的tzcode版本2020d同步。 (Tom Lane)

    这吸收了上游对zic的默认输出选项从“fat”到“slim”的改变。 这对我们来说只是表面现象,因为我们在v13之前的分支中继续选择“fat”模式。 这一改变也确保了strftime()不会改变errno,除非它失败。