发布日期:. 2023年5月11日
这个版本包含了从15.2版本中修复的各种问题。 有关主要版本15中新功能的信息,请参见第 E.8 节。
防止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 DATABASE
时,带有STRATEGY
WAL_LOG
选项可能导致模板(源)数据库损坏的潜在问题(Nathan Bossart,Ryo Matsumura)
不当的缓冲处理会导致模板的pg_class
目录的任何后续修改都会丢失。
修复在使用带STRATEGY WAL_LOG
参数的
CREATE DATABASE
时出现的内存泄漏和不必要的磁盘读取问题
(Andres Freund)
在CREATE SCHEMA
中避免新模式名称被省略时崩溃(Michael Paquier)
SQL标准允许编写CREATE SCHEMA AUTHORIZATION
,其中模式
名称默认为owner_name
owner_name
。然而,
一些代码路径期望模式名称存在,否则会失败。
修复各种使用MERGE
命令时的规划器失败(Tom Lane)
计划可能会出现错误,比如“在子计划目标列表中找不到变量”或“在不 期望的地方找到PlaceHolderVar”。
修复一些特殊情况下MERGE
命令报告的行数错误(Dean Rasheed)
在命令标签中报告的行数计数了实际上由于BEFORE ROW
触发器返回NULL而未被修改的行。
这与在普通UPDATE
或DELETE
中发生的情况不一致,因此
更改为不计算这些行。此外,当MERGE
将其移动到分区表的不同分区时,
避免将一行计数两次。
修复MERGE
在并发更新时的问题(Dean Rasheed, Álvaro Herrera)
一些情况下,如果一个要被MERGE
更新或删除的行刚好被并发事务更新,
则可能导致崩溃,执行错误的合并操作,或者根本没有任何操作。
添加对反编译MERGE
命令的支持(Álvaro Herrera)
当MERGE
被添加时,这一点被忽视了,但在新风格SQL函数中支持MERGE
是至关重要的。
修复分区表中外键触发器的启用/禁用(Tom Lane)
ALTER TABLE ... ENABLE/DISABLE TRIGGER
失败,如果应用于分区表的外键强制触发器,
因为它尝试通过名称定位分区的克隆触发器,而它们的名称不同。请通过父触发器OID来定位它们。
禁止修改存储在索引中的复合类型(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)
当使用删除功能时,该函数可能会获取输入字符串后面的字节,存在一定的崩溃风险。
调整文本搜索相关的字符分类逻辑,以正确检测当前区域设置是否为C
(Jeff Davis)
如果数据库的默认排序规则使用ICU,这段代码会感到困惑。
避免可能的崩溃,对于类型interval
(Tom Lane)
允许在ISO-8601间隔字段中使用指数表示法(Tom Lane)
类似P0.1e10D
的间隔输入并不是ISO-8601官方认可的,但在版本15之前我们接受了它很长一段时间,所以重新允许它。
修复JSON字符串字面量中解析错误的光标设置(Tom Lane)
大多数情况下,在JSON值中检测到语法错误的字符串文字未能正确设置错误光标。 这至少导致了一个无用的错误消息(指向字符串之前的标记,而不是实际的问题点), 甚至可能导致在v14及以后版本中崩溃。
修复由vacuum_defer_cleanup_age
大于当前64位xid引起的数据损坏(Andres Freund)
在v14及更高版本中,如果vacuum_defer_cleanup_age
的设置不是默认值,
可能会计算出一个非常大的清理范围xid,导致清理器删除仍然存活的行。v12和v13存在同样问题的
较轻形式,只影响GiST索引,可能导致索引页过早回收。
修复解析器未能检测到一些不正确嵌套的聚合体的情况(Tom Lane)
这个疏忽可能导致执行器对本应被拒绝为无效的查询失败。
修复在解析串行SEQUENCE NAME
选项期间发生的数据结构损坏(David Rowley)
这可能会导致问题,如果事件触发器捕获了损坏的解析树。
当将initplans从一个节点移动到另一个节点时,正确更新计划节点的并行安全标记(Tom Lane)
这个计划者的疏忽可能导致运行时出现“子计划未初始化”错误。
避免在扩展统计代码中使用PlaceHolderVars导致失败 (Tom Lane)
使用依赖类型扩展统计信息可能会出现“找到未预期的PlaceHolderVar”错误。
修复了关于是否可以将应用于子查询的qual子句转换为子查询内的窗口聚合“运行条件”的不正确测试(David Rowley)
在这样一个从句中的子计划会导致断言失败或不正确的答案,一些其他异常情况也会如此。
当调用包含子查询时,禁用窗口聚合中的逆转换优化(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
设置为零时,不要平衡清理延迟成本(Masahiko Sawada)
延迟平衡应该在自动清理处理具有每个关系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)
这种情况通常会导致“未识别的节点类型”错误或断言失败。
支持在规则操作中的子查询中引用OLD
和NEW
(Dean Rasheed, Tom Lane)
这样的引用实际上是横向引用,但如果子查询没有明确标记为LATERAL
,服务器可能会崩溃。在必要时隐式地安排这样做。
当反编译包含INSERT
/UPDATE
/DELETE
的规则或SQL函数体时,
在WITH
中,务必注意打印目标表的正确别名(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
。
在待机模式下禁用启动进度报告开销 (Bharath Rupireddy)
在待机模式下,我们实际上不会报告恢复的进度,但我们仍在努力追踪它。
支持具有SCRAM-SHA-256通道绑定的RSA-PSS证书(Jacob Champion,Heikki Linnakangas)
这个功能需要使用OpenSSL 1.1.1或更新版本进行构建。服务器和libpq都受到影响。
避免在Windows上使用进程ID跟踪引起的竞态条件(Thomas Munro)
操作系统可能在postmaster观察到子进程已经消失之前回收一个PID。这可能导致跟踪多个具有相同PID的子进程,从而导致混乱。
修复list_copy_head()
在空列表上的正确工作(David Rowley)
已知没有任何核心PostgreSQL代码会涉及这种情况,但扩展可能依赖于其正常工作。
为SPI_result_code_string()
添加缺失的情况(Dean Rasheed)
修复AllocSetRealloc()
(Karina Litskevich)中Valgrind标记错误。
在一个不寻常的情况下,当一个大的(>8kB)palloc块的大小被减小时, 一个Valgrind-aware构建会错误地标记释放的内存的定义状态,可能导致在Valgrind测试期间出现不正确的结果。
修复了在启用了行级安全性的分区表中将MERGE
操作合并时的断言失败问题(Dean Rasheed)
避免在解码事务性逻辑复制消息时出现断言失败(Tomas Vondra)
在处理正则表达式转义字符时避免区域敏感性(Jeff Davis)
反斜杠后跟一个非ASCII字符有时可能会导致断言失败,这取决于当前的区域设置。
避免在指定范围的最后几页为空时,在log_newpage_range()
中尝试写入空的WAL记录(Matthias van de Meent)
目前尚不清楚这种情况是否可以在已发布的分支中达到,但如果可以的话,可能会发生断言失败。
修复在使用cast表达式的plpgsql DO
块中出现的会话生命周期内存泄漏。
(Ajit Awekar, Tom Lane)
当将Perl列表结构转换为多维SQL数组时,加强数组维度检查(Tom Lane)
plperl在子列表的嵌套不一致时可能会表现不当,导致数据不表示值的矩形数组。 这种情况现在会产生错误,但以前可能会导致崩溃或垃圾输出。
当将Python列表结构转换为多维SQL数组时,加强数组维度检查(Tom Lane)
plpython在处理空子列表或者子列表的嵌套不一致导致数据不表示值的矩形数组时可能会出现异常行为。 前者应该导致空输出数组,后者导致错误。但有些情况导致崩溃,而其他情况导致意外输出。
修复plpython中异常堆栈展开的问题(Xing Guo)
一些罕见的失败情况可能在不清理PG_TRY异常堆栈的情况下返回,如果在下一个堆栈级别解除之前引发另一个错误,可能会导致崩溃。
修复libpq的PQconnectPoll()
中不一致的GSS加密错误处理
(Michael Paquier)
当gssencmode
设置为require
时,
在GSS初始化失败后,连接不会被标记为死连接。立即使其失败,就像TLS加密的等效情况一直在做的那样。
修复了使用ecpg构建的程序可能出现的数据损坏问题,
该程序使用了-C ORACLE
选项(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在从管道中读取时出现异常行为。
在pgbench的“prepared”模式中,在启动管道之前,准备好所有命令的管道(Álvaro Herrera)
这样可以避免在管道内部尝试启动一个可串行化事务时出现失败。
在contrib/amcheck
的堆检查代码中,正确处理具有零xmin或xmax的元组(Robert Haas)
在contrib/amcheck
中,合理处理似乎在零点之前的xids(Andres Freund)
在出现数据损坏的情况下,我们可能会看到一个包裹在32位xid之前的xid,看起来是在第一个xid纪元之前。 将这样的值提升为64位形式会产生一个遥远的未来值,导致错误的报告。 在这种情况下返回FirstNormalFullTransactionId,以便事情能够相对正常地运行。
在contrib/basebackup_to_shell
中,正确检测打开管道失败的情况(Robert Haas)
在contrib/hstore_plpython
中,避免在要转换的Python值不是映射时导致崩溃(Dmitry Dolgov,
Tom Lane)
这应该会产生一个错误,但Python 3以一种方式改变了一些API,导致检查行为异常,从而导致崩溃。
要求在ltree
列上的GiST索引的siglen
选项,如果指定的话,必须是4的倍数
(Alexander Korotkov)
其他数值会导致对索引内容的访问不对齐,在英特尔兼容硬件上没有问题,但在其他一些架构上可能会导致崩溃。
在contrib/pageinspect
中,为gist_page_items()
函数添加对不正确输入的防御(Dmitry Koval)
修复在contrib/pg_trgm
中处理无法满足的正则表达式时出现的问题。(Tom Lane)
诸如$foo
这样的正则表达式是合法的但无法满足;
正则表达式编译器会识别这一点并生成一个空的NFA图。
尝试将这样的图优化为pg_trgm GIN或GiST索引的限制条件会导致访问工作数组的末尾,
可能导致崩溃。
修复contrib/postgres_fdw
中application_name
参数中转义序列的处理(Kyotaro Horiguchi,Michael Paquier)
在后台进程中执行这些代码进行扩展可能会失败,例如在对外部表进行自动分析时。
在contrib/pg_walinspect
中,限制pg_get_wal_records_info()
的内存使用(Bharath Rupireddy)
使用--strip-unneeded
选项在使用GNU兼容的strip工具时剥离静态库(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构建会尝试将其放在安装目录中,这不一定是可写的。
更新时区数据文件至tzdata2023c版本,以反映埃及、格陵兰、摩洛哥和巴勒斯坦的夏令时法律变化。
当观察莫斯科时间时,欧洲/基洛夫和欧洲/伏尔加格勒现在使用缩写MSK/MSD而不是数字缩写, 以保持与观察莫斯科时间的其他时区的一致性。 此外,美洲/黄刀不再与美洲/埃德蒙顿区分开来;这影响了该地区一些1948年之前的时间戳。