如何跳过惰性 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
);
运行 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
);