Skip to content

Commit

Permalink
Merge branch 'main' into catalog_enable_stats
Browse files Browse the repository at this point in the history
  • Loading branch information
colin-rogers-dbt authored Jun 7, 2024
2 parents f76e29b + 57285d5 commit 4f5336f
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 35 deletions.
6 changes: 6 additions & 0 deletions .changes/unreleased/Features-20240604-154856.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Features
body: Replace underscores with hyphens in account IDs to prevent SSL issues
time: 2024-06-04T15:48:56.845374-07:00
custom:
Author: colin-rogers-dbt
Issue: "1068"
6 changes: 6 additions & 0 deletions .changes/unreleased/Fixes-20240607-102708.yaml
Original file line number Diff line number Diff line change
@@ -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"
1 change: 1 addition & 0 deletions dbt/adapters/snowflake/connections.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ def __post_init__(self):
base_msg="Authenticator is not set to oauth, but an oauth-only parameter is set! Did you mean to set authenticator: oauth?"
)
)
self.account = self.account.replace("_", "-")

@property
def type(self):
Expand Down
27 changes: 19 additions & 8 deletions dbt/include/snowflake/macros/adapters.sql
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,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) -%}
Expand All @@ -105,7 +111,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 -%}
Expand All @@ -131,10 +137,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) -%}

Expand Down
16 changes: 7 additions & 9 deletions tests/functional/adapter/list_relations_tests/test_pagination.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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",
Expand All @@ -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"


Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand Down
Original file line number Diff line number Diff line change
@@ -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"])
13 changes: 13 additions & 0 deletions tests/unit/test_connections.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,16 @@ def test_connections_does_not_set_logs_in_response_to_env_var(monkeypatch):

assert log_mock.debug.call_count == 0
assert log_mock.set_adapter_dependency_log_level.call_count == 0


def test_connnections_credentials_replaces_underscores_with_hyphens():
credentials = {
"account": "account_id_with_underscores",
"user": "user",
"password": "password",
"database": "database",
"warehouse": "warehouse",
"schema": "schema",
}
creds = connections.SnowflakeCredentials(**credentials)
assert creds.account == "account-id-with-underscores"
36 changes: 18 additions & 18 deletions tests/unit/test_snowflake_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ def test_client_session_keep_alive_false_by_default(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand All @@ -305,7 +305,7 @@ def test_client_session_keep_alive_true(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=True,
database="test_database",
Expand All @@ -332,7 +332,7 @@ def test_client_has_query_tag(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -366,7 +366,7 @@ def test_user_pass_authentication(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -397,7 +397,7 @@ def test_authenticator_user_pass_authentication(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -428,7 +428,7 @@ def test_authenticator_externalbrowser_authentication(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -461,7 +461,7 @@ def test_authenticator_oauth_authentication(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -499,7 +499,7 @@ def test_authenticator_private_key_authentication(self, mock_get_private_key):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -533,7 +533,7 @@ def test_authenticator_private_key_authentication_no_passphrase(self, mock_get_p
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -562,7 +562,7 @@ def test_query_tag(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -592,7 +592,7 @@ def test_reuse_connections_with_keep_alive(self):
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=True,
database="test_database",
Expand Down Expand Up @@ -626,7 +626,7 @@ def test_authenticator_private_key_string_authentication(self, mock_get_private_
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -662,7 +662,7 @@ def test_authenticator_private_key_string_authentication_no_passphrase(
self.snowflake.assert_has_calls(
[
mock.call(
account="test_account",
account="test-account",
autocommit=True,
client_session_keep_alive=False,
database="test_database",
Expand Down Expand Up @@ -907,7 +907,7 @@ class TestSnowflakeAdapterCredentials(unittest.TestCase):

def test_private_key_string(self):
creds = SnowflakeCredentials(
account="test_account",
account="test-account",
user="test_user",
database="test_database",
schema="public",
Expand All @@ -917,7 +917,7 @@ def test_private_key_string(self):

def test_private_key_string_encrypted(self):
creds = SnowflakeCredentials(
account="test_account",
account="test-account",
user="test_user",
database="test_database",
schema="public",
Expand All @@ -928,7 +928,7 @@ def test_private_key_string_encrypted(self):

def test_malformed_private_key_string(self):
creds = SnowflakeCredentials(
account="test_account",
account="test-account",
user="test_user",
database="test_database",
schema="public",
Expand All @@ -938,7 +938,7 @@ def test_malformed_private_key_string(self):

def test_invalid_private_key_string(self):
creds = SnowflakeCredentials(
account="test_account",
account="test-account",
user="test_user",
database="test_database",
schema="public",
Expand All @@ -948,7 +948,7 @@ def test_invalid_private_key_string(self):

def test_invalid_private_key_path(self):
creds = SnowflakeCredentials(
account="test_account",
account="test-account",
user="test_user",
database="test_database",
schema="public",
Expand Down

0 comments on commit 4f5336f

Please sign in to comment.