发布日期:. 2023-05-11
本次发布包含来自 11.19 的多项修复。 有关 11 主版本新特性的说明,请参见 Section E.23.
PostgreSQL 社区将于 2023 年 11 月停止发布 11.X 系列的更新。建议用户尽快升级到较新的发布分支。
防止 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_nameowner_name。然而某些代码路径 期望模式名称存在,因此会失败。
禁止修改存储在索引中的复合类型 (Tom Lane)
ALTER TYPE 不允许对存储在任何表列中的复合类型进行 非二进制兼容的修改。(也许将来会允许,但目前还没有实现; 重写大量表的锁定影响令人生畏。)我们忽略了索引可能包含 不在其所属表中出现的复合类型的情况。
确保对启用了 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 及更高版本中甚至可能导致崩溃。
修复解析器在某些不正确嵌套聚合的情况下未能检测到的问题 (Tom Lane)
这一疏忽可能导致执行器对本应作为无效查询被拒绝的查询执行失败。
修复解析序列 SEQUENCE NAME 选项时的数据结构损坏 (David Rowley)
如果事件触发器捕获了损坏的解析树,可能会导致问题。
在将 initplan 从一个节点移动到另一个节点时,正确更新计划节点的并行安全标记 (Tom Lane)
这一规划器疏忽可能导致运行时出现 “subplan was not initialized” 错误。
当调用包含子查询时,禁用窗口聚合的逆转换优化 (David Rowley)
此优化要求聚合的参数表达式具有可重复的结果, 而子查询可能不满足此条件。
修复嵌套 ARRAY[] 构造在执行中的疏忽 (Alexander Lakhin,Tom Lane)
正确检测结果数组所需总空间的溢出,避免因输出分配不足而可能导致的崩溃。 同时确保结果数组中任何尾部填充空间被清零;虽然在大多数情况下 留下垃圾数据是无害的,但可能会导致后续出现奇怪的行为。
修复布尔列分区裁剪逻辑 (David Rowley)
使用 boolcol IS NOT TRUE 条件进行裁剪时处理不正确, 可能导致不返回 boolcol 为 NULL 的行。 此外,按 NOT boolcol 进行分区这种不太可能的情况 也处理不正确。
修复并行哈希连接中每批次清理时的竞态条件 (Thomas Munro,Melanie Plageman)
在时机不巧且 parallel_leader_participation = off(非默认值)的情况下,可能发生崩溃。
当表具有值为零的每表 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” 错误或断言失败。
支持在规则动作的子查询中引用 OLD 和 NEW (Dean Rasheed,Tom Lane)
此类引用实际上是横向引用,但如果子查询没有显式标记 LATERAL,服务器可能会崩溃。 安排在必要时隐式添加该标记。
在反编译包含 WITH 中 INSERT/UPDATE/DELETE 的规则或 SQL 函数体时,注意打印目标表的正确别名 (Tom Lane)
修复 SERIALIZABLE READ ONLY 优化中的问题(Thomas Munro)
已标记为 “doomed” 的事务干扰了 SERIALIZABLE READ ONLY 事务的安全快照优化。 在某些情况下该优化被不必要地跳过。 在其他情况下会发生断言失败 (但在非断言构建中没有问题)。
避免 pgoutput 逻辑解码插件中的缓存回调槽泄漏 (Shi Yu)
在单个会话中多次启动和关闭该插件最终会导致 “out of relcache_callback_list slots” 错误。
修复在缓冲构建 GiST 索引期间对悬空指针的解引用 (Alexander Lakhin)
此错误在生产构建中通常是无害的,因为获取的值并不关键; 但原则上可能导致服务器崩溃。
逻辑复制更新或删除操作时忽略已删除列(Onder Kalaci,Shi Yu)
使用 REPLICA IDENTITY FULL 选项进行复制时, 如果表包含此类列则会失败。
支持使用 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)
目前尚不完全清楚此情况在已发布的分支中是否可达, 但如果可达则可能发生断言失败。
加强将 Perl 列表结构转换为多维 SQL 数组时的数组维度检查 (Tom Lane)
当子列表的嵌套不一致,使得数据不能表示值的矩形数组时, plperl 可能会出现异常行为。 此类情况现在会产生错误, 但之前可能导致崩溃或产生垃圾输出。
加强将 Python 列表结构转换为多维 SQL 数组时的数组维度检查 (Tom Lane)
在处理空子列表,或子列表嵌套不一致使得数据不能表示值的矩形数组时, plpython 可能会出现异常行为。 前者应该产生空输出数组,后者应产生错误。 但某些情况下会导致崩溃,另一些情况下会产生意外输出。
修复 plpython 中异常栈的展开 (Xing Guo)
某些罕见的失败情况可能在未清理 PG_TRY 异常栈的情况下返回, 如果在下一个栈层级被展开之前引发另一个错误,则有崩溃风险。
修复使用 -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 目标表。 这避免了死锁和数据丢失的风险。
在 contrib/hstore_plpython 中, 如果要转换的 Python 值不是映射类型则避免崩溃 (Dmitry Dolgov,Tom Lane)
这应该产生一个错误,但 Python 3 更改了一些 API, 导致检查出现异常行为,从而引发崩溃。
修复 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 版,以反映埃及、格陵兰、摩洛哥和巴勒斯坦的夏令时法规变更。
在使用莫斯科时间时,Europe/Kirov 和 Europe/Volgograd 现在 使用缩写 MSK/MSD 而不是数字缩写,以与其他使用莫斯科时间的 时区保持一致。此外,America/Yellowknife 不再与 America/Edmonton 不同;这影响该地区 1948 年之前的一些时间戳。