发布说明

PostgreSQL 15.4

E.14. 发布版本 15.4 #

发布日期:. 2023-08-10

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

E.14.1. 迁移到版本 15.4 #

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

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

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

E.14.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) §

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

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