↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 10
历史版本PostgreSQL 10 已于 2022 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

E.1. 发布版本 10.23 #

发布日期:. 2022-11-10

本次发布包含来自 10.22 的多项修复。有关 10 主版本新特性的说明,请参见第 E.24 节。

这预计将是 PostgreSQL 10.X 系列的最后一个发行版。建议用户尽快更新到更新的发行分支。

E.1.1. 迁移到版本 10.23

对于运行 10.X 的用户,不需要执行导出/恢复。

但是,如果是从早于 10.19 的版本升级,请参见第 E.5 节。

E.1.2. 变更

  • 修复 VACUUM,使其在尝试删除 B-树索引页却找不到父页面中指向该页的下行链接时继续处理(Peter Geoghegan)

    现在只记录此问题并继续处理,不删除该空页面,而不再抛出错误。以前,有缺陷的操作符类或损坏的索引可能使索引清理一直无法完成,最终导致事务回卷问题。

  • 修复在可更新视图的 INSERT 的多行 VALUES 子句中出现的 DEFAULT 令牌的处理(Tom Lane)

    此疏忽可能导致“cache lookup failed for type”错误,或在较旧的分支中甚至导致崩溃。

  • 不允许名为 _RETURN 但不是 ON SELECT 的规则(Tom Lane)

    这避免了视图的 ON SELECT 规则与其可能拥有的任何其他规则之间的混淆。

  • 修复继承更新中 MULTIEXPR_SUBLINK 子计划的罕见失败(Tom Lane)

    对继承表或分区表使用 UPDATE tab SET (c1, ...) = (SELECT ...) 语法时,如果子表之间的差异足够大,就可能失败。这通常表现为执行器中的一致性检查失败,但也可能导致崩溃或错误的数据更新。

  • 当外层查询包含分组集时,避免展平没有 FROM 的子查询(Tom Lane)

    这一疏漏可能导致断言失败,或“variable not found in subplan target list”等规划器错误。

  • 防止备库提升后 WAL 损坏(Dilip Kumar,Robert Haas)

    当一个执行归档恢复(但未使用备库模式)的 PostgreSQL 实例被提升,且其尝试读取的最后一个 WAL 段以部分记录结尾时,该实例将在新时间线上写入无效的 WAL 段。

  • 修复 GIN 索引快速插入路径中 WAL 操作的错误排序(Matthias van de Meent,Zhang Mingli)

    此错误在核心 PostgreSQL 中没有已知的负面后果,但确实导致了一些扩展的问题。

  • 修复在重放起始点位于事务开始和其子事务开始之间时逻辑解码中的错误(Masahiko Sawada,Kuroda Hayato)

    这些错误可能导致调试构建中的断言失败,否则会导致内存泄漏。

  • 防止在逻辑解码期间使用错误的快照检查系统目录(Masahiko Sawada)

    如果解码从修改系统目录的事务中途开始,解码器可能无法识别这一点,导致未能将该事务视为进行中的事务来进行目录查找。

  • 在逻辑解码的更多位置接受中断(Amit Kapila,Masahiko Sawada)

    这改善了复制工作进程缓慢关闭的问题。

  • 避免在复制工作进程中函数语法错误后崩溃(Maxim Orlov,Anton Melnikov,Masahiko Sawada,Tom Lane)

    如果在逻辑复制工作进程中执行的 SQL 语言或 PL/pgSQL 语言 CREATE FUNCTION 或 DO 命令中发生语法错误,工作进程会因空指针解引用或断言失败而崩溃。

  • 修复传递给 SQL 函数的读写扩展数据的处理(Tom Lane)

    如果一个非内联 SQL 函数在多个位置使用一个参数,且其中一个函数期望能够就地修改读写数据,则后续使用该参数时会观察到错误的值。(在核心 PostgreSQL 中,扩展数据机制仅用于数组和复合类型值;但扩展可能将其用于其他结构化类型。)

  • 在 Snowball 词典中,不尝试对过长的单词进行词干提取(Olly Betts,Tom Lane)

    如果输入单词超过 1000 字节,在大小写折叠后直接返回,而不是尝试通过 Snowball 代码处理。此限制防止了土耳其语词干提取器中已知的递归导致堆栈溢出的问题,并且可以作为对 Snowball 词干提取器中可能存在的其他安全或性能问题的保障。如此长的字符串肯定不是任何人类语言中的单词,因此词干提取器对其也不太可能做出任何有意义的处理。

  • 修复字符串比较中的释放后使用隐患(Tom Lane)

    字符串比较函数中的不当内存管理可能导致在已不再分配的缓冲区上写入,可能破坏正在使用该内存的其他内容。这只会在相当长的字符串(超过 1kB)且使用 ICU 排序规则时才会发生。

  • 防止共享内存状态损坏时 postmaster 崩溃(Tom Lane)

    postmaster 进程应该在共享内存损坏时存活并启动数据库重启,但有一段代码在这方面不够谨慎。

  • 增加更多防止递归至堆栈溢出的防护措施(Richard Guo,Tom Lane)

  • 避免自动清理启动器进程中的长期内存泄漏(Reid Thompson)

    缺乏用户报告表明此问题在 v15 之前的分支中只是潜在的;但原因不太清楚,因此仍然后移了此修复。

  • 在 libpq 中为 NULL 连接指针增加缺失的保护检查(Daniele Varrazzo,Tom Lane)

    有一个惯例是 libpq 函数应检查 NULL 的 PGconn 参数,并优雅地失败而不是崩溃。PQflush() 和 PQisnonblocking() 没有遵循这个惯例,因此予以修复。

  • 在 ecpg 中,修复在同一声明中声明多个 varchar 或 bytea 变量时遗漏变量存储类的问题(Andrey Sokolov)

    例如,ecpg 在翻译 static varchar str1[10], str2[20], str3[30]; 时,只有 str1 被标记为 static。

  • 允许在 pg_basebackup 中进行跨平台表空间重定位(Robert Haas)

    允许 --tablespace-mapping 中的远程路径为 Unix 风格或 Windows 风格的绝对路径,因为源服务器可能与本地系统运行在不同的操作系统上。

  • 在 pg_stat_statements 中,修复对已释放内存的访问(zhaoqigui)

    当 pg_stat_statements 跟踪通过扩展查询协议发出的 ROLLBACK 命令时会出现此问题。在调试构建中,这始终导致断言失败。在生产构建中,通常没有可见的不良影响;但如果释放的内存已经被重用,很可能的结果是存储查询字符串的垃圾数据。

  • 在 postgres_fdw 中,确保为 EvalPlanQual 计划构建的目标列表包含所有必需的列(Richard Guo,Etsuro Fujita)

    这避免了在罕见情况下出现“variable not found in subplan target list”错误。

  • 拒绝平台的 uuid_create() 函数产生的意外输出(Nazir Bilal Yavuz)

    uuid-ossp 模块期望 libc 的 uuid_create() 产生版本 1 的 UUID,但最近的 NetBSD 版本改为产生版本 4(随机)的 UUID。检查这一点,如果是则抛出错误。删除文档中关于 NetBSD 实现可用于 uuid-ossp 的声明。(如果版本 4 的 UUID 对你的目的来说没问题,你根本不需要 uuid-ossp;只需使用 gen_random_uuid() 即可。)

  • 将新的 Perl 测试模块包含在标准安装中(Álvaro Herrera)

    在 15 之前的版本分支中将 PostgreSQL/Test/Cluster.pm 和 PostgreSQL/Test/Utils.pm 添加到标准安装文件集中。这是为了方便那些希望在旧版本分支中使用新编写的测试代码的扩展。

  • 在 NetBSD 上,强制在 postmaster 启动时解析动态符号(Andres Freund,Tom Lane)

    这避免了 NetBSD 10 上动态链接器中的死锁风险。

  • 允许在任何机器上使用 __sync_lock_test_and_set() 实现自旋锁(Tom Lane)

    这简化了向新机器架构的移植,至少在使用支持此 GCC 内置函数的编译器时。

  • 将符号 REF 重命名为 REF_P 以避免在最近的 macOS 上编译失败(Tom Lane)

  • 消除 clang 15 及更高版本的各种编译器警告(Tom Lane)

  • 将时区数据文件更新到 tzdata 2022f 版,以反映智利、斐济、伊朗、约旦、墨西哥、巴勒斯坦和叙利亚的夏令时法规变更,并修正智利、克里米亚、伊朗和墨西哥的历史数据。

    此外,Europe/Kiev 时区已重命名为 Europe/Kyiv。另外,以下时区已合并到附近的、人口更多的、自 1970 年以来时钟一致的时区中:Antarctica/Vostok、Asia/Brunei、Asia/Kuala_Lumpur、Atlantic/Reykjavik、Europe/Amsterdam、Europe/Copenhagen、Europe/Luxembourg、Europe/Monaco、Europe/Oslo、Europe/Stockholm、Indian/Christmas、Indian/Cocos、Indian/Kerguelen、Indian/Mahe、Indian/Reunion、Pacific/Chuuk、Pacific/Funafuti、Pacific/Majuro、Pacific/Pohnpei、Pacific/Wake 和 Pacific/Wallis。(这间接影响了已经是这些时区别名的时区:Arctic/Longyearbyen、Atlantic/Jan_Mayen、Iceland、Pacific/Ponape、Pacific/Truk 和 Pacific/Yap。)America/Nipigon、America/Rainy_River、America/Thunder_Bay、Europe/Uzhgorod 和 Europe/Zaporozhye 也被合并到附近的时区中,因为发现它们声称的 1970 年后与这些时区的差异似乎是错误的。在所有这些情况下,之前的时区名称仍作为别名保留;但实际数据是所合并到的时区的数据。

    这些时区合并导致被合并时区的 1970 年前时区历史丢失,这对于期望 timestamptz 显示一致性的应用程序可能造成困扰。例如,存储的值 1944-06-01 12:00 UTC 在选择 Europe/Stockholm 时区时,之前会显示为 1944-06-01 13:00:00+01,但现在会显示为 1944-06-01 14:00:00+02。

    可以使用选项构建时区数据文件来恢复旧的时区数据,但该选择也会插入大量其他旧的(且通常缺乏充分证据的)时区数据,导致相比接受这些上游更改,总变化更多。PostgreSQL 选择按照推荐方式发布 tzdb 数据,据我们所知,大多数主要操作系统发行版也在这样做。但是,如果这些更改给你的应用程序造成了严重问题,一个可能的解决方案是使用 tzdb 的向后兼容选项安装本地构建的时区数据文件(参见其 PACKRATDATA 和 PACKRATLIST 选项)。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。