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