diff --git a/.changes/unreleased/Fixes-20240626-163930.yaml b/.changes/unreleased/Fixes-20240626-163930.yaml new file mode 100644 index 00000000..37fcc56f --- /dev/null +++ b/.changes/unreleased/Fixes-20240626-163930.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Fix `persist_docs` for `materialized_view` materializations. Previously, using this configuration with materialized view models would lead to an error. +time: 2024-06-26T16:39:30.455995+02:00 +custom: + Author: morsapaes + Issue: "120" diff --git a/dbt/include/postgres/macros/adapters.sql b/dbt/include/postgres/macros/adapters.sql index 294443be..1d20e6b3 100644 --- a/dbt/include/postgres/macros/adapters.sql +++ b/dbt/include/postgres/macros/adapters.sql @@ -196,7 +196,12 @@ {% macro postgres__alter_relation_comment(relation, comment) %} {% set escaped_comment = postgres_escape_comment(comment) %} - comment on {{ relation.type }} {{ relation }} is {{ escaped_comment }}; + {% if relation.type == 'materialized_view' -%} + {% set relation_type = "materialized view" %} + {%- else -%} + {%- set relation_type = relation.type -%} + {%- endif -%} + comment on {{ relation_type }} {{ relation }} is {{ escaped_comment }}; {% endmacro %} diff --git a/tests/functional/shared_tests/test_persist_docs.py b/tests/functional/shared_tests/test_persist_docs.py index 2653ca4a..f1ad342b 100644 --- a/tests/functional/shared_tests/test_persist_docs.py +++ b/tests/functional/shared_tests/test_persist_docs.py @@ -1,8 +1,29 @@ +import pytest +import json + +from dbt.tests.adapter.materialized_view import files from dbt.tests.adapter.persist_docs.test_persist_docs import ( BasePersistDocs, BasePersistDocsColumnMissing, BasePersistDocsCommentOnQuotedColumn, ) +from tests.functional.utils import run_dbt + +_MATERIALIZED_VIEW_PROPERTIES__SCHEMA_YML = """ +version: 2 + +models: + - name: my_materialized_view + description: | + Materialized view model description "with double quotes" + and with 'single quotes' as welll as other; + '''abc123''' + reserved -- characters + 80% of statistics are made up on the spot + -- + /* comment */ + Some $lbl$ labeled $lbl$ and $$ unlabeled $$ dollar-quoting +""" class TestPersistDocs(BasePersistDocs): @@ -15,3 +36,30 @@ class TestPersistDocsColumnMissing(BasePersistDocsColumnMissing): class TestPersistDocsCommentOnQuotedColumn(BasePersistDocsCommentOnQuotedColumn): pass + + +class TestPersistDocsWithMaterializedView(BasePersistDocs): + @pytest.fixture(scope="class", autouse=True) + def seeds(self): + return {"my_seed.csv": files.MY_SEED} + + @pytest.fixture(scope="class") + def models(self): + return { + "my_materialized_view.sql": files.MY_MATERIALIZED_VIEW, + } + + @pytest.fixture(scope="class") + def properties(self): + return { + "schema.yml": _MATERIALIZED_VIEW_PROPERTIES__SCHEMA_YML, + } + + def test_has_comments_pglike(self, project): + run_dbt(["docs", "generate"]) + with open("target/catalog.json") as fp: + catalog_data = json.load(fp) + assert "nodes" in catalog_data + assert len(catalog_data["nodes"]) == 2 + view_node = catalog_data["nodes"]["model.test.my_materialized_view"] + assert view_node["metadata"]["comment"].startswith("Materialized view model description") diff --git a/tests/functional/shared_tests/test_show.py b/tests/functional/shared_tests/test_show.py index 47974a04..7f3da925 100644 --- a/tests/functional/shared_tests/test_show.py +++ b/tests/functional/shared_tests/test_show.py @@ -1,6 +1,7 @@ from dbt.tests.adapter.dbt_show.test_dbt_show import ( BaseShowLimit, BaseShowSqlHeader, + BaseShowDoesNotHandleDoubleLimit, ) @@ -10,3 +11,7 @@ class TestPostgresShowSqlHeader(BaseShowSqlHeader): class TestPostgresShowLimit(BaseShowLimit): pass + + +class TestPostgresShowDoesNotHandleDoubleLimit(BaseShowDoesNotHandleDoubleLimit): + pass