受支持版本: 15

E.15. 发布版本 15.4 #

发布日期:. 2023-08-10

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

E.15.1. 迁移到版本 15.4 #

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

但是,如果你使用 BRIN 索引,建议对其重建;请参见下面的第三条变更日志条目。

另外,如果你从早于 15.1 的版本升级,请参见 Section E.18

E.15.2. 变更 #

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

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

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

  • 修复 MERGE 以正确执行行安全策略 (Dean Rasheed) §

    MERGE 执行 UPDATE 操作时,它应该执行目标表上定义的 UPDATESELECT RLS 策略,以与带有 WHERE 子句的普通 UPDATE 的工作方式保持一致。但实际上它对 INSERTUPDATE 操作都执行了 INSERT RLS 策略。

    此外,当 MERGE 执行 DO NOTHING 操作时,它对现有行应用了目标表的 DELETE RLS 策略,即使这些行并未被删除。 虽然这不是安全问题,但可能导致不必要的错误。

    PostgreSQL 项目感谢 Dean Rasheed 报告此问题。 (CVE-2023-39418)

  • 修复 BRIN 索引中空范围(无行)和全 NULL 范围的混淆,以及全 NULL 摘要的错误合并 (Tomas Vondra) § §

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

    此修复本身不会纠正错误的 BRIN 条目。 建议对可能用于搜索空值的 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) §

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

  • 修复表的访问方法依赖关系跟踪 (Michael Paquier) §

    ALTER TABLE ... SET ACCESS METHOD 在更改表的访问方法时 未能更新相关的 pg_depend 条目。 当使用非内置访问方法时,这会导致即使表仍然依赖某个访问方法, 该方法也可能被删除的风险。此修复纠正了 ALTER TABLE 中的逻辑, 但不会调整已缺失的 pg_depend 条目。

  • 不使用部分唯一索引在规划器中进行唯一性证明 (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 字节的限制已被发现对某些使用场景不足。

  • 确保当扩展声明其 GUC 前缀为保留时,所有现有的占位符都被检查是否匹配 (Karina Litskevich,Ekaterina Sokolova) §

    错误的循环逻辑可能导致某些条目被跳过。

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

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

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

  • 避免在删除订阅时泄漏统计条目 (Masahiko Sawada) §

  • 避免在页面释放导致空闲空间范围合并时丢失对可能有用的共享内存段的跟踪 (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 之类的致命错误。

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

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

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

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

  • 消除虚假的 missing contrecord 错误(Thomas Munro) §

    将此情况视为普通的 WAL 结束,以避免来自 pg_waldumpwalsender 的不准确错误日志。

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

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

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

  • 避免在事务内更改 stats_fetch_consistency 设置时的断言失败 (Kyotaro Horiguchi) §

  • 修复 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() 将无法在索引叶页面上显示这些值,或在非叶页面上直接崩溃。

  • psql 中,当标准输入/标准输出不是终端时忽略 PSQL_WATCH_PAGER 环境变量 (Tom Lane) §

    这与 \watch 以外的命令中对 PSQL_PAGER 的处理方式一致。

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

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

  • 改进 pg_dump 对依赖循环问题详细信息的显示 (Tom Lane) §

  • 避免 pgbench 在空管线和预备模式下崩溃 (Álvaro Herrera) §

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

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

  • 修复 make_etags 脚本使其与非 Exuberant 的 ctags 一起工作 (Masahiko Sawada) §

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。