diff --git a/integration_tests/data/sql/data_get_column_values_dropped.csv b/integration_tests/data/sql/data_get_column_values_dropped.csv new file mode 100644 index 00000000..5651149b --- /dev/null +++ b/integration_tests/data/sql/data_get_column_values_dropped.csv @@ -0,0 +1,12 @@ +field +a +b +c +d +e +f +g +g +g +g +g diff --git a/integration_tests/dbt_project.yml b/integration_tests/dbt_project.yml index 40db9050..9631a8c4 100644 --- a/integration_tests/dbt_project.yml +++ b/integration_tests/dbt_project.yml @@ -54,6 +54,12 @@ seeds: sql: data_events_20180103: +schema: events + + data_get_column_values_dropped: + # TODO: Ideally this would use the adapter, but it gives a "Tried to drop relation, but its type is null" error. + #+post-hook: "{% do adapter.drop_relation(this) %}" + +post-hook: "drop table {{ this }}" + schema_tests: data_test_sequential_timestamps: diff --git a/integration_tests/tests/sql/test_get_column_values_use_default.sql b/integration_tests/tests/sql/test_get_column_values_use_default.sql new file mode 100644 index 00000000..6b7569f5 --- /dev/null +++ b/integration_tests/tests/sql/test_get_column_values_use_default.sql @@ -0,0 +1,25 @@ + +{% set column_values = dbt_utils.get_column_values(ref('data_get_column_values_dropped'), 'field', default=['y', 'z'], order_by="field") %} + +with expected as ( + select { dbt_utils.safe_cast('y', dbt_utils.type_string()) }} as expected union all + select { dbt_utils.safe_cast('z', dbt_utils.type_string()) }} as expected +), + +actual as ( + select + {% for val in column_values %} + {{ dbt_utils.safe_cast(val, dbt_utils.type_string()) }} as 'actual' + {% if not loop.last %} + union all + {% endif %} + {% endfor %} +), + +failures as ( + select * from actual + except + select * from expected +) + +select * from failures \ No newline at end of file diff --git a/macros/sql/get_column_values.sql b/macros/sql/get_column_values.sql index c2f65aff..61b6bece 100644 --- a/macros/sql/get_column_values.sql +++ b/macros/sql/get_column_values.sql @@ -13,15 +13,18 @@ {# TODO: Change the method signature in a future 0.x.0 release #} {%- set target_relation = table -%} + {# adapter.load_relation is a convenience wrapper to avoid building a Relation when we already have one #} + {% set relation_exists = (load_relation(target_relation)) is not none %} + {%- call statement('get_column_values', fetch_result=true) %} - {%- if not target_relation and default is none -%} + {%- if not relation_exists and default is none -%} - {{ exceptions.raise_compiler_error("In get_column_values(): relation " ~ table ~ " does not exist and no default value was provided.") }} + {{ exceptions.raise_compiler_error("In get_column_values(): relation " ~ target_relation ~ " does not exist and no default value was provided.") }} - {%- elif not target_relation and default is not none -%} + {%- elif not relation_exists and default is not none -%} - {{ log("Relation " ~ table ~ " does not exist. Returning the default value: " ~ default) }} + {{ log("Relation " ~ target_relation ~ " does not exist. Returning the default value: " ~ default) }} {{ return(default) }}