发布说明

PostgreSQL 14.9

E.14. 发布版本 14.9 #

发布日期:. 2023-08-10

本次发布包含来自 14.8 的多项修复。 有关 14 主版本新特性的说明,请参见 Section E.23

E.14.1. 迁移到版本 14.9 #

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

但是,如果使用 BRIN 索引,建议在更新后重建这些索引;请参阅下面的第二个变更条目。

另外,如果是从早于 14.4 的版本升级,请参见 Section E.19

E.14.2. 变更 #

  • 如果模式或所有者名称包含引号、反斜杠或美元符号,则不允许将其替换到扩展脚本中 (Noah Misch) §

    此限制可防止受信任的扩展中的 SQL 注入风险。

    PostgreSQL 项目感谢 Micah Gates、 Valerie Woolard、Tim Carey-Smith 和 Christoph Berg 报告此问题。 (CVE-2023-39417)

  • 修复 BRIN 索引中空范围(无行)与全 NULL 范围之间的混淆, 以及全 NULL 摘要的不正确合并 (Tomas Vondra) § §

    这些疏忽都可能导致忘记某个 BRIN 索引范围包含 NULL 值, 从而可能使后续应当返回 NULL 值的查询遗漏这些值。

    此修复本身不会纠正已有的错误 BRIN 条目。 建议对任何可能用于搜索 NULL 值的 BRIN 索引执行 REINDEX

  • 避免在 DROP DATABASE 被中断时留下损坏的数据库 (Andres Freund) §

    如果 DROP DATABASE 在已开始执行不可逆步骤之后被中断, 目标数据库仍然可以访问(因为其 pg_database 行的移除会被回滚),但其内容已损坏。 修复方法是在开始执行不可逆操作之前将数据库标记为不可访问。 此后的失败将使数据库仍部分存在,但除了再次执行 DROP DATABASE 之外无法对其进行任何操作。

  • 确保分区索引在创建时被正确标记为有效或无效 (Michael Paquier) §

    如果新建的分区索引匹配某个分区上已有但无效的索引, 该分区索引可能会被过早地标记为有效。这可能导致后续对分区表的查询出现异常行为或断言失败。

  • ALTER TABLE ATTACH PARTITION 将分区索引匹配到子索引时忽略无效的子索引 (Michael Paquier) §

    这样的索引现在会被忽略,转而创建新的子索引。

  • 修复在所有分区都已附加后将分区索引标记为有效时可能出现的失败 (Michael Paquier) §

    更新索引的 pg_index 条目时可能对其他列使用了过期的数据。 报告的一个症状是 attempted to update invisible tuple 错误。

  • 修复 ALTER EXTENSION SET SCHEMA, 使其在扩展包含扩展模式之外的对象时报告错误 (Michael Paquier,Heikki Linnakangas) §

    当扩展包含多个模式中的对象时报告错误一直是预期行为; 但检查逻辑编写有误,未能检测到某些情况,导致令人意外的行为。

  • 不要在规划器中使用部分唯一索引进行唯一性证明 (David Rowley) §

    这可能产生不正确的计划,因为如果相关索引未用于扫描表, 则从表中读取的行的假定唯一性可能不成立。

  • 不要对具有易变连接条件的横向连接使用 Memoize (Richard Guo) §

    对包含易变过滤条件的子计划应用 Memoize 可能导致错误的结果。 避免这样做的检查遗漏了使用 LATERAL 时可能出现的一些情况。

  • 避免为具有伪常量连接子句的外部连接生成不正确的计划 (Etsuro Fujita) §

    规划器目前缺少将伪常量连接子句附加到下推的远程连接的支持, 因此在此类情况下禁用远程连接的生成。 (更好的解决方案需要对规划器数据结构进行破坏 ABI 的更改, 因此必须等到未来的主版本。)

  • 在展开规则动作时正确处理 RLS 策略表达式和安全屏障视图中的子 SELECT (Tom Lane) §

  • 修复 SERIALIZABLE 隔离模式下冲突检测中的竞争条件 (Thomas Munro) § § §

    使用位图堆扫描、使用 GIN 索引以及检查初始为空的 btree 索引时可能会遗漏冲突。 所有这些情况都可能因不当允许冲突事务提交而导致可序列化失败。

  • 修复对继承或分区目标表的 EvalPlanQual 检查的错误行为 (Tom Lane) §

    此疏忽可能导致 READ COMMITTED 隔离模式下的更新或删除操作 在本应由于并发冲突更新而被跳过时仍然被执行。

  • 修复内侧哈希键包含来自外层嵌套循环的 Param 的哈希连接 (Tom Lane) §

    当这些 Param 的值发生变化后重新扫描连接时,我们必须重建哈希表, 但之前疏忽了这一点。这可能导致连接输出行缺失。

  • 修复尝试更新复合列的字段时的间歇性失败 (Tom Lane) §

    如果复合列的整体值足够宽,需要外线 toast 存储, 则在不恰当的时刻发生的缓存刷新可能导致错误或服务器崩溃。

  • 防止某些带触发器的 UPDATE 查询中的查询级内存泄漏 (Tomas Vondra) § §

  • 防止增量排序计划节点重新扫描时的查询级内存泄漏 (James Coleman,Laurenz Albe,Tom Lane) §

  • jsonpathdatetime() 方法的输入中接受小数秒 (Tom Lane) §

  • 防止非常复杂的文本搜索模式导致栈溢出崩溃 (Tom Lane) §

  • 允许 pg_hba.confpg_ident.conf 中的令牌长度最多为 10240 字节 (Tom Lane) §

    之前 256 字节的限制已被发现对某些使用场景不足。

  • 修复 C++ 内存不足情况的错误处理 (Heikki Linnakangas) §

    如果正在使用 JIT,C++ new 调用中的内存不足会导致 PostgreSQL 的 FATAL 错误,而非预期的 C++ 异常。

  • 修复 plancache.c 中罕见的空指针崩溃 (Tom Lane) §

  • 避免在页面释放导致空闲空间范围合并时丢失对可能有用的共享内存段的跟踪 (Dongming Liu) §

    确保将该段移动到与其新的空闲空间量相应的 bin 中, 以便后续搜索能够找到它。

  • 允许 VACUUM 在检测到某些类型的 btree 索引损坏后继续执行 (Peter Geoghegan) § §

    如果检测到无效的兄弟页面链接,记录该问题并继续执行, 而不是像之前那样抛出错误。只有 REINDEX 才能修复损坏的索引,但阻止 VACUUM 在此之前完成可能会使情况变得更糟。

  • 确保在 VACUUM 检测到 pg_database.datfrozenxidpg_database.datminmxid 中的无效数据后释放 WrapLimitsVacuumLock (Andres Freund) §

    未能释放此锁可能导致后续死锁,尽管如果会话退出或遇到其他错误,该锁会被清理。

  • 避免在崩溃恢复期间对预备事务的双重重放 (suyu.cmj,Michael Paquier) § §

    在检查点进行到部分时发生崩溃,且某些两阶段事务状态数据已被该检查点刷新到磁盘后, 崩溃恢复可能尝试两次重放预备事务,导致诸如启动进程中 lock is already held 之类的致命错误。

  • 修复在启用归档且需要恢复两阶段事务时提升备库可能出现的失败 (Julian Markwort) §

    如果任何必需的两阶段事务记录在最新的(不完整的)日志段中, 提升将失败并错误地报告 requested WAL segment has already been removed

  • 确保新建但仍为空的表在下一次检查点时执行 fsync (Heikki Linnakangas) §

    如果没有这一步,在操作系统崩溃导致空文件消失后, 对该表的后续操作可能会出现 could not open file 错误。

  • 确保非日志索引的 init fork 的创建被记录到 WAL (Heikki Linnakangas) §

    虽然非日志索引的主数据 fork 不记录 WAL,但其 init fork 应该记录, 以确保在崩溃后有一个一致的状态来恢复索引。如果 init fork 不包含数据, 则此步骤被遗漏,这是标准索引 AM 不使用的情况;但也许某些扩展会有这种行为。

  • 修复延迟检查点结束标志的缺失重新初始化 (suyu.cmj) §

    这可能导致不必要的检查点延迟,或在启用断言的构建中出现断言失败。

  • 修复 jsonpath 代码中过于严格的断言 (David Rowley) §

    如果查询对 like_regex 结果应用 .type() 操作符,则此断言会失败。 在非断言构建中没有错误。

  • 避免在已中止的事务中通过扩展查询协议处理空语句时出现断言失败 (Tom Lane) §

  • 修复 contrib/fuzzystrmatch 的 Soundex difference() 函数以合理处理空输入 (Alexander Lakhin,Tom Lane) §

    不包含字母字符的输入字符串会产生不可预测的输出。

  • 加强 contrib/hstore 输入中的空白检查 (Evan Jones) §

    在某些情况下,字符会被错误地识别为空白从而被丢弃。

  • 拒绝 contrib/intarraygist__int_ops 索引操作符类的超大输入数组 (Ankit Kumar Pandey,Alexander Lakhin) §

    之前此代码会报告一个 NOTICE 但仍然继续执行, 创建一个无效的索引条目,在读取索引时可能导致崩溃。

  • 避免 contrib/intarray 中 GiST 索引条目的无用双重解压 (Konstantin Knizhnik,Matthias van de Meent,Tom Lane) §

  • 修复 contrib/pageinspectgist_page_items() 函数,使其在存在包含列的索引时正常工作 (Alexander Lakhin,Michael Paquier) §

    之前,如果索引有包含列,gist_page_items() 无法在索引叶子页面上显示这些值,或在非叶子页面上直接崩溃。

  • 修复 pg_dump 以正确处理函数体需要对唯一索引有解析时依赖的 新式 SQL 语言函数 (Tom Lane) §

    这类情况可能来自 GROUP BYON CONFLICT 子句等。函数必须在导出输出中延迟到唯一索引之后, 但 pg_dump 没有这样做,而是打印了一个关于 could not resolve dependency loop 的警告。

  • 确保关系缓存条目中的 pg_index.indisreplident 保持最新 (Shruthi Gowda) §

    此值在某些情况下可能是过期的。核心代码没有依赖关系缓存的此副本, 因此就 PostgreSQL 本身而言这只是一个潜在缺陷;但对于某些扩展来说可能是一个实际缺陷。