发布日期: 2023-08-10
此版本包含 13.11 以来的各种修复。有关主要版本 13 中新功能的信息,请参阅第 E.13 节。
运行 13.X 的系统不需要转储/恢复。
但是,如果您使用 BRIN 索引,建议重新索引它们;请参阅下面的第二个变更日志条目。
另外,如果您要从 13.7 之前的版本升级,请参阅第 E.6 节。
如果名称包含引号、反斜杠或美元符号,则禁止将架构或所有者名称替换到扩展脚本中 (Noah Misch)
此限制可以防止可信扩展的 SQL 注入危险。
PostgreSQL项目感谢 Micah Gate、Valerie Woolard、Tim Carey - Smith 和 Christoph Berg 报告此问题。(CVE-2023-39417)
修复 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)如果扩展包含多个模式中的对象,则始终会出错;但该检查编码错误,因此无法检测到某些情况,从而导致令人惊讶的行为。
不要在规划器中使用部分唯一索引来证明唯一性(David Rowley)
这可能会导致不正确的计划,因为如果不使用相关索引来扫描表,则从表中读取的行的假定唯一性可能不成立。
避免使用伪常量连接子句为外部连接生成错误的计划 (Etsuro Fujita)
规划器当前缺乏对将伪常量连接子句附加到下推远程连接的支持,因此在这种情况下禁用远程连接的生成。(更好的解决方案需要对规划器数据结构进行 ABI 破坏性更改,因此必须等待未来的主要版本。)
扩展规则操作时正确处理 RLS 策略表达式和安全屏障视图中的子 SELECT (Tom Lane)
修复隔离模式冲突检测中的竞争条件
SERIALIZABLE
(Thomas Munro)当使用位图堆扫描、使用 GIN 索引以及检查初始为空的 btree 索引时,可能会遗漏冲突。所有这些情况都可能由于不正确地允许冲突事务提交而导致串行化失败。
使用包含来自外部嵌套循环的参数的内部哈希键修复哈希连接 (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 字节的限制对于某些用例来说是不够的。
修复 C++ 内存不足情况的错误处理 (Heikki Linnakangas)
如果使用 JIT,则 C++
new
调用中内存不足将导致PostgreSQL致命错误,而不是预期的 C++ 异常。plancache.c
修复(Tom Lane)中罕见的空指针崩溃当页面释放导致空闲空间范围合并时,避免丢失可能有用的共享内存段(Dongming Liu)
确保该段被移动到适当的“ bin ”中以获得新的可用空间量,以便后续搜索可以找到它。
允许
VACUUM
在检测到某些类型的 B 树索引损坏后继续 (Peter Geoghegan)如果检测到无效的同级页面链接,请记录问题并继续,而不是像以前那样抛出错误。没有什么
REINDEX
可以修复损坏的索引,但是VACUUM
在完成之前阻止完成可能会使情况变得更糟。确保检测到无效数据
WrapLimitsVacuumLock
后发布。或。(安德烈斯·弗罗因德)VACUUM
pg_database
datfrozenxid
pg_database
datminmxid
未能释放此锁可能会导致稍后死锁,尽管如果会话退出或遇到其他错误,锁将会被清除。
避免在崩溃恢复期间双重重放已准备好的事务(suyu.cmj,Michael Paquier)
在检查点中途崩溃后,一些两阶段事务状态数据已被该检查点刷新到磁盘,崩溃恢复可能会尝试重播准备好的事务两次,从而导致致命错误,例如“锁已被持有”在启动过程中。
如果启用了归档并且需要恢复两阶段事务,则修复升级备用服务器时可能出现的故障 (Julian Markwort)
如果任何所需的两阶段事务记录在最近的(部分)日志段中,则升级将失败,并错误地抱怨“请求的 WAL 段已被删除”。
确保新创建的但仍为空的表
fsync
在下一个检查点被编辑 (Heikki Linnakangas)如果没有这个,如果操作系统崩溃导致空文件消失,表上的后续操作可能会失败并出现“无法打开文件”错误。
确保未记录索引的 init 分支的创建是 WAL 记录的 (Heikki Linnakangas)
虽然未记录索引的主数据分叉不是 WAL 记录的,但它的 init 分叉应该是,以确保我们在崩溃后具有一致的状态来将索引恢复到。如果 init fork 不包含任何数据,则忽略此步骤,这是任何标准索引 AM 都未使用的情况;但也许某些扩展的行为是这样的。
修复延迟检查点结束标志丢失的重新初始化 (suyu.cmj)
这可能会导致不必要的检查点延迟,或者在启用断言的构建中导致断言失败。
修复
jsonpath
代码中过于严格的断言 (David Rowley)如果查询将
.type()
运算符应用于结果,则此断言失败like_regex
。非断言构建中没有错误。在已中止的事务中通过扩展查询协议处理空语句时避免断言失败 (Tom Lane)
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)确保
pg_index
.indisreplident
关系缓存条目保持最新(Shruthi Gowda)在某些情况下,该值可能已过时。没有依赖关系缓存副本的核心代码,因此就 Postgres 本身而言,这只是一个潜在的错误;但可能有一些扩展是一个实时错误。
使用 OpenSSL 3.0.0 或更高版本编译时静默弃用警告 (Peter Eisentraut)
文章来源:https://www.postgresql.org/docs/release/13.12/