发布说明

PostgreSQL 14.8

E.15. 发布版本 14.8 #

发布日期:. 2023-05-11

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

E.15.1. 迁移到版本 14.8 #

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

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

E.15.2. 变更 #

  • 防止 CREATE SCHEMA 绕过 search_path 的更改(Alexander Lakhin) § §

    CREATE SCHEMA 命令中,当前 search_path 中的对象以及新创建模式中的对象, 即使在调用了试图设置安全 search_path 的函数或脚本中也是可见的。 这可能允许任何有权创建模式的用户劫持安全定义函数或扩展脚本的权限。

    PostgreSQL 项目感谢 Alexander Lakhin 报告此问题。 (CVE-2023-2454)

  • 在内联集合返回函数后正确执行行级安全策略 (Stephen Frost,Tom Lane) §

    如果一个集合返回的 SQL 语言函数引用了具有行级安全策略的表, 且该函数可以被内联到调用查询中,在某些涉及在不同角色下重用缓存计划的情况下, 这些 RLS 策略将不会被正确执行。 这可能允许用户查看或修改本应不可见的行。

    PostgreSQL 项目感谢 Wolfgang Walther 报告此问题。 (CVE-2023-2455)

  • 避免在 CREATE SCHEMA 中省略新模式名称时发生崩溃 (Michael Paquier) §

    SQL 标准允许编写 CREATE SCHEMA AUTHORIZATION owner_name,其中模式名称 默认为 owner_name。然而某些代码路径 期望模式名称存在,因此会失败。

  • 修复分区表中克隆触发器的启用/禁用问题 (Tom Lane) §

    ALTER TABLE ... ENABLE/DISABLE TRIGGER USER 会跳过克隆触发器,错误地将其视为系统触发器。 ENABLE/DISABLE TRIGGER 的其他变体会处理它们, 但只在不恰当地强制执行超级用户检查之后才处理。

  • 禁止修改存储在索引中的复合类型 (Tom Lane) §

    ALTER TYPE 不允许对存储在任何表列中的复合类型进行 非二进制兼容的修改。(也许将来会允许,但目前还没有实现; 重写大量表的锁定影响令人生畏。)我们忽略了索引可能包含 不在其所属表中出现的复合类型的情况。

  • 禁止将系统列用作外键的元素(Tom Lane) §

    自从移除 OID 作为系统列以来,这种用法已没有合理的使用场景, 而且各处代码也不再支持它。 与其尝试修复所有相关情况,不如直接禁止它。

  • 确保对启用了 RLS 的父表执行 COPY TO 时 不会从子表中复制任何行(Antonin Houska) §

    文档明确说明 COPY TO 仅从指定的表中复制行, 不包括它可能拥有的任何继承子表。然而,如果该表启用了行级安全, 则此行为将不再成立。

  • 避免在向 array_position()array_positions() 传递空数组时可能发生的崩溃 (Tom Lane) §

  • 修复 to_char() 中可能的越界读取问题 (Tom Lane) §

    运气不好的情况下,这可能导致服务器崩溃。

  • 避免 translate() 函数中的缓冲区越界读取 (Daniil Anisimov) §

    使用删除功能时,该函数可能会读取输入字符串之后的一个字节, 从而产生少量崩溃风险。

  • 修复 JSON 字符串字面量中解析错误时的错误光标设置 (Tom Lane) §

    在 JSON 值中的字符串字面量中检测到语法错误的大多数情况下, 未能正确设置错误光标。这至少会导致无用的错误消息 (指向字符串之前的标记,而不是实际的问题位置), 在 v14 及更高版本中甚至可能导致崩溃。

  • 修复由于 vacuum_defer_cleanup_age 大于当前 64 位 xid 而导致的数据损坏(Andres Freund) §

    在 v14 及更高版本中,使用非默认的 vacuum_defer_cleanup_age 设置时,可能会计算出 一个非常大的 vacuum 清理范围 xid,导致 vacuum 删除仍然存活的行。 v12 和 v13 存在同一问题的较轻形式,仅影响 GiST 索引, 可能导致索引页被过早回收。

  • 修复解析器在某些不正确嵌套聚合的情况下未能检测到的问题 (Tom Lane) §

    这一疏忽可能导致执行器对本应作为无效查询被拒绝的查询执行失败。

  • 修复解析序列 SEQUENCE NAME 选项时的数据结构损坏 (David Rowley) §

    如果事件触发器捕获了损坏的解析树,可能会导致问题。

  • 在将 initplan 从一个节点移动到另一个节点时,正确更新计划节点的并行安全标记 (Tom Lane) §

    这一规划器疏忽可能导致运行时出现 subplan was not initialized 错误。

  • 避免扩展统计代码中 PlaceHolderVar 的处理失败 (Tom Lane) §

    使用依赖类型的扩展统计可能会失败, 并出现 PlaceHolderVar found where not expected 错误。

  • 当调用包含子查询时,禁用窗口聚合的逆转换优化 (David Rowley) §

    此优化要求聚合的参数表达式具有可重复的结果, 而子查询可能不满足此条件。

  • 修复嵌套 ARRAY[] 构造在执行中的疏忽 (Alexander Lakhin,Tom Lane) §

    正确检测结果数组所需总空间的溢出,避免因输出分配不足而可能导致的崩溃。 同时确保结果数组中任何尾部填充空间被清零;虽然在大多数情况下 留下垃圾数据是无害的,但可能会导致后续出现奇怪的行为。

  • 防止在更新复合类型域数组列中的字段时发生崩溃(Dmitry Dolgov) §

  • 修复布尔列分区裁剪逻辑 (David Rowley) §

    使用 boolcol IS NOT TRUE 条件进行裁剪时处理不正确, 可能导致不返回 boolcol 为 NULL 的行。 此外,按 NOT boolcol 进行分区这种不太可能的情况 也处理不正确。

  • 修复并行哈希连接中每批次清理时的竞态条件 (Thomas Munro,Melanie Plageman) §

    在时机不巧且 parallel_leader_participation = off(非默认值)的情况下,可能发生崩溃。

  • 在 EvalPlanQual 检查后重新计算 GENERATED 列 (Tom Lane) §

    READ COMMITTED 隔离模式下,行更新的效果 可能需要重新应用到比查询最初找到的更新版本的行上。如果是这样, 我们需要重新计算任何 GENERATED 列, 以防它们依赖于被并发更新所更改的列。

  • 修复 Memoize 计划执行中的内存泄漏(David Rowley) §

  • 修复在分区树中包含的外部表使用批量插入时的缓冲区引用计数泄漏 (Alexander Pyhalov) §

  • 恢复对亚毫秒级 vacuum_cost_delay 设置的支持 (Thomas Munro) §

  • 当表具有值为零的每表 vacuum_cost_delay 设置时, 不进行 vacuum 代价延迟均衡 (Masahiko Sawada) §

    延迟均衡应该在 autovacuum 处理具有每表 vacuum_cost_delay 设置的表时被禁用, 但这仅对正值生效,而不对零值生效。

  • 修复在视图末尾添加列时的极端情况崩溃 (Tom Lane) §

  • 修复分区更新中 MULTIEXPR_SUBLINK 子计划的罕见失败 (Andres Freund,Tom Lane) §

    使用语法 INSERT ... ON CONFLICT DO UPDATE SET (c1, ...) = (SELECT ...) 并以分区表作为目标表时, 如果任何子表与父表不一致(例如,物理列顺序不同),可能导致失败。 这通常表现为执行器中一致性检查的失败; 但也可能导致崩溃或不正确的数据更新。

  • 修复在具有 DO ALSO INSERT ... SELECT 规则的视图上 执行多行 INSERT ... VALUES 查询时 DEFAULT 标记的处理(Dean Rasheed) §

    此类情况通常会出现 unrecognized node type 错误或断言失败。

  • 支持在规则动作的子查询中引用 OLDNEW (Dean Rasheed,Tom Lane) §

    此类引用实际上是横向引用,但如果子查询没有显式标记 LATERAL,服务器可能会崩溃。 安排在必要时隐式添加该标记。

  • 在反编译包含 WITHINSERT/UPDATE/DELETE 的规则或 SQL 函数体时,注意打印目标表的正确别名 (Tom Lane) §

  • 修复 SERIALIZABLE READ ONLY 优化中的问题(Thomas Munro) § §

    已标记为 doomed 的事务干扰了 SERIALIZABLE READ ONLY 事务的安全快照优化。 在某些情况下该优化被不必要地跳过。 在其他情况下会发生断言失败 (但在非断言构建中没有问题)。

  • 避免 pgoutput 逻辑解码插件中的缓存回调槽泄漏 (Shi Yu) §

    在单个会话中多次启动和关闭该插件最终会导致 out of relcache_callback_list slots 错误。

  • 避免对索引操作符类选项的自定义验证器进行不必要的调用 (Alexander Korotkov) §

    此更改修复了某些情况下抛出意外错误的问题。

  • 避免在使用多个扫描键扫描多列 BRIN 索引时进行无用的工作 (Tomas Vondra) §

    现有代码在决定范围是否匹配时实际上只考虑了最后一个扫描键, 因此通常扫描的索引范围比实际需要的多。

  • 修复 BRIN inet_minmax_multi_ops 操作符类中的网络掩码处理 (Tomas Vondra) §

    此错误在启用断言的构建中会触发断言失败, 但在生产构建中基本无害。

  • 修复在缓冲构建 GiST 索引期间对悬空指针的解引用 (Alexander Lakhin) §

    此错误在生产构建中通常是无害的,因为获取的值并不关键; 但原则上可能导致服务器崩溃。

  • 在逻辑复制更新或删除操作期间忽略已删除列和生成列 (Onder Kalaci,Shi Yu) § §

    使用 REPLICA IDENTITY FULL 选项进行复制时, 如果表包含此类列则会失败。

  • 修正提交时间戳的 SLRU 缓冲区 I/O 等待事件的名称 (Alexander Lakhin) §

    根据文档,此等待事件名为 CommitTsBuffer, 但代码中为 CommitTSBuffer。将代码改为与文档一致, 因为这样与相关等待事件的命名更加一致。

  • 重新激活等待事件 SLRUFlushSync 的报告 (Thomas Munro) §

    此类等待的报告在代码重构中被意外移除。

  • 避免在计算要保留多少 WAL 段时可能发生的下溢 (Kyotaro Horiguchi) §

    这可能导致无法准确遵守 wal_keep_size 设置。

  • 支持使用 SCRAM-SHA-256 通道绑定的 RSA-PSS 证书 (Jacob Champion,Heikki Linnakangas) §

    此功能需要使用 OpenSSL 1.1.1 或更新版本构建。 服务器和 libpq 都受到影响。

  • 避免在 Windows 上进程 ID 跟踪的竞态条件(Thomas Munro) § § §

    操作系统可能在 postmaster 观察到子进程已退出之前回收其 PID。 这可能导致使用相同的 PID 跟踪多个子进程,从而造成混乱。

  • SPI_result_code_string() 添加缺失的分支 (Dean Rasheed) §

  • 修复 AllocSetRealloc() 中错误的 Valgrind 标记 (Karina Litskevich) §

    在大型(>8kB)palloc 块的大小被减小这种不常见的情况下, 启用 Valgrind 的构建会错误标记从块中释放的内存的已定义状态, 可能在 Valgrind 测试期间导致不正确的结果。

  • 避免在解码事务性逻辑复制消息时发生断言失败 (Tomas Vondra) §

  • 避免在处理正则表达式转义时的区域设置敏感性 (Jeff Davis) §

    反斜杠后跟非 ASCII 字符有时会导致断言失败, 具体取决于当前的区域设置。

  • 避免在 log_newpage_range() 中当指定范围内 最后几个页面为空时尝试写入空 WAL 记录 (Matthias van de Meent) §

    目前尚不完全清楚此情况在已发布的分支中是否可达, 但如果可达则可能发生断言失败。

  • 修复使用类型转换表达式的 plpgsql DO 块中的会话生命周期内存泄漏 (Ajit Awekar,Tom Lane) §

  • 加强将 Perl 列表结构转换为多维 SQL 数组时的数组维度检查 (Tom Lane) §

    当子列表的嵌套不一致,使得数据不能表示值的矩形数组时, plperl 可能会出现异常行为。 此类情况现在会产生错误, 但之前可能导致崩溃或产生垃圾输出。

  • 加强将 Python 列表结构转换为多维 SQL 数组时的数组维度检查 (Tom Lane) § §

    在处理空子列表,或子列表嵌套不一致使得数据不能表示值的矩形数组时, plpython 可能会出现异常行为。 前者应该产生空输出数组,后者应产生错误。 但某些情况下会导致崩溃,另一些情况下会产生意外输出。

  • 修复 plpython 中异常栈的展开 (Xing Guo) §

    某些罕见的失败情况可能在未清理 PG_TRY 异常栈的情况下返回, 如果在下一个栈层级被展开之前引发另一个错误,则有崩溃风险。

  • 修复 libpqPQconnectPoll() 中不一致的 GSS 加密错误处理 (Michael Paquier) §

    gssencmode 设置为 require 时, GSS 初始化失败后连接未被标记为已断开。 使其立即失败,与 TLS 加密的等效情况长期以来的行为一致。

  • 修复使用 -C ORACLE 选项构建的 ecpg 程序中可能的数据损坏 (Kyotaro Horiguchi) §

    ecpg_get_data() 被调用时 varcharsize 设置为零,它可能会将终止零字符 写入前一个字段的最后一个字节,从而截断该字段中的数据。

  • 修复 pg_dump,使得在枚举类型列上 进行哈希分区的分区表可以成功恢复 (Tom Lane) §

    由于枚举值的哈希码依赖于分配给枚举的 OID, 在导出和恢复后它们通常是不同的,这意味着行往往需要进入 与原来不同的分区。用户可以通过指定 --load-via-partition-root 选项来解决此问题; 但由于不使用该选项几乎不可能成功, 因此让 pg_dump 对此类表自动应用该选项。

    同时,修复 pg_restore,使其在使用 --load-via-partition-root 模式时不再尝试在恢复前 TRUNCATE 目标表。 这避免了死锁和数据丢失的风险。

  • 在 Windows 上正确检测不可定位的文件 (Juan José Santamaría Flecha,Michael Paquier,Daniel Watzinger) § §

    此错误导致 pg_dump 写入管道或 pg_restore 从管道读取时出现异常行为。

  • pgbenchprepared 模式下,在启动管线之前准备好管线中的所有命令 (Álvaro Herrera) §

    这避免了当 pgbench 脚本尝试在管线内部启动可序列化事务时出现的失败。

  • contrib/amcheck 的堆检查代码中, 正确处理 xmin 或 xmax 为零的元组(Robert Haas) § §

  • contrib/amcheck 中,合理处理 看起来在纪元零之前的 xid(Andres Freund) §

    在损坏的情况下,我们可能会看到一个回卷的 32 位 xid, 看起来在第一个 xid 纪元之前。将这样的值提升为 64 位形式会产生 一个远在未来的值,导致错误的报告。在此类情况下返回 FirstNormalFullTransactionId,以便行为合理正常。

  • contrib/hstore_plpython 中, 如果要转换的 Python 值不是映射类型则避免崩溃 (Dmitry Dolgov,Tom Lane) §

    这应该产生一个错误,但 Python 3 更改了一些 API, 导致检查出现异常行为,从而引发崩溃。

  • 要求 ltree 列上 GiST 索引的 siglen 选项(如果指定)必须是 4 的倍数 (Alexander Korotkov) §

    其他值会导致对索引内容的未对齐访问, 这在 Intel 兼容硬件上是无害的,但在某些其他架构上可能导致崩溃。

  • contrib/pageinspect 中, 为 gist_page_items() 函数增加对错误输入的防御 (Dmitry Koval) §

  • 修复 contrib/pg_trgm 在处理 不可满足的正则表达式时的异常行为(Tom Lane) §

    $foo 这样的正则表达式是合法的但不可满足; 正则表达式编译器会识别到这一点并生成一个空的 NFA 图。 尝试将这样的图优化为 pg_trgm GIN 或 GiST 索引限定条件时, 会导致访问工作数组末尾之外的内容,可能导致崩溃。

  • 在使用 GNU 兼容的 strip 剥离静态库时 使用 --strip-unneeded 选项 (Tom Lane) §

    之前,make install-strip 在这种情况下使用 -x 选项。此更改避免了 llvm-strip 的异常行为, 同时也能产生稍小的输出。

  • 停止推荐自动下载 DTD 文件用于构建文档,并实际禁用该功能 (Aleksander Alekseev,Peter Eisentraut,Tom Lane) §

    现在似乎不再可能在没有本地安装 DocBook DTD 文件的情况下 构建 SGML 文档。之前 xsltproc 可以 从 sourceforge.net 即时下载这些文件;但 sourceforge.net 现在 只允许 HTTPS 访问,而没有常见版本的 xsltproc 支持该协议。因此,移除了 我们文档中建议这种做法是可能或有用的部分,改为在构建配方中 添加 xsltproc--nonet 选项。

  • 在 PGXS 构建中运行 TAP 测试时,为临时 portlock 目录使用更合理的位置 (Peter Eisentraut) §

    将其放置在构建目录下的 tmp_check 中。 使用之前的代码,PGXS 构建会尝试将其放置在安装目录中, 而该目录不一定是可写的。

  • 将时区数据文件更新到 tzdata 版本 2023c,包含埃及、格陵兰、摩洛哥和巴勒斯坦的夏令时法规变更。 (Tom Lane) §

    在使用莫斯科时间时,Europe/Kirov 和 Europe/Volgograd 现在 使用缩写 MSK/MSD 而不是数字缩写,以与其他使用莫斯科时间的 时区保持一致。此外,America/Yellowknife 不再与 America/Edmonton 不同;这影响该地区 1948 年之前的一些时间戳。