From 1510fada30a14615c6371008a39c06c58a29f1e3 Mon Sep 17 00:00:00 2001
From: Mike Alfare <mike.alfare@dbtlabs.com>
Date: Tue, 31 Oct 2023 00:14:02 -0400
Subject: [PATCH] ADAP-971: Fix issue where dynamic tables were returning null
 for type (#818)

* changelog
* create test demonstrating the issue
* map nulls to dynamic table

(cherry picked from commit 1f123b746080b1c02c3b34713246db9f69892922)
---
 .../unreleased/Fixes-20231030-212151.yaml     |  6 +++
 dbt/include/snowflake/macros/catalog.sql      |  2 +-
 .../functional/adapter/catalog_tests/files.py | 32 ++++++++++++++
 .../catalog_tests/test_relation_types.py      | 44 +++++++++++++++++++
 4 files changed, 83 insertions(+), 1 deletion(-)
 create mode 100644 .changes/unreleased/Fixes-20231030-212151.yaml
 create mode 100644 tests/functional/adapter/catalog_tests/files.py
 create mode 100644 tests/functional/adapter/catalog_tests/test_relation_types.py

diff --git a/.changes/unreleased/Fixes-20231030-212151.yaml b/.changes/unreleased/Fixes-20231030-212151.yaml
new file mode 100644
index 000000000..10939228f
--- /dev/null
+++ b/.changes/unreleased/Fixes-20231030-212151.yaml
@@ -0,0 +1,6 @@
+kind: Fixes
+body: Dynamic tables now show the proper type in catalog queries
+time: 2023-10-30T21:21:51.220225-04:00
+custom:
+  Author: mikealfare
+  Issue: "817"
diff --git a/dbt/include/snowflake/macros/catalog.sql b/dbt/include/snowflake/macros/catalog.sql
index cf96df25d..27228d73d 100644
--- a/dbt/include/snowflake/macros/catalog.sql
+++ b/dbt/include/snowflake/macros/catalog.sql
@@ -6,7 +6,7 @@
               table_catalog as "table_database",
               table_schema as "table_schema",
               table_name as "table_name",
-              table_type as "table_type",
+              coalesce(table_type, 'DYNAMIC TABLE') as "table_type",
               comment as "table_comment",
 
               -- note: this is the _role_ that owns the table
diff --git a/tests/functional/adapter/catalog_tests/files.py b/tests/functional/adapter/catalog_tests/files.py
new file mode 100644
index 000000000..a6759398e
--- /dev/null
+++ b/tests/functional/adapter/catalog_tests/files.py
@@ -0,0 +1,32 @@
+MY_SEED = """
+id,value
+1,100
+2,200
+3,300
+""".strip()
+
+
+MY_TABLE = """
+{{ config(
+    materialized='table',
+) }}
+select * from {{ ref('my_seed') }}
+"""
+
+
+MY_VIEW = """
+{{ config(
+    materialized='view',
+) }}
+select * from {{ ref('my_seed') }}
+"""
+
+
+MY_DYNAMIC_TABLE = """
+{{ config(
+    materialized='dynamic_table',
+    snowflake_warehouse='DBT_TESTING',
+    target_lag='30 minutes',
+) }}
+select * from {{ ref('my_seed') }}
+"""
diff --git a/tests/functional/adapter/catalog_tests/test_relation_types.py b/tests/functional/adapter/catalog_tests/test_relation_types.py
new file mode 100644
index 000000000..27267a1c9
--- /dev/null
+++ b/tests/functional/adapter/catalog_tests/test_relation_types.py
@@ -0,0 +1,44 @@
+from dbt.contracts.results import CatalogArtifact
+from dbt.tests.util import run_dbt
+import pytest
+
+from tests.functional.adapter.catalog_tests import files
+
+
+class TestCatalogRelationTypes:
+    @pytest.fixture(scope="class", autouse=True)
+    def seeds(self):
+        return {"my_seed.csv": files.MY_SEED}
+
+    @pytest.fixture(scope="class", autouse=True)
+    def models(self):
+        yield {
+            "my_table.sql": files.MY_TABLE,
+            "my_view.sql": files.MY_VIEW,
+            "my_dynamic_table.sql": files.MY_DYNAMIC_TABLE,
+        }
+
+    @pytest.fixture(scope="class", autouse=True)
+    def docs(self, project):
+        run_dbt(["seed"])
+        run_dbt(["run"])
+        yield run_dbt(["docs", "generate"])
+
+    @pytest.mark.parametrize(
+        "node_name,relation_type",
+        [
+            ("seed.test.my_seed", "BASE TABLE"),
+            ("model.test.my_table", "BASE TABLE"),
+            ("model.test.my_view", "VIEW"),
+            ("model.test.my_dynamic_table", "DYNAMIC TABLE"),
+        ],
+    )
+    def test_relation_types_populate_correctly(
+        self, docs: CatalogArtifact, node_name: str, relation_type: str
+    ):
+        """
+        This test addresses: https://github.com/dbt-labs/dbt-snowflake/issues/817
+        """
+        assert node_name in docs.nodes
+        node = docs.nodes[node_name]
+        assert node.metadata.type == relation_type