如何跳过惰性 evaluation/compiler 优化以防止 Snowflake 中的隐藏错误

How to skip lazy evaluation/compiler optimizations to prevent hidden errors in Snowflake

运行 Snowflake 中的以下查询显然会产生 Division by zero 错误:

SELECT 1 / 0;

但是,某些派生查询并不总是会产生错误。例如,这个查询只是 returns 1:

SELECT COUNT(*)
FROM (SELECT 1 / 0);

我知道这是由于惰性求值或 Snowflake 中的一些其他编译器优化所致。永远不会执行除法,因为 Snowflake 已经知道最终输出(行数)。

然而,在实际用例中,这可以有效地隐藏错误——例如 when running data tests with DBT(因为 DBT 执行器自动用 SELECT COUNT(*) FROM (...).

包装测试查询

我可以强制 Snowflake 执行查询的每个部分,或者以某种方式跳过惰性 evaluation/compiler 优化吗?

编辑: 除以零只是一个简化的例子。还有许多其他事情可能会导致错误——有时是明确的,例如 .

好吧,事实证明解决方案非常简单!只需添加针对所需部分的条件语句,Snowflake 将强制执行该部分以评估条件。

例如,此查询将再次产生 Division by zero 错误:

SELECT COUNT(*)
FROM (
  SELECT (1 / 0) AS n
  WHERE n IS NOT NULL
);