发布日期:. 2016-08-11
这个版本包含各种自9.5.3以来的修复。 关于9.5主版本的新特性信息,请查看 第 E.20 节.
修复嵌套的CASE
-WHEN
表达式可能的错误估算 (Heikki
Linnakangas, Michael Paquier, Tom Lane)
出现在另一个CASE
的测试值子表达式中的CASE
表达式可能会困惑自己的测试值是否为空。此外,
CASE
表达式使用的实现等式运算符的SQL函数的内联,
可能会导致将错误的测试值传递给在SQL函数体内的CASE
表达式中调用的函数。如果测试值是不同的数据类型,可能会导致崩溃;
此外,这种情况可能被滥用以允许披露服务器存储器的一部分。 (CVE-2016-5423)
修复客户端程序在数据库和角色名称中对特殊字符的处理 (Noah Misch, Nathan Bossart, Michael Paquier)
vacuumdb 和其他客户端程序中的许多地方可能会被包含双引号或反斜杠的数据库和角色名称混淆。 加强引用规则以使其是安全的。此外,确保将conninfo字符串用作这些程序的数据库名称参数时, 它将被正确地对待。
修正在psql的\connect
和\password
命令中配对双引号的处理,以匹配文档。
在psql的\connect
命令中引入一个新的
-reuse-previous
选项,以允许显式控制是否重新使用先前连接的连接参数。
(没有这个选择是基于数据库名称是否像以前一样是conninfo字符串。)
这允许在pg_dumpall脚本中安全处理包含特殊字符的数据库名称。
pg_dumpall现在拒绝处理包含回车或换行的数据库或角色名, 因为在Windows上安全的引用这些字符似乎是不切实际的。 将来我们可能在服务器端拒绝这样的名称,但是现在还未采取这一步骤。
这些被认为是安全修复程序, 因为包含特殊字符的制作对象名称可能已被用于在下次超级用户执行 pg_dumpall或其他例行维护操作时执行具有超级用户权限的命令。 (CVE-2016-5424)
修复针对IS NULL
/IS NOT
NULL
应用于嵌套复合值的极端情况错误行为 (Andrew Gierth, Tom Lane)
SQL标准指定IS NULL
应该为所有空值的行返回TRUE(因此
ROW(NULL,NULL) IS NULL
产生TRUE),但这并不意味着应用递归
(因此ROW(NULL, ROW(NULL,NULL)) IS NULL
产生FALSE)。
内核执行器正确执行了,但某些计划器优化将测试视为递归
(因此在这两种情况下都会产生TRUE),并且contrib/postgres_fdw
可能会产生类似错误的远程查询。
修复递归CTE(一个WITH
条目)中INSERT ... ON
CONFLICT
的“未识别的节点类型”错误 (Peter
Geoghegan)
修复INSERT ... ON CONFLICT
,
以成功匹配在规划器的表达式预处理阶段简化了的索引表达式或索引谓词
(Tom Lane)
正确处理应用到INSERT ... ON CONFLICT
命令的目标表中的排除约束违反,
但不是选中的仲裁者索引之一 (Tom Lane)
这种情况应该引发一个正常的约束违反错误,但是它进入了一个无限循环。
修复INSERT ... ON CONFLICT
,
如果目标表在OID上有一个唯一约束时不要失败 (Tom Lane)
使inet
和cidr
数据类型正确拒绝具有太多冒号分隔字段的IPv6地址 (Tom Lane)
防止NaN输入坐标的close_ps()
中的崩溃
(point
##
lseg
操作符)
(Tom Lane)
使其返回NULL而不是崩溃。
避免在pg_get_expr()
中传递不一致的值时发生崩溃
(Michael Paquier, Thomas Munro)
修复to_number()
中的几个单字节缓冲区溢出
(Peter Eisentraut)
在某些情况下to_number()
函数将从输入字符串中多读取一个字符。
如果输入恰好与内存的结束相邻,那么会有可能崩溃。
当指定了WITH NO DATA
时,不要在包含在CREATE
MATERIALIZED VIEW
或CREATE TABLE AS
中的查询上运行规划器 (Michael Paquier,
Tom Lane)
这避免了一些不必要的失败条件,例如,如果物化视图调用的稳定函数依赖于尚不存在的表。
通过heap_update()
在昂贵的路径中避免不安全的中间状态
(Masahiko Sawada, Andres Freund)
以前,这些情况锁定了目标元组(通过设置其XMAX),但没有WAL-log这个操作, 因此如果页面溢出到磁盘,然后在元组更新完成之前发生数据库崩溃, 就会有数据完整性问题的风险。
在行锁定操作的WAL重放期间修正提示位更新 (Andres Freund)
这个问题的唯一已知后果是,由准备但未提交的事务持有的行锁在崩溃和重新启动后可能无法执行。
当在序列化模式中请求FOR KEY SHARE
行锁时,
避免不必要的“could not serialize access”错误
(Álvaro Herrera)
确保计划节点返回的“扩展”基准是只读的 (Tom Lane)
这在一些情况下避免了故障,其中在较高节点的多个地方引用较低计划节点的结果。 就核心PostgreSQL而言,只有PL/pgSQL函数返回的数组值有风险; 但扩展可能会使用扩展的基准来做其他事情。
当指定的变量具有空字符串值时,避免在postgres -C
中崩溃
(Michael Paquier)
防止在WALL发送者进程中意外等待接收者 (Kyotaro Horiguchi)
修复逻辑解码中可能的大量子事务丢失 (Petru-Florin Mihancea)
当子事务不包含实际修改时,修复逻辑解码失败 (Marko Tiikkaja, Andrew Gierth)
确保后端查看共享目录的最新统计信息 (Tom Lane)
在普通后端的请求后,统计信息收集器无法更新共享目录的统计信息文件。 这个问题被部分掩盖了,因为自动清理启动器定期发出导致这种更新的请求; 然而,禁用自动清理后变得明显。
当多个后端请求更新时,请避免对统计文件进行冗余写入 (Tom Lane, Tomas Vondra)
避免在VACUUM
期间使用事务ID
(Alexander Korotkov)
VACUUM
中的某些情况不必要地导致将XID分配给当前事务。
通常这是可以忽略不计的,但如果是针对XID环绕限制,
在反包装清理中消耗更多的XID是一件非常糟糕的事情。
在从9.3之前pg_upgrade的安装中清理多重ID时,防止可能的失败 (Andrew Gierth,Álvaro Herrera)
这个bug的常见情况是像“MultiXactId NNN
has not been created
yet -- apparent wraparound”这样的错误。
当手动ANALYZE
指定列列表时,请不要重置表的
changes_since_analyze
计数器 (Tom Lane)
如果我们只是分析一些列,我们不应该阻止对其他列的日常自动分析。
修复ANALYZE
对具有许多空条目的唯一或几乎唯一的列进行过高估计
n_distinct
(Tom Lane)
空值可以被计数就像它们本身是不同的值,导致在某些类型的查询中严重的规划器错误估计。
防止autovacuum启动为同一个共享目录的多个工作进程 (Álvaro Herrera)
通常这不是很大的问题,因为清理不需要很长时间;但是在目录严重膨胀的情况下, 除了一个工作进程外,所有工作进程都将无用地等待,而不是在其他表格上进行有用的工作。
修复b-tree标记/恢复处理中的错误 (Kevin Grittner)
这个错误会导致内部源节点是b-tree索引扫描的合并连接中不正确的连接结果或断言失败。
在放弃b-tree索引页删除尝试时避免重复的缓冲区锁释放 (Tom Lane)
在某些情况下,包括损坏的b-tree索引,这种错误阻止了VACUUM
完成。
修复大的(大于shared_buffers
)哈希索引的建立 (Tom Lane)
用于大索引的代码路径包含一个错误,导致不正确的哈希值插入到索引中, 因此后续索引搜索总是失败,除了在初始构建后插入到索引中的元组。
阻止GiST索引构建中包含NaN组件值的几何列的无限循环 (Tom Lane)
修复在interval
列上的contrib/btree_gist
索引的最近邻(ORDER BY
距离)索引扫描期间可能的崩溃
(Peter Geoghegan)
修复尝试更新BRIN索引项时“PANIC: failed to add BRIN tuple” 错误 (Álvaro Herrera)
修复后台工作进程关闭时的可能崩溃 (Dmitry Ivanov)
修复PL/pgSQL对IMPORT FOREIGN SCHEMA
命令中
INTO
子句的处理 (Tom Lane)
修复contrib/btree_gin
,以正确处理最小可能的
bigint
值 (Peter Eisentraut)
教会libpq正确解码未来服务器的服务器版本 (Peter Eisentraut)
计划在9.6之后的版本切换到两部分而不是三部分服务器版本号。确保
PQserverVersion()
为这种情况返回正确的值。
修复ecpg为unsigned long long
数组元素的编码 (Michael Meskes)
在同时具有-c
和-C
选项的pg_dump中,
避免发出不需要的CREATE SCHEMA public
命令 (David Johnston, Tom Lane)
改进并行pg_dump和pg_restore 中SIGTERM/control-C的处理 (Tom Lane)
确保工作进程将立即退出,并且还安排向所连接的后端发送查询取消请求,
以防万一他们正在进行长时间的运行,例如CREATE INDEX
。
修复并行pg_dump和pg_restore 中的错误报告 (Tom Lane)
以前,pg_dump或pg_restore
工作进程报告的错误可能永远不会发送给用户的控制台,因为消息通过主进程,
并且有各种死锁情况会阻止主进程传递消息。相反,只需打印一切到
stderr
。在某些情况下,这将导致重复的消息(例如,
如果所有的工作进程都报告服务器关闭),但这似乎比没有消息更好。
确保Windows上并行的pg_dump或 pg_restore在错误后正确关闭 (Kyotaro Horiguchi)
以前,它会报告错误,但是之后会等待直到用户手动停止。
当在备用服务器运行时,使并行pg_dump干净的失败 (Magnus Hagander)
除非指定了--no-synchronized-snapshots
,否则不支持此用法,
但错误的处理不是很好。
在不使用zlib支持的情况下,使pg_dump的行为更好 (Kyotaro Horiguchi)
它并不适用于并行转储,并在其他情况下发出了一些相当无意义的警告。
让pg_basebackup接受-Z 0
指定不压缩 (Fujii Masao)
修复用于构建AIX共享库的makefile文件规则对于并行make是安全的 (Noah Misch)
修复TAP测试和MSVC脚本使其在构建目录的路径名中包含空格时可以运行 (Michael Paquier, Kyotaro Horiguchi)
针对“锁定超时”报告“语句超时” 更加可预测 (Tom Lane)
在负载较重的机器上,即使应该已经先发生了语句超时, 因为报告“锁定超时”,回归测试有时也会失败。
使回归测试对丹麦和威尔士环境是安全的 (Jeff Janes, Tom Lane)
更改一些触发这些区域设置的异常排序规则的测试数据。
更新或拷贝时区代码以匹配IANA的tzcode版本2016c (Tom Lane)
这需要应对时区数据文件中预期的未来变化。它还修复了一些处理异常时区的角落错误。
将时区数据文件更新为Kemerovo和新西伯利亚的DST法律变更的 tzdata版本2016f,以及阿塞拜疆、白俄罗斯和摩洛哥的历史更正。