发布日期:. 2024年5月9日
此版本包含从16.2修复的各种问题。 有关16的主要版本中新功能的信息,请参阅 第 E.9 节。
对于运行16.X的用户,不需要进行转储/恢复。
    然而,在系统视图pg_stats_ext和pg_stats_ext_exprs中发现了一个安全漏洞,
    可能允许经过身份验证的数据库用户查看他们不应该看到的数据。如果这在您的安装中是一个问题,请按照下面第一个变更日志条目中的步骤进行纠正。
   
此外,如果您正在从早于16.2的版本升级,请参阅 第 E.7 节。
      限制pg_stats_ext和
      pg_stats_ext_exprs条目的可见性,仅限表的
      拥有者(Nathan Bossart)
      §
     
      这些视图未能隐藏涉及访问用户无权读取的列的表达式的统计信息。视图列,如
      most_common_vals,可能会暴露与安全相关的数据。
      这里的潜在交互作用还不完全清楚,因此为了安全起见,将这些视图中的行
      仅对关联表的所有者可见。
     
PostgreSQL项目感谢Lukas Fittl报告了这个问题。 (CVE-2024-4317)
单独使用,这个修复只会修复在新初始化的数据库集群中的行为。如果您希望在现有集群中应用此更改,您需要执行以下操作:
        在share目录中找到fix-CVE-2024-4317.sql
        SQL脚本,该目录位于PostgreSQL安装目录中
        (通常类似于/usr/share/postgresql/)。确保使用适用于
        您的PostgreSQL主要版本的脚本。如果您找不到此文件,
        则可能您的版本不受影响(仅v14-v16受影响),或者您的次要版本太旧无法修复。
       
        在集群的每个数据库中,以超级用户身份运行fix-CVE-2024-4317.sql脚本。
        在psql中,看起来像是
\i /usr/share/postgresql/fix-CVE-2024-4317.sql
(根据需要调整文件路径)。任何错误可能表明您使用了错误的脚本版本。多次运行脚本不会有害。
        不要忘记包含template0和template1数据库,否则漏洞仍将存在于您稍后创建的数据库中。要修复template0,您需要暂时允许它接受连接。使用以下命令进行操作:
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
        然后在修复template0后,使用以下命令撤消:
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
      修复INSERT从多个VALUES行插入到目标列,
      该列是一个数组或复合类型的域 (Tom Lane)
      §
     
这种情况要么会因为不匹配的数据类型而失败,导致令人惊讶的投诉,要么会插入意外的强制转换,可能导致奇怪的结果。
      需要对目标表具有SELECT权限,以便使用带有
      DO NOTHING子句的MERGE操作
      (Álvaro Herrera)
      §
     
      SELECT权限在所有实际情况下都是必需的,但即使查询不读取目标表的任何列,也需要该权限。
      这样可以避免一个边缘情况,即MERGE不需要任何权限,即使它是一个无操作的命令,这似乎也是不可取的。
      修复在MERGE中处理自修改元组的问题
      (Dean Rasheed)
      §
     
      如果目标行与多个源行连接,根据SQL标准要求抛出错误。(如果涉及并发更新,以前的编码可能会悄悄忽略此条件。)
      此外,如果目标行已经被当前事务中的后续命令更新,由于BEFORE触发器或查询中使用的
      一个易失性函数,抛出一个非误导性的错误。
     
      修复当表按布尔列分区且查询包含布尔IS
      NOT子句时,错误修剪NULL分区的问题 (David Rowley)
      §
     
      一个NULL值满足一个子句,比如,因此去除包含NULL的分区会导致错误的答案。
     boolcol不是
      FALSE
      使用ALTER FOREIGN TABLE SET SCHEMA将任何拥有的序列移到新
      的模式中(Tom Lane)
      §
     
将常规表移动到新模式会导致表拥有的任何序列也移动到该模式(以及索引和约束)。 然而,对于外部表,这一点被忽略了。
      使ALTER TABLE ... ADD COLUMN创建的标识/序列号序列与其所
      属表具有相同的持久性(Peter Eisentraut)
      §
     
      CREATE UNLOGGED TABLE将使任何拥有的序列也变为非记录。 
      ALTER TABLE忽略了这一点,因此添加的标识列将具有记录的序列,这似乎是没有意义的。
      改进ALTER TABLE ... ALTER COLUMN TYPE的错误信息,
      当存在依赖的函数或发布时 (Tom Lane)
      §
      §
     
      在CREATE DATABASE中,识别策略关键字时不区分大小写,
      以与其他选项保持一致(Tomas Vondra)
      §
     
      修复EXPLAIN对位图堆扫描访问的堆页面计数
      (Melanie Plageman)
      §
     
以前,不包含可见元组的堆页面没有被计算在内;但更一致的做法是计算位图索引扫描返回的所有页面。
      修复EXPLAIN在MERGE中子计划的输出
      (Dean Rasheed)
      §
     
      EXPLAIN有时无法正确显示引用计划树其他部分变量的子计划参数。
     
避免在删除孤立的临时表时发生死锁 (Mikhail Zhilin) §
如果创建临时表的会话崩溃而没有删除表,自动清理将最终尝试删除孤立的表。 然而,分配了相同临时命名空间的传入会话也会这样做。 如果临时表有依赖关系(如拥有的序列),那么在这两次清理尝试之间可能会发生死锁。
      修复在使用VACUUM的
      DISABLE_PAGE_SKIPPING选项时更新可见性映射状态的问题
      (Heikki Linnakangas)
      §
     
由于一个疏忽,这种模式导致所有堆页面被弄脏,从而导致过多的I/O。 此外,错误设置的可见性映射位不会被清除。
避免在检查每个关系的冻结XID值时出现竞争条件 (Noah Misch) §
      VACUUM对每个数据库的冻结XID值的计算,可能会因为另一个VACUUM对这些值的并发更新而混淆。
     
修复并行清理时的缓冲区使用报告 (Anthonin Bonnefoy) §
      并行工作者执行的缓冲区访问未计入在VERBOSE模式中报告的统计数据中。
     
确保从等价类生成的连接条件在正确的计划级别上应用 (Tom Lane) §
      在PostgreSQL 16之前的版本中,生成的条件可能会在应该在外连接之上(之后)评估时被评估在外连接之下,导致查询结果不正确。在考虑连接到具有某些SELECT 分支中连接列的常量输出的UNION ALL树时,所有版本都存在类似的风险。
     
      修复“无法找到用于排序的路径键项”错误,这些错误在规划带有
      ORDER BY或DISTINCT选项的聚合函数时
      发生(David Rowley)
      §
     
这类似于在16.1中应用的修复,但它解决了并行计划中的问题。
防止某些窗口函数可能出现的错误优化 (David Rowley) §
      禁用“运行条件”优化ntile()和count()
      的非常量参数。这样可以避免与子选择相关的可能的错误行为,通常导致类似于
      “在子计划目标列表中找不到WindowFunc”的错误。
     
避免在非移动窗口框架中不必要地使用移动聚合模式 (Vallimaharajan G) §
      当一个普通的聚合函数被用作窗口函数时,且窗口帧的起始位置被指定为UNBOUNDED PRECEDING时,
      帧的头部不会移动,因此我们不需要使用特殊的(更昂贵的)移动聚合模式。这种优化一直是有意的,但由于编码错误,它从未触发过。
避免在使用GEQO进行分区连接规划时使用已释放的数据 (Tom Lane) §
这通常会以崩溃或意外错误消息结束。
避免在 Memoize 中释放仍在使用的数据(Tender Wang,Andrei Lepikhov) §
在生产版本中,这个错误通常不会引起任何问题,因为释放的数据在被使用之前很可能不会被覆盖。
      修复错误报告的统计种类代码,在“请求的统计种类
      X尚未构建”错误消息中
      (David Rowley)
      §
     
对于“catcache list”对象,使用哈希表代替线性搜索 (Tom Lane) §
此更改解决了在具有数千个角色的安装中报告的某些操作的性能问题。
      对于在FROM中返回RECORD的函数要更加小心
      (Tom Lane)
      §
      §
     
      这样的函数调用的输出列必须由AS子句定义,该子句指定列名和数据类型。
      如果实际函数输出值与之不匹配,则应在运行时抛出错误。然而,一些代码路径可能会过早地检查实际值,
      如果不符合预期,可能会发出奇怪的错误或遭受断言失败。
     
修复关于SQL语言过程返回行类型的混淆问题 (Tom Lane) §
使用SQL语言实现的一个返回单个复合类型列的过程会导致断言失败或核心转储。
为一些递归函数添加保护性堆栈深度检查 (Egor Chindyaskin) §
      修复date_bin()中的错误舍入和溢出隐患
      (Moaaz Assali)
      §
     
在源时间戳早于原始时间戳且它们的差值已经是步长的整数倍的情况下,代码错误地仍然减去了步长。 同时,检测一些可能导致产生错误结果的整数溢出情况。
      检测在将间隔添加到或从时间戳中减去时的整数溢出
      (Joseph Koshakow)
      §
     
一些应该引起超出范围错误的情况,却产生了错误的结果。
      避免在pg_get_expr()中出现竞争条件
      (Tom Lane)
      §
     
如果参数引用的关系同时被删除,函数的意图是返回NULL,但有时会失败。
修复在XID状态函数中检测旧事务ID的问题 (Karina Litskevich) §
      过去超过231个事务的事务ID可能被误认为是最近的,
      导致pg_xact_status()或txid_status()的异常行为。
     
确保表的空闲空间映射不会返回超出表末尾的页面(Ronan Dunklau) §
由于freespace map没有进行WAL日志记录,在涉及操作系统崩溃、副本提升或PITR恢复的边缘情况下,这是可能的。结果将是一个“无法读取块”错误。
      修复在WaitEventSetWait中等待时抛出错误时的文件描述符泄漏
      (Etsuro Fujita)
      §
     
避免在FDW实现异步追加但未为追加计划节点配置任何等待条件时破坏异常堆栈 (Alexander Pyhalov) §
如果在重新索引时访问了索引,则抛出错误 (Tom Lane) §
以前这只是一个断言检查,但将其提升为常规运行时错误。当重新索引用户定义的索引表达式尝试访问自己的表时,这将提供一个更准确的错误消息。
      确保在name列上的仅索引扫描返回一个
      完全填充的值(David Rowley)
      §
     
索引中物理存储的值被截断,以前将该值的指针返回给调用者。在valgrind下测试时引发了投诉。 理论上可能导致崩溃,尽管没有报告过。
修复可能导致在使复制槽失效时报告错误冲突原因的竞争条件 (Bertrand Drouvot) §
修复在逻辑复制中决定是否需要表同步操作时的竞争条件 (Vignesh C) §
当订阅者确定需要同步哪些表时,如果发生失效事件,则可能会被忘记,导致一些新需要同步的表可能无法及时处理。
修复了DSM分配大于4GB时的崩溃问题(Heikki Linnakangas) §
如果无法将新服务器会话的客户端套接字设置为非阻塞模式,则断开连接 (Heikki Linnakangas) §
曾经在理论上我们可以使用阻塞模式的套接字;但长期以来这种方式并没有完全起作用,所以在连接开始时失败,而不是之后出现问题。
修复与OpenSSL 3.0.0及更高版本相关的 不充分错误报告问题(Heikki Linnakangas, Tom Lane) §
OpenSSL传递的系统报告的错误是用数字错误代码而不是可读内容报告的。
      修复 Windows 上 getaddrinfo() 的错误报告线程安全性
      (Thomas Munro)
      §
     
一个多线程的libpq客户端程序在网络查找失败后可能会收到 错误或损坏的错误消息。
      避免在libpq和ecpglib
      中同时调用bindtextdomain()(Tom Lane)
      §
      §
     
虽然GNU gettext的实现似乎可以处理并发调用,但在Windows上可用的版本不行。
在ecpg中,避免发出错误的 “不支持的功能将被传递到服务器”警告 (Tom Lane) §
      确保ecpg的intoasc()函数的字符串结果
      正确地以零结尾(Oleg Tselebrovskiy)
      §
     
      在initdb的-c选项中,
      匹配参数名称时不区分大小写(Tom Lane)
      §
     
      服务器对参数名称的处理不区分大小写,因此此代码也应如此。这避免了在生成的
      postgresql.conf 文件中放入冗余条目。
在psql中,避免在查询被取消后泄露查询结果 (Tom Lane) §
      这种情况仅在取消一个使用\;分隔符组成的查询字符串中的非最后一个查询时发生。
     
      修复pg_dumpall,使得角色注释(如果存在)无论
      --no-role-passwords的设置如何都会被导出
      (Daniel Gustafsson,Álvaro Herrera)
      §
     
      跳过名为.DS_Store的文件
      在pg_basebackup、
      pg_checksums和
      pg_rewind中 (Daniel Gustafsson)
      §
     
这样可以避免在macOS上出现问题,因为Finder可能会创建这样的文件。
      修复PL/pgSQL对单行注释
      (--风格注释)在表达式后面的解析问题
      (Erik Wienhold, Tom Lane)
      §
     
      这个错误导致在WHEN表达式后面跟着一个注释时出现解析错误,
      在PL/pgSQL CASE语句中。
      在contrib/amcheck中,不要因短头与长头值的差异而报告
      错误匹配失败(Andrey Borodin,Michael Zhilin)
      §
      §
     
在堆元组或索引元组中,变长数据可以有短头部或长头部,这取决于制作时应用的压缩参数。 将这些情况视为等效,而不是在存在差异时报错。
修复BRIN输出函数中的错误 (Tomas Vondra) § §
      这些输出函数仅用于在contrib/pageinspect中显示索引条目,因此错误的实际影响有限。
     
      在contrib/postgres_fdw中,避免发出按常量排序的请求
      (David Rowley)
      §
     
      这可能发生在涉及UNION ALL和发出常量的子查询的情况下。按常量排序当然是无用的,
      但也有被远程服务器误解的风险,导致“ORDER BY position N is not in select list”错误。
     
      使contrib/postgres_fdw将远程会话的时区设置为
      GMT而不是UTC(Tom Lane)
      §
     
      这在实际目的上应该有相同的结果。
      然而,GMT被服务器中的硬编码识别,
      而UTC在时区数据库中查找。
      因此,在极少数情况下,旧代码可能会失败,
      如果远程服务器的时区数据库缺少条目。
      在contrib/xml2中,避免使用在最近版本的
      libxml2中已被弃用的库函数
      (Dmitry Koval)
      §
     
修复与LLVM 18的不兼容问题(Thomas Munro, Dmitry Dolgov) §
      允许make check与musl C 库一起工作
      (Thomas Munro、Bruce Momjian、Tom Lane)
      §