pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
某些安装正确且功能完备的PostgreSQL实例, 可能会因为平台特有因素而在部分回归测试中“失败”,例如浮点 表示或消息措辞不同。目前这些测试是通过把输出与参考系统生成的输出做 简单的diff比较来评估的,因此结果会对细微的系统差异 很敏感。报告某项测试“失败”时,请务必检查预期结果与实际结果 之间的差异;你可能会发现这些差异并不重要。尽管如此,我们仍努力在所有 受支持平台上维护准确的参考文件,因此原则上应期待所有测试都能通过。
回归测试的实际输出位于src/test/regress/results目录中的文件里。测试脚本使用diff把每个输出文件与存储在src/test/regress/expected目录中的参考输出进行比较。任何差异都会保存到src/test/regress/regression.diffs中供你检查。(如果愿意,也可以自己运行diff。)
如果由于某种原因,某个特定平台在某个测试上产生了“失败”, 但对输出的检查令你相信结果是有效的,那么可以新增一个比较文件,让后续 测试运行不再报告该失败。详情见第 30.3 节。
某些回归测试包含故意构造的非法输入值。错误消息可能来自 PostgreSQL代码,也可能来自宿主平台的系统例程。 在后一种情况下,消息会因平台而异,但应反映相近的信息。这类消息差异 会导致回归测试显示为“失败”,但可以通过检查确认其有效性。
如果你针对一个使用 C 以外排序规则顺序的区域设置初始化的服务器运行测试, 就可能因为排序顺序不同而出现差异,并导致后续失败。回归测试套件通过 提供备用结果文件来处理这个问题;这些文件已知可以覆盖大量区域设置。
使用临时安装方法时,若要在其他区域下运行测试,请在make命令行上传入适当的区域相关环境变量,例如:
gmake check LANG=de_DE.utf8
(回归测试驱动程序会取消LC_ALL的设置,因此用该变量选择区域是无效的。)要不使用区域,可以取消所有区域相关环境变量的设置(或把它们设为C),或者使用下面的特殊调用方式:
gmake check NO_LOCALE=1
针对已有安装运行测试时,区域设置由该已有安装决定。要更改它,请通过向initdb传入适当的选项,用不同的区域初始化数据库集簇。
一般而言,仍然建议尽量在生产环境将要使用的区域设置下运行回归测试,因为这会实际锻炼生产环境中将会用到的区域和编码相关代码部分。根据操作系统环境的不同,可能会出现失败,但这样你至少能了解运行真实应用时应预期哪些区域特定的行为。
大多数日期和时间结果依赖于时区环境。参考文件是在时区 PST8PDT(加利福尼亚州伯克利)下生成的,如果测试未在该时区设置 下运行,就会出现表面上的失败。回归测试驱动器会将环境变量 PGTZ设为PST8PDT, 这通常能够确保获得正确结果。
某些测试涉及从表列计算 64 位浮点数(double precision)。已经观察到涉及double precision列数学函数的结果存在差异。float8和geometry测试尤其容易在不同平台之间、甚至在不同编译器优化设置下出现微小差异。需要人工目测比较来确定这些差异的真实意义,它们通常出现在小数点右侧第 10 位。
某些系统把负零显示为-0,而另一些只显示 0。
某些系统对pow()和exp() 发出错误的方式,与当前PostgreSQL代码所 预期的机制不同。
你可能会看到这样的差异:同样的行在输出中的顺序与预期文件中的顺序不同。 在大多数情况下,严格说来这并不是缺陷。大多数回归测试脚本并没有细致到 为每一个SELECT都使用ORDER BY, 因此按 SQL 规范,它们的结果行顺序并没有良好定义。实际上,由于我们看到的 是同一软件在同一数据上执行相同查询,通常在所有平台上都会得到相同的结果 顺序,所以缺少ORDER BY并不是问题。不过,有些查询 确实会表现出跨平台的顺序差异。针对已安装服务器测试时,非 C 区域设置或 非默认参数设置,例如自定义的work_mem值或规划器代价 参数,也可能导致顺序差异。
因此,如果你看到顺序差异,一般无需担心,除非查询确实包含 ORDER BY而你的结果违反了它。不过,仍请报告该问题, 这样我们可以为那个特定查询加上ORDER BY,以在后续 版本中消除这种虚假的“失败”。
你可能会好奇,为什么我们不显式地为所有回归测试查询排序,从而一劳永逸地 解决这个问题。原因在于,那样反而会降低回归测试的价值,因为测试会倾向于 覆盖能产生有序结果的查询计划类型,而排除那些不能产生有序结果的计划类型。
如果errors测试在select infinite_recurse()命令处导致服务器崩溃,说明该平台的进程栈大小限制小于max_stack_depth参数所指示的值。这可以通过在更高的栈大小限制下运行服务器来解决(在使用默认的max_stack_depth值时建议 4MB)。如果无法做到,另一种办法是减小max_stack_depth的值。
random测试脚本旨在产生随机结果。在少数情况下,这会导致随机回归测试失败。输入:
diff results/random.out expected/random.out
应该只产生一行或几行差异。除非随机测试反复失败,否则不必担心。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。