发布日期:. 2019-05-09
本次发布包含来自 11.2 的多项修复。 有关 11 主版本新特性的说明,请参见 Section E.23.
防止通过选择率估计器绕过行级安全策略(Dean Rasheed)
规划器的某些选择率估计器会将用户定义的操作符应用于 pg_statistic 中的值(例如最常见值)。因此,即使调用用户无权读取某列,可能泄露信息的操作符仍能披露该列中的一些项。在 CVE-2017-7484 中,我们增加了限制来防止这种情况,但没有考虑行级安全的影响。某个用户虽然具有读取某列的 SQL 权限,却因 RLS 策略而无法查看某些行,仍可能通过此类操作符获知这些行的部分内容。本补丁进一步收紧了规则,仅在没有相关 RLS 策略时,才允许将可能泄露信息的操作符应用于统计数据。(CVE-2019-10130)
避免报告分区路由错误时访问已释放的内存(Michael Paquier)
这一错误可能导致崩溃,而且原则上可能被用于泄露服务器内存内容。(CVE-2019-10129)
避免对分区表执行 ALTER TABLE 时,发现分区索引可复用而导致目录损坏(Amit Langote,Tom Lane)
例如,当 ALTER COLUMN TYPE 发现不需要物理重写表时,就会发生这种情况。
避免在单语句事务中创建带有 ON COMMIT DROP 和标识列的临时表时发生目录损坏(Peter Eisentraut)
这一隐患被忽略了,因为这种用法实际上没有意义:临时表创建后立即就会被删除。
修复分区表包含的已删除列多于其分区时,ALTER INDEX ... ATTACH PARTITION 发生的失败(Álvaro Herrera)
修复某些情况下未能将分区的现有索引附加到新建分区索引的问题(Amit Langote,Álvaro Herrera)
这会导致后续使用该分区索引的 DDL 出现 “index ... not found in partition” 等错误。
避免对分区查询结果关系执行 EPQ 复检时发生崩溃(Amit Langote)
当使用 READ COMMITTED 隔离级别,且其他会话并发更新了某些目标行时,就会发生这种情况。
修复具有已删除属性的多级分区表中的元组路由(Amit Langote,Michael Paquier)
修复对分区表采用外键约束初始验证的慢速路径时发生的失败(Hadi Moshayedi,Tom Lane,Andres Freund)
只有在无法使用快速路径的少见情况下(例如权限问题),此问题才会显现。
修复对继承树或分区表执行 UPDATE 或 DELETE 时,每个表都可被排除的情况下的行为(Amit Langote,Tom Lane)
在这种情况下,如果存在 RETURNING 子句,查询未报告正确的输出列集合;如果存在应当触发的语句级触发器,也未触发它们。
直接访问分区且 constraint_exclusion 设置为 on 时,将分区自身的分区约束与所有 CHECK 约束一起用于排除检查(Amit Langote,Tom Lane)
此更改恢复了 v10 中的行为。
避免尝试跨事务提交保存游标查询时发生错误而导致服务器崩溃(Tom Lane)
如果过程在具有已打开的显式或隐式游标(例如 PL/pgSQL FOR 循环查询)时尝试提交,就必须先将游标执行完毕并保存其结果,然后才能提交事务。此类执行期间发生错误曾会导致崩溃。
避免存在 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 运行留下的活跃进程。
避免 B-树索引清理逻辑中可能发生的除以零(Piotr Stefaniak,Alexander Korotkov)
这可能导致对是否需要索引清理作出错误判断。
避免将并行工作进程的事务计为独立事务(Haribabu Kommi)
修复 GIN 索引 WAL 记录的不兼容问题(Alexander Korotkov)
二月份小版本中应用的一项修复对向后兼容性考虑得不够周全。如果使用该小版本的备库读取由更早小版本的主库生成的 GIN 页面删除 WAL 记录,就会出现问题。
修复在复制连接中执行 SHOW 命令时可能发生的崩溃(Michael Paquier)
避免从 portal 中逐行获取数据时发生服务器内存泄漏(Tom Lane)
避免重建分区的关系缓存条目时发生内存泄漏(Amit Langote,Tom Lane)
在适当情况下,容忍 fsync 和 sync_file_range 调用返回 EINVAL 和 ENOSYS 错误(Thomas Munro,James Sewell)
此前将文件同步失败改为触发 panic 的做法,在某些失败可预见且实质上表示“操作不受支持”的情况下显得过于谨慎。
在 BRIN 汇总操作期间,在自动清理的 pg_stat_activity 显示中报告正确的关系名(Álvaro Herrera)
避免启用 GEQO 时尝试规划逐分区连接而发生崩溃(Tom Lane)
修复从 FULL 外连接向外引用的横向引用导致的 “failed to build any N-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)
通过视图访问底层表时,在决定能否将可能泄漏信息的操作符应用于该表的统计数据时,应考虑视图所有者的权限,而非发出查询的用户的权限。这使规划器关于数据可见性的规则与执行器一致,避免不必要的低效计划。
修复规划器对分组查询的并行安全性评估(Etsuro Fujita)
以前,可以并行执行的目标列表求值工作可能未得到并行执行。
修复规划器的唯一索引逻辑中对“包含”索引列的不正确处理(Tom Lane)
这可能导致无法识别带有包含列的唯一索引能够证明查询结果唯一,从而产生低效计划。
修复对数组强制转换表达式的不正确严格性检查(Tom Lane)
例如,这可能允许错误地内联严格 SQL 函数,导致未实施严格性条件。
在存在大量相等条件和大量可能相关的外键约束时,加快规划速度(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)
修复混用不同 OpenSSL 库版本时尝试使用 SCRAM 认证所导致的认证失败(Michael Paquier,Peter Eisentraut)
如果 libpq 使用 OpenSSL 1.0.1 或更旧版本,而服务器使用 OpenSSL 1.0.2 或更新版本,则协商所用 SASL 机制的过程会出错,导致令人困惑的 “channel binding not supported by this build” 错误消息。
加强对已编码的 SCRAM-SHA-256 和 MD5 密码的验证(Jonathan Katz)
只要密码字符串以相应字符开头,就可能被误认为已正确哈希为 SCRAM-SHA-256 或 MD5 格式。这样的密码会被接受,但之后无法使用。
修复对隐含编码不同于数据库编码的 lc_time 设置的处理(Juan José Santamaría Flecha,Tom Lane)
在此类区域设置下,包含非 ASCII 字符的本地化月份名或星期名以前会导致意外错误或错误输出。
以与服务器数据目录中其他文件相同的权限创建 current_logfiles 文件(Haribabu Kommi)
以前,它使用 log_file_mode 指定的权限,但这可能给备份工具带来问题。
修复涉及一元负号操作符时不正确的 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 不受影响),产生服务器会拒绝的语法无效输出。此外,在列出多个类型名的 variable TO DEFAULTDROP TYPE 或 DROP DOMAIN 命令中,实际只处理了第一个类型名。
使 ecpg 的 CREATE TABLE AS 语法与服务器一致(Daisuke Higuchi)
修复 ecpg 处理包含文件名时可能发生的缓冲区越界(Liu Huailing,Fei Wu)
修复未能移除目标数据目录中某些短暂文件而导致的 pg_rewind 失败(Michael Paquier)
让 pg_verify_checksums 验证其指定的数据目录属于正确的 PostgreSQL 版本(Michael Paquier)
使用远程分组或聚合的查询,其 SELECT 列表项为非相关子查询、外层引用或参数符号时,避免 contrib/postgres_fdw 发生崩溃(Tom Lane)
更改 contrib/postgres_fdw:如果被选为路由行插入目标的远程分区,同时也是同一命令中稍后将更新的 UPDATE 子计划目标,则报告错误(Amit Langote,Etsuro Fujita)
以前,此类情况会导致服务器崩溃或 UPDATE 结果不正确。让这些情况能够正确工作,留待未来处理。
在 contrib/pg_prewarm 中,如果预热因某种原因失败,则避免无限地重新启动后台工作进程(Mithun Cy)
避免 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 作为输入的时区缩写,但不会输出它。