E.16. 发布版本 10.8 #
发布日期:. 2019-05-09
本次发布包含来自 10.7 的多项修复。有关 10 主版本新特性的说明,请参见第 E.24 节。
E.16.2. 变更
防止通过选择率估计器绕过行级安全策略(Dean Rasheed)
规划器的某些选择率估计器会将用户定义的操作符应用于
pg_statistic中的值(例如最常见值)。因此,即使调用用户无权读取某列,可能泄露信息的操作符仍能披露该列中的一些项。在 CVE-2017-7484 中,我们增加了限制来防止这种情况,但没有考虑行级安全的影响。某个用户虽然具有读取某列的 SQL 权限,却因 RLS 策略而无法查看某些行,仍可能通过此类操作符获知这些行的部分内容。本补丁进一步收紧了规则,仅在没有相关 RLS 策略时,才允许将可能泄露信息的操作符应用于统计数据。(CVE-2019-10130)避免在单语句事务中创建带有
ON COMMIT DROP和标识列的临时表时发生目录损坏(Peter Eisentraut)这一隐患被忽略了,因为这种用法实际上没有意义:临时表创建后立即就会被删除。
避免对分区查询结果关系执行 EPQ 复检时发生崩溃(Amit Langote)
当使用
READ COMMITTED隔离级别,且其他会话并发更新了某些目标行时,就会发生这种情况。修复对继承树或分区表执行
UPDATE或DELETE时,每个表都可被排除的情况下的行为(Amit Langote,Tom Lane)在这种情况下,如果存在
RETURNING子句,查询未报告正确的输出列集合;如果存在应当触发的语句级触发器,也未触发它们。避免存在
FOR ALL TABLES发布时,更新临时表和不记录 WAL 的表抛出不正确的错误(Peter Eisentraut)对于发布而言,应当忽略此类表,但部分代码未能做到这一点。
目标关系为可更新视图时,修复包含多行
VALUES的INSERT ... VALUES命令中对显式DEFAULT项的处理(Amit Langote,Dean Rasheed)当可更新视图的列没有默认值,但其底层表有默认值时,单行
INSERT ... VALUES会使用底层表的默认值。然而,多行情况下以前始终使用 NULL。现在修正为与单行情况一致。修复
CREATE VIEW,使其允许零列视图(Ashutosh Sharma)为与允许零列表的行为保持一致,我们也应该允许这种情况。由于表可以转换为视图,即使存在这一限制,也能创建零列视图,从而导致转储/重载失败。
补上对
CREATE TABLE IF NOT EXISTS ... AS EXECUTE ...缺失的支持(Andreas Karlsson)IF NOT EXISTS和EXECUTE的组合本应能够工作,但语法遗漏了它。确保行级安全策略表达式中的子
SELECT以正确用户的权限执行(Dean Rasheed)以前,如果通过视图访问带有 RLS 策略的表,此类检查可能以调用视图的用户身份执行,而非按预期以视图所有者的身份执行。
按照 SQL:2006 及后续标准的要求,当
xmloption设置为content时,接受 XML 文档作为xml类型的有效值(Chapman Flack)以前,PostgreSQL 遵循不允许这种用法的 SQL:2003 定义。但这给转储/恢复带来了严重问题:没有任何
xmloption设置能够接受所有有效的 XML 数据。因此,改为采用 2006 版的定义。同时修改了 pg_dump,使其在恢复数据时输出
SET xmloption = content,确保即使当前设置为document,转储/恢复也能正常工作。改进服务器在启动时对预先存在的共享内存段是否仍在使用的检查(Noah Misch)
即使
postmaster.pid文件已被删除,postmaster 现在也更有可能检测到上一次 postmaster 运行留下的活跃进程。避免将并行工作进程的事务计为独立事务(Haribabu Kommi)
修复 GIN 索引 WAL 记录的不兼容问题(Alexander Korotkov)
二月份小版本中应用的一项修复对向后兼容性考虑得不够周全。如果使用该小版本的备库读取由更早小版本的主库生成的 GIN 页面删除 WAL 记录,就会出现问题。
修复在复制连接中执行
SHOW命令时可能发生的崩溃(Michael Paquier)避免重建分区的关系缓存条目时发生内存泄漏(Amit Langote,Tom Lane)
在适当情况下,容忍
fsync和sync_file_range调用返回EINVAL和ENOSYS错误(Thomas Munro,James Sewell)此前将文件同步失败改为触发 panic 的做法,在某些失败可预见且实质上表示“操作不受支持”的情况下显得过于谨慎。
在 BRIN 汇总操作期间,在自动清理的
pg_stat_activity显示中报告正确的关系名(Álvaro Herrera)修复从
FULL外连接向外引用的横向引用导致的“failed to build anyN-way joins”规划器失败(Tom Lane)修复将返回集合的函数应用于可证明为空的关系时的查询规划错误(Tom Lane,Julien Rouhaud)
在 v10 中,这一疏漏仅导致计划效率略低,但在 v11 中可能引发“set-valued function called in context that cannot accept a set”错误。
执行有关是否允许可能泄漏信息的操作符访问
pg_statistic数据的规则时,检查正确用户的权限(Dean Rasheed)通过视图访问底层表时,在决定能否将可能泄漏信息的操作符应用于该表的统计数据时,应考虑视图所有者的权限,而非发出查询的用户的权限。这使规划器关于数据可见性的规则与执行器一致,避免不必要的低效计划。
在存在大量相等条件和大量可能相关的外键约束时,加快规划速度(David Rowley)
避免回滚创建了大量表的事务时发生 O(N^2) 性能问题(Tomas Vondra)
修复动态共享内存分配中边界情况下的服务器崩溃(Thomas Munro,Robert Haas)
修复动态共享内存管理中的竞争条件(Thomas Munro)
这些问题可能导致“dsa_area could not attach to segment”或“cannot unpin a segment that is not pinned”错误。
修复热备 postmaster 收到 smart 关闭请求后可能无法关闭的竞争条件(Tom Lane)
修复
pg_identify_object_as_address()收到无效输入时可能发生的崩溃(Álvaro Herrera)修复
txid_status()中可能发生的“could not access status of transaction”失败(Thomas Munro)加强对已编码的 SCRAM-SHA-256 和 MD5 密码的验证(Jonathan Katz)
只要密码字符串以相应字符开头,就可能被误认为已通过 hash 运算正确转换为 SCRAM-SHA-256 或 MD5 格式。这样的密码会被接受,但之后无法使用。
修复对隐含编码不同于数据库编码的
lc_time设置的处理(Juan José Santamaría Flecha,Tom Lane)在此类区域设置下,包含非 ASCII 字符的本地化月份名或星期名以前会导致意外错误或错误输出。
修复涉及一元负号操作符时不正确的
operator_precedence_warning检查(Rikard Falkeborn)禁止将
NaN用作浮点服务器参数的值(Tom Lane)重新安排
REINDEX的处理,以避免重建pg_class的单个索引时发生断言失败(Andres Freund,Tom Lane)修复参数化虚拟路径引发的规划器断言失败(Tom Lane)
在
SnapBuildInitialSnapshot()的结果中设置正确的测试函数(Antonin Houska)核心代码不依赖此项,但某些扩展会依赖。
修复 Windows 上间歇出现的“could not reattach to shared memory”会话启动失败(Noah Misch)
此前未识别出的一个失败来源,是为进程的默认线程池创建线程栈。现在安排在不同的内存区域分配此类栈。
修复 Windows 上目录扫描的错误检测(Konstantin Knizhnik)
缺少读取目录的权限等错误未被正确检测或报告;代码反而静默地表现得像目录为空一样。
修复 ecpg 中的语法问题(Tom Lane)
缺少分号导致 ecpg 程序中的
SET被错误转换(但variable= DEFAULTSET不受影响),产生服务器会拒绝的语法无效输出。此外,在列出多个类型名的variableTO DEFAULTDROP TYPE或DROP DOMAIN命令中,实际只处理了第一个类型名。使 ecpg 的
CREATE TABLE AS语法与服务器一致(Daisuke Higuchi)修复 ecpg 处理包含文件名时可能发生的缓冲区越界(Liu Huailing,Fei Wu)
使用远程分组或聚合的查询,其
SELECT列表项为非相关子查询、外层引用或参数符号时,避免contrib/postgres_fdw发生崩溃(Tom Lane)避免
lo_unlink()调用失败时contrib/vacuumlo发生崩溃(Tom Lane)将我们使用的时区库副本同步到 IANA tzcode 2019a 版(Tom Lane)
这修正了 zic 的一个小缺陷,它曾使
Africa/Casablanca时区在 2440 年输出不正确的转换时间;同时添加了对 zic 新选项-r的支持。将时区数据文件更新到 tzdata 2019a 版,以反映巴勒斯坦和梅特拉卡特拉的夏令时法规变更,并修正以色列的历史数据。
Etc/UCT现在是指向Etc/UTC的向后兼容链接,不再是一个会生成缩写UCT的独立时区;如今,该缩写通常是拼写错误。PostgreSQL 仍会接受UCT作为输入的时区缩写,但不会输出它。