PostgreSQL 15.4 发布日期: 2023-08-10
此版本包含 15.3 以来的各种修复。有关主要版本 15 中新功能的信息,请参阅第 E.5 节。
运行 15.X 的系统不需要转储/恢复。
但是,如果您使用 BRIN 索引,建议重新索引它们;请参阅下面的第三个变更日志条目。
另外,如果您要从 15.1 之前的版本升级,请参阅第 E.4 节。
如果名称包含引号、反斜杠或美元符号,则禁止将架构或所有者名称替换到扩展脚本中 (Noah Misch)
此限制可以防止可信扩展的 SQL 注入危险。
PostgreSQL项目感谢 Micah Gate、Valerie Woolard、Tim Carey - Smith 和 Christoph Berg 报告此问题。(CVE-2023-39417)
修复
MERGE以正确执行行安全策略(Dean Rasheed)当
MERGE执行UPDATE操作时,它应该强制执行在目标表上定义的任何策略UPDATE或RLS 策略,以与带有子句的纯文本的工作SELECT方式保持一致。相反,它对和操作执行RLS 策略。UPDATEWHEREINSERTINSERTUPDATE此外,当
MERGE执行DO NOTHING操作时,它会将目标表的DELETERLS 策略应用到现有行,即使这些行没有被删除。虽然这不是安全问题,但这可能会导致不必要的错误。PostgreSQL项目感谢 Dean Rasheed 报告此问题。(CVE-2023-39418)
修复 BRIN 索引中空(无行)范围和全 NULL 范围之间的混淆,以及全 NULL 摘要的错误合并 (Tomas Vondra)
这些疏忽都可能导致忘记 BRIN 索引范围包含任何 NULL 值,从而可能导致应返回 NULL 值的后续查询错过这样做。
此修复本身不会更正错误的 BRIN 条目。建议
REINDEX任何可用于搜索空值的 BRIN 索引。DROP DATABASE避免在中断时留下损坏的数据库(Andres Freund)如果
DROP DATABASE在已经开始采取不可逆转的步骤后被中断,则目标数据库仍然可以访问(因为删除其行pg_database会回滚),但它会包含损坏的内容。在我们开始执行不可逆操作之前,通过将数据库标记为不可访问来修复。此后发生故障将使数据库仍然部分存在,但除了发出另一个DROP DATABASE.确保分区索引在创建时正确标记为有效或无效 (Michael Paquier)
如果新的分区索引与其中一个分区上现有但无效的索引匹配,则分区索引最终可能会过早地被标记为有效。这可能会导致分区表上的后续查询出现错误行为或断言失败。
ALTER TABLE ATTACH PARTITION在(Michael Paquier)期间将分区索引与子索引匹配时忽略无效的子索引现在将忽略这样的索引,并创建一个新的子索引。
修复在附加所有分区后将分区索引标记为有效时可能出现的故障 (Michael Paquier)
索引条目的更新
pg_index可能会使用其他列的过时数据。报告的症状之一是“尝试更新不可见元组”错误。修复了
ALTER EXTENSION SET SCHEMA扩展程序包含扩展程序架构之外的任何对象时出现的抱怨(Michael Paquier、Heikki Linnakangas)如果扩展包含多个模式中的对象,则始终会出错;但该检查编码错误,因此无法检测到某些情况,从而导致令人惊讶的行为。
修复表访问方法依赖性的跟踪 (Michael Paquier)
ALTER TABLE ... SET ACCESS METHODpg_depend更改表的访问方法时未能更新相关条目。当使用非内置访问方法时,这会产生一种风险,即即使表仍然依赖于该访问方法,该访问方法也可能被删除。此修复更正了 中的逻辑ALTER TABLE,但不会调整任何已经丢失的pg_depend条目。不要在规划器中使用部分唯一索引来证明唯一性(David Rowley)
这可能会导致不正确的计划,因为如果不使用相关索引来扫描表,则从表中读取的行的假定唯一性可能不成立。
不要记忆具有不稳定连接条件的横向连接 (RichardGuo)
将 Memoize 应用于包含不稳定过滤条件的子计划可能会导致错误的答案。避免这样做的检查遗漏了使用时可能出现的一些情况
LATERAL。避免使用伪常量连接子句为外部连接生成错误的计划 (Etsuro Fujita)
规划器当前缺乏对将伪常量连接子句附加到下推远程连接的支持,因此在这种情况下禁用远程连接的生成。(更好的解决方案需要对规划器数据结构进行 ABI 破坏性更改,因此必须等待未来的主要版本。)
扩展规则操作时正确处理 RLS 策略表达式和安全屏障视图中的子 SELECT (Tom Lane)
修复隔离模式冲突检测中的竞争条件
SERIALIZABLE(Thomas Munro)当使用位图堆扫描、使用 GIN 索引以及检查初始为空的 btree 索引时,可能会遗漏冲突。所有这些情况都可能由于不正确地允许冲突事务提交而导致串行化失败。
修复 EvalPlanQual 检查继承或分区目标表的错误行为 (Tom Lane)
这种疏忽可能会导致在
READ COMMITTED隔离模式下执行更新或删除操作,而这些操作本应由于并发更新冲突而被跳过。使用包含来自外部嵌套循环的参数的内部哈希键修复哈希连接 (Tom Lane)
当这些Params的值改变后重新扫描连接时,我们必须重建哈希表,但我们忽略了这样做。这可能会导致缺少连接输出行。
修复尝试更新复合列的字段时出现的间歇性故障 (Tom Lane)
如果复合列的总体值足够宽以至于需要外线烘烤,那么不幸定时的缓存刷新可能会导致错误或服务器崩溃。
使用触发器防止某些
UPDATE查询中的查询生命周期内存泄漏 (Tomas Vondra)重新扫描增量排序计划节点时防止查询生命周期内存泄漏(James Coleman、Laurenz Albe、Tom Lane)
jsonpath在的方法的输入中接受小数秒datetime()(Tom Lane)使用非常复杂的文本搜索模式防止堆栈溢出崩溃 (Tom Lane)
pg_hba.conf允许和中的令牌长度最大为 10240 字节pg_ident.conf(Tom Lane)此前发现 256 字节的限制对于某些用例来说是不够的。
当扩展声明其 GUC 前缀被保留时,确保检查所有现有占位符是否匹配(Karina Litskevich、Ekaterina Sokolova)
错误的循环逻辑可能会导致某些条目被跳过。
修复 C++ 内存不足情况的错误处理 (Heikki Linnakangas)
如果使用 JIT,则 C++
new调用中内存不足将导致PostgreSQL致命错误,而不是预期的 C++ 异常。plancache.c修复(Tom Lane)中罕见的空指针崩溃避免在删除订阅时泄漏订阅的统计信息 (Masahiko Sawada)
当页面释放导致空闲空间范围合并时,避免丢失可能有用的共享内存段(Dongming Liu)
确保该段被移动到适当的“ bin ”中以获得新的可用空间量,以便后续搜索可以找到它。
允许
VACUUM在检测到某些类型的 B 树索引损坏后继续 (Peter Geoghegan)如果检测到无效的同级页面链接,请记录问题并继续,而不是像以前那样抛出错误。没有什么
REINDEX可以修复损坏的索引,但是VACUUM在完成之前阻止完成可能会使情况变得更糟。确保检测到无效数据
WrapLimitsVacuumLock后发布。或。(安德烈斯·弗罗因德)VACUUMpg_databasedatfrozenxidpg_databasedatminmxid未能释放此锁可能会导致稍后死锁,尽管如果会话退出或遇到其他错误,锁将会被清除。
避免在崩溃恢复期间双重重放已准备好的事务(suyu.cmj,Michael Paquier)
在检查点中途崩溃后,一些两阶段事务状态数据已被该检查点刷新到磁盘,崩溃恢复可能会尝试重播准备好的事务两次,从而导致致命错误,例如“锁已被持有”在启动过程中。
确保新创建的但仍为空的表
fsync在下一个检查点被编辑 (Heikki Linnakangas)如果没有这个,如果操作系统崩溃导致空文件消失,表上的后续操作可能会失败并出现“无法打开文件”错误。
确保未记录索引的 init 分支的创建是 WAL 记录的 (Heikki Linnakangas)
虽然未记录索引的主数据分叉不是 WAL 记录的,但它的 init 分叉应该是,以确保我们在崩溃后具有一致的状态来将索引恢复到。如果 init fork 不包含任何数据,则忽略此步骤,这是任何标准索引 AM 都未使用的情况;但也许某些扩展的行为是这样的。
沉默虚假的“缺少冲突记录”错误(Thomas Munro)
将此情况视为普通的 WAL 结束,以避免记录来自pg_waldump和walsender的不准确的投诉。
修复
jsonpath代码中过于严格的断言 (David Rowley)如果查询将
.type()运算符应用于结果,则此断言失败like_regex。非断言构建中没有错误。在已中止的事务中通过扩展查询协议处理空语句时避免断言失败 (Tom Lane)
stats_fetch_consistency在事务内更改设置时避免断言失败(Kyotaro Horiguchi)Fix
contrib/fuzzystrmatch的 Soundexdifference()函数可以正常处理空输入 (Alexander Lakhin, Tom Lane)不包含字母字符的输入字符串会导致不可预测的输出。
加强
contrib/hstore输入中的空格检查(Evan Jones)在某些情况下,字符会被错误地识别为空白并因此被丢弃。
contrib/intarray禁止带有索引 opclass的超大输入数组gist__int_ops(Ankit Kumar Pandey, Alexander Lakhin)以前,此代码会报告“
NOTICE但仍按”,创建一个无效的索引条目,在读取索引时存在崩溃的风险。避免对 GiST 索引条目进行无用的双重解压
contrib/intarray(Konstantin Knizhnik、Matthias van de Meent、Tom Lane)Fix
contrib/pageinspect的gist_page_items()函数在包含索引列时起作用 (Alexander Lakhin, Michael Paquier)以前,如果索引包含列,
gist_page_items()则无法在索引叶页上显示这些值,或者在非叶页上彻底崩溃。在psql
PSQL_WATCH_PAGER中,当 stdin/stdout 不是终端时忽略环境变量 (Tom Lane)PSQL_PAGER这对应于除 之外的 in 命令的处理\watch。修复pg_dump以正确处理新式 SQL 语言函数,其函数体需要对唯一索引进行解析时依赖 (Tom Lane)
例如,此类情况可能源自
GROUP BYand子句。ON CONFLICT然后,该函数必须推迟到转储输出中的唯一索引之后,但pg_dump没有这样做,而是打印了有关“无法解析依赖循环”的警告。改进pg_dump有关依赖循环问题的详细信息的显示 (Tom Lane)
避免使用空管道和准备模式在pgbench中崩溃(Álvaro Herrera)
确保
pg_index.indisreplident关系缓存条目保持最新(Shruthi Gowda)在某些情况下,该值可能已过时。没有依赖关系缓存副本的核心代码,因此就 Postgres 本身而言,这只是一个潜在的错误;但可能有一些扩展是一个实时错误。
修复make_etags脚本以使用非 Exuberant ctags (Masahiko Sawada)
文章来源:https://www.postgresql.org/docs/release/15.4/




