E.12. 版本 9.3.14 #
发行日期:. 2016-08-11
本次发布包含对 9.3.13 的多方面修复。有关 9.3 大版本中新特性的信息,请参见第 E.26 节。.
E.12.2. 变更
修复嵌套
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可能产生类似错误行为的远程查询。使
inet和cidr数据类型正确拒绝包含过多冒号分隔字段的 IPv6 地址(Tom Lane)防止
close_ps()(point##lseg操作符)在输入坐标为 NaN 时崩溃(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,因此如果页面被刷出到磁盘,随后在元组更新完成之前发生数据库崩溃,就有数据完整性问题的风险。
修复行锁定操作 WAL 重放期间的提示位更新(Andres Freund)
此问题唯一已知的后果是,已预备但未提交的事务所持有的行锁,在崩溃并重启之后可能无法被执行。
避免在可串行化模式下获取
FOR KEY SHARE行锁时出现不必要的“could not serialize access”错误([Aacute]lvaro Herrera)避免当指定变量的字符串值为空时
postgres -C崩溃(Michael Paquier)确保后端能看到共享目录的最新统计信息(Tom Lane)
统计收集器在普通后端发出请求后,未能更新共享目录的统计文件。这个问题被部分掩盖了,因为自动清理启动器会定期发出确实触发此类更新的请求;但在禁用自动清理时就变得明显了。
当多个后端相继请求更新时,避免统计文件的冗余写入(Tom Lane、Tomas Vondra)
避免在
VACUUM期间消耗事务 ID(Alexander Korotkov)VACUUM中的某些情况会不必要地导致向当前事务分配 XID。通常这可以忽略不计,但如果已接近 XID 回卷限制,在防回卷清理期间消耗更多 XID 就非常糟糕了。避免在
VACUUM FREEZE期间取消热备查询(Simon Riggs, [Aacute]lvaro Herrera)在原本空闲的主库服务器上执行
VACUUM FREEZE可能导致其备库服务器上的查询被不必要地取消。防止在从 9.3 之前版本 pg_upgrade 而来的安装中清理多事务 ID 时可能出现的失败(Andrew Gierth、[Aacute]lvaro Herrera)
此 bug 的常见症状是类似“MultiXactId
NNNhas not been created yet -- apparent wraparound”的错误。当手动
ANALYZE指定列列表时,不要重置表的changes_since_analyze计数器(Tom Lane)如果只分析部分列,就不应阻止其他列的例行自动分析。
修复
ANALYZE对包含大量空值的唯一或近似唯一列的n_distinct高估(Tom Lane)空值可能被当作它们本身就是不同的值来计数,导致某些类型查询中规划器的严重误估。
防止自动清理为同一共享目录启动多个工作进程([Aacute]lvaro Herrera)
通常这不是什么大问题,因为清理本来就不会花很长时间;但在目录严重膨胀的情况下,这可能导致除一个工作进程外的所有工作进程都在无用地等待,而不是对其他表做有用的工作。
防止对包含 NaN 分量值的几何列构建 GiST 索引时出现无限循环(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/Ctrl-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 在构建时未包含 zlib 支持时表现更好(Kyotaro Horiguchi)
它在并行转储时不能正确工作,在其他情况下还会发出一些相当无意义的警告。
使 pg_basebackup 接受
-Z 0表示不压缩(Fujii Masao)修复构建 AIX 共享库的 makefile 规则,使其在并行 make 下安全(Noah Misch)
修复 TAP 测试和 MSVC 脚本,使其在构建目录路径名包含空格时也能工作(Michael Paquier、Kyotaro Horiguchi)
使“statement timeout”与“lock timeout”的报告更具可预测性(Tom Lane)
在高负载机器上,回归测试有时会因报告“lock timeout”而失败,尽管语句超时本应先发生。
使回归测试在丹麦语和威尔士语区域设置下安全(Jeff Janes、Tom Lane)
修改了一些会触发这些区域设置特殊排序规则的测试数据。
更新我们的时区代码副本,以匹配 IANA 的 tzcode 2016c 版(Tom Lane)
这是为了应对时区数据文件未来预期的变更。它还修复了处理特殊时区方面的一些边界 bug。
把时区数据文件更新到 tzdata 2016f 版,涉及克麦罗沃和新西伯利亚的夏令时法规变更,以及阿塞拜疆、白俄罗斯和摩洛哥的历史数据修正。