From b6ca8bb2f412f4cfb929f31cb2065bed63e0bb22 Mon Sep 17 00:00:00 2001 From: Matthew McKnight <91097623+McKnight-42@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:43:00 -0500 Subject: [PATCH] quoting config not working with 1.8 (#1075) * revert change for quoting policy issue * make revet in both places * update format to ignore identifier name * update test to use SnowflakeRelation and render out the schema_relation, update macros to have condtion to check based on type * remove unneeded comments from updating test * add test based on quoting schema names * update name to more generic my_model (cherry picked from commit 57285d57d910b965dc0c769398d1c83e0f537bcc) --- .../unreleased/Fixes-20240607-102708.yaml | 6 +++++ dbt/include/snowflake/macros/adapters.sql | 27 +++++++++++++------ .../list_relations_tests/test_pagination.py | 16 +++++------ .../test_special_characters.py | 25 +++++++++++++++++ 4 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 .changes/unreleased/Fixes-20240607-102708.yaml create mode 100644 tests/functional/adapter/list_relations_tests/test_special_characters.py diff --git a/.changes/unreleased/Fixes-20240607-102708.yaml b/.changes/unreleased/Fixes-20240607-102708.yaml new file mode 100644 index 000000000..58cd9bbee --- /dev/null +++ b/.changes/unreleased/Fixes-20240607-102708.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: return to previous naming convention to return to quoting policy +time: 2024-06-07T10:27:08.542159-05:00 +custom: + Author: McKnight-42 + Issue: "1074" diff --git a/dbt/include/snowflake/macros/adapters.sql b/dbt/include/snowflake/macros/adapters.sql index 0bf7b7d1b..6e7ea8f6c 100644 --- a/dbt/include/snowflake/macros/adapters.sql +++ b/dbt/include/snowflake/macros/adapters.sql @@ -72,9 +72,15 @@ {% for _ in range(0, max_iter) %} - {%- set paginated_sql -%} - show objects in {{ schema_relation.database }}.{{ schema_relation.schema }} limit {{ max_results_per_iter }} from '{{ watermark.table_name }}' - {%- endset -%} + {% if schema_relation is string %} + {%- set paginated_sql -%} + show objects in {{ schema_relation }} limit {{ max_results_per_iter }} from '{{ watermark.table_name }}' + {%- endset -%} + {% else %} + {%- set paginated_sql -%} + show objects in {{ schema_relation.include(identifier=False) }} limit {{ max_results_per_iter }} from '{{ watermark.table_name }}' + {%- endset -%} + {% endif -%} {%- set paginated_result = run_query(paginated_sql) %} {%- set paginated_n = (paginated_result | length) -%} @@ -96,7 +102,7 @@ {%- if loop.index == max_iter -%} {%- set msg -%} - dbt will list a maximum of {{ max_total_results }} objects in schema {{ schema_relation.database }}.{{ schema_relation.schema }}. + dbt will list a maximum of {{ max_total_results }} objects in schema {{ schema_relation }}. Your schema exceeds this limit. Please contact support@getdbt.com for troubleshooting tips, or review and reduce the number of objects contained. {%- endset -%} @@ -122,10 +128,15 @@ {% macro snowflake__list_relations_without_caching(schema_relation, max_iter=10, max_results_per_iter=10000) %} {%- set max_total_results = max_results_per_iter * max_iter -%} - - {%- set sql -%} - show objects in {{ schema_relation.database }}.{{ schema_relation.schema }} limit {{ max_results_per_iter }} - {%- endset -%} + {% if schema_relation is string %} + {%- set sql -%} + show objects in {{ schema_relation }} limit {{ max_results_per_iter }} + {%- endset -%} + {% else %} + {%- set sql -%} + show objects in {{ schema_relation.include(identifier=False) }} limit {{ max_results_per_iter }} + {%- endset -%} + {% endif -%} {%- set result = run_query(sql) -%} diff --git a/tests/functional/adapter/list_relations_tests/test_pagination.py b/tests/functional/adapter/list_relations_tests/test_pagination.py index 8f14a0012..407f9c501 100644 --- a/tests/functional/adapter/list_relations_tests/test_pagination.py +++ b/tests/functional/adapter/list_relations_tests/test_pagination.py @@ -1,9 +1,8 @@ import os - import pytest - import json from dbt.tests.util import run_dbt, run_dbt_and_capture +from dbt.adapters.snowflake import SnowflakeRelation # Ensure this is the correct import path # Testing rationale: # - snowflake SHOW TERSE OBJECTS command returns at max 10K objects in a single call @@ -122,8 +121,8 @@ def test__snowflake__list_relations_without_caching_termination(self, project): schemas = project.created_schemas for schema in schemas: - schema_relation = {"database": database, "schema": schema} - kwargs = {"schema_relation": schema_relation} + schema_relation = SnowflakeRelation.create(database=database, schema=schema) + kwargs = {"schema_relation": schema_relation.render()} _, log_output = run_dbt_and_capture( [ "--debug", @@ -137,7 +136,6 @@ def test__snowflake__list_relations_without_caching_termination(self, project): parsed_logs = parse_json_logs(log_output) n_relations = find_result_in_parsed_logs(parsed_logs, "n_relations") - assert n_relations == "n_relations: 1" @@ -171,8 +169,8 @@ def test__snowflake__list_relations_without_caching(self, project): schemas = project.created_schemas for schema in schemas: - schema_relation = {"database": database, "schema": schema} - kwargs = {"schema_relation": schema_relation} + schema_relation = SnowflakeRelation.create(database=database, schema=schema) + kwargs = {"schema_relation": schema_relation.render()} _, log_output = run_dbt_and_capture( [ "--debug", @@ -199,9 +197,9 @@ def test__snowflake__list_relations_without_caching_raise_error(self, project): schemas = project.created_schemas for schema in schemas: - schema_relation = {"database": database, "schema": schema} + schema_relation = SnowflakeRelation.create(database=database, schema=schema) - kwargs = {"schema_relation": schema_relation} + kwargs = {"schema_relation": schema_relation.render()} _, log_output = run_dbt_and_capture( [ "--debug", diff --git a/tests/functional/adapter/list_relations_tests/test_special_characters.py b/tests/functional/adapter/list_relations_tests/test_special_characters.py new file mode 100644 index 000000000..4dce56da9 --- /dev/null +++ b/tests/functional/adapter/list_relations_tests/test_special_characters.py @@ -0,0 +1,25 @@ +import pytest +from dbt.tests.util import run_dbt + + +TABLE_BASE_SQL = """ +-- models/my_model.sql +{{ config(schema = '1_contains_special*character$') }} +select 1 as id +""" + + +class TestSpecialCharactersInSchema: + + @pytest.fixture(scope="class") + def project_config_update(self): + return {"quoting": {"schema": True}} + + @pytest.fixture(scope="class") + def models(self): + return { + "my_model.sql": TABLE_BASE_SQL, + } + + def test_schema_with_special_chars(self, project): + run_dbt(["run", "-s", "my_model"])