Skip to content

Commit

Permalink
Handle unknown type_code for model contracts (#8887)
Browse files Browse the repository at this point in the history
* Handle unknown `type_code` for model contracts

* Changelog entry

* Fix changelog entry

* Functional test for a `type_code` that is not recognized by psycopg2

* Functional tests for data type mismatches

(cherry picked from commit 6aeebc4)
  • Loading branch information
dbeatty10 authored and github-actions[bot] committed Jan 19, 2024
1 parent 1f98991 commit 20bf1cf
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 1 deletion.
6 changes: 6 additions & 0 deletions .changes/unreleased/Fixes-20231024-110151.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Fixes
body: Handle unknown `type_code` for model contracts
time: 2023-10-24T11:01:51.980781-06:00
custom:
Author: dbeatty10
Issue: 8877 8353
5 changes: 4 additions & 1 deletion plugins/postgres/dbt/adapters/postgres/connections.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,4 +204,7 @@ def get_response(cls, cursor) -> AdapterResponse:

@classmethod
def data_type_code_to_name(cls, type_code: int) -> str:
return string_types[type_code].name
if type_code in string_types:
return string_types[type_code].name
else:
return f"unknown type_code {type_code}"
76 changes: 76 additions & 0 deletions tests/functional/contracts/test_nonstandard_data_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import pytest
from dbt.tests.util import run_dbt, run_dbt_and_capture


my_numeric_model_sql = """
select
12.34 as price
"""

my_money_model_sql = """
select
cast('12.34' as money) as price
"""

model_schema_money_yml = """
models:
- name: my_model
config:
contract:
enforced: true
columns:
- name: price
data_type: money
"""

model_schema_numeric_yml = """
models:
- name: my_model
config:
contract:
enforced: true
columns:
- name: price
data_type: numeric
"""


class TestModelContractUnrecognizedTypeCode1:
@pytest.fixture(scope="class")
def models(self):
return {
"my_model.sql": my_money_model_sql,
"schema.yml": model_schema_money_yml,
}

def test_nonstandard_data_type(self, project):
run_dbt(["run"], expect_pass=True)


class TestModelContractUnrecognizedTypeCodeActualMismatch:
@pytest.fixture(scope="class")
def models(self):
return {
"my_model.sql": my_money_model_sql,
"schema.yml": model_schema_numeric_yml,
}

def test_nonstandard_data_type(self, project):
expected_msg = "unknown type_code 790 | DECIMAL | data type mismatch"
_, logs = run_dbt_and_capture(["run"], expect_pass=False)
assert expected_msg in logs


class TestModelContractUnrecognizedTypeCodeExpectedMismatch:
@pytest.fixture(scope="class")
def models(self):
return {
"my_model.sql": my_numeric_model_sql,
"schema.yml": model_schema_money_yml,
}

def test_nonstandard_data_type(self, project):
expected_msg = "DECIMAL | unknown type_code 790 | data type mismatch"
_, logs = run_dbt_and_capture(["run"], expect_pass=False)
print(logs)
assert expected_msg in logs

0 comments on commit 20bf1cf

Please sign in to comment.