From 83c0a84ad7a408fc3ca45b5434a42064042fe2ac Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:20 +0000 Subject: [PATCH 1/2] fix: populate database_name from schema for ClickHouse (CORE-559) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ClickHouse does not have a separate database/schema concept — the dbt-clickhouse adapter sets node.database to None, causing NULL database_name in dbt artifact models. Add get_node_database() dispatched macro that falls back to schema for ClickHouse only (mirroring ClickHouse's information_schema behavior). Update all 7 call sites in artifact upload macros. Co-Authored-By: unknown <> --- .../edr/dbt_artifacts/upload_dbt_columns.sql | 2 +- .../edr/dbt_artifacts/upload_dbt_models.sql | 2 +- macros/edr/dbt_artifacts/upload_dbt_seeds.sql | 2 +- .../edr/dbt_artifacts/upload_dbt_sources.sql | 2 +- macros/edr/dbt_artifacts/upload_dbt_tests.sql | 4 +++- ...del_database_and_schema_from_test_node.sql | 2 +- macros/utils/graph/get_node_database.sql | 20 +++++++++++++++++++ macros/utils/graph/get_relevant_databases.sql | 2 +- 8 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 macros/utils/graph/get_node_database.sql diff --git a/macros/edr/dbt_artifacts/upload_dbt_columns.sql b/macros/edr/dbt_artifacts/upload_dbt_columns.sql index de6ca6df5..00c7fc8b5 100644 --- a/macros/edr/dbt_artifacts/upload_dbt_columns.sql +++ b/macros/edr/dbt_artifacts/upload_dbt_columns.sql @@ -89,7 +89,7 @@ "tags": elementary.filter_none_and_sort(tags), "meta": meta_dict, "description": column_node.get("description") or none, - "database_name": table_node.get("database"), + "database_name": elementary.get_node_database(table_node), "schema_name": table_node.get("schema"), "table_name": table_node.get("alias"), "resource_type": table_node.get("resource_type"), diff --git a/macros/edr/dbt_artifacts/upload_dbt_models.sql b/macros/edr/dbt_artifacts/upload_dbt_models.sql index 60d36b965..473490740 100644 --- a/macros/edr/dbt_artifacts/upload_dbt_models.sql +++ b/macros/edr/dbt_artifacts/upload_dbt_models.sql @@ -93,7 +93,7 @@ "tags": elementary.filter_none_and_sort(tags), "meta": meta_dict, "owner": elementary.filter_none_and_sort(formatted_owner), - "database_name": node_dict.get("database"), + "database_name": elementary.get_node_database(node_dict), "schema_name": node_dict.get("schema"), "depends_on_macros": elementary.filter_none_and_sort( depends_on_dict.get("macros", []) diff --git a/macros/edr/dbt_artifacts/upload_dbt_seeds.sql b/macros/edr/dbt_artifacts/upload_dbt_seeds.sql index b70f26957..f7943d437 100644 --- a/macros/edr/dbt_artifacts/upload_dbt_seeds.sql +++ b/macros/edr/dbt_artifacts/upload_dbt_seeds.sql @@ -75,7 +75,7 @@ "tags": elementary.filter_none_and_sort(tags), "meta": meta_dict, "owner": elementary.filter_none_and_sort(formatted_owner), - "database_name": node_dict.get("database"), + "database_name": elementary.get_node_database(node_dict), "schema_name": node_dict.get("schema"), "description": node_dict.get("description"), "name": node_dict.get("name"), diff --git a/macros/edr/dbt_artifacts/upload_dbt_sources.sql b/macros/edr/dbt_artifacts/upload_dbt_sources.sql index 198d67146..fbfd38784 100644 --- a/macros/edr/dbt_artifacts/upload_dbt_sources.sql +++ b/macros/edr/dbt_artifacts/upload_dbt_sources.sql @@ -77,7 +77,7 @@ {% set tags = elementary.union_lists(tags, meta_tags) %} {% set flatten_source_metadata_dict = { "unique_id": node_dict.get("unique_id"), - "database_name": node_dict.get("database"), + "database_name": elementary.get_node_database(node_dict), "schema_name": node_dict.get("schema"), "source_name": node_dict.get("source_name"), "name": node_dict.get("name"), diff --git a/macros/edr/dbt_artifacts/upload_dbt_tests.sql b/macros/edr/dbt_artifacts/upload_dbt_tests.sql index 78593581d..6c2fe4739 100644 --- a/macros/edr/dbt_artifacts/upload_dbt_tests.sql +++ b/macros/edr/dbt_artifacts/upload_dbt_tests.sql @@ -150,7 +150,9 @@ {%- if primary_test_model_id.data is not none -%} {% set tested_model_node = elementary.get_node(primary_test_model_id.data) %} {%- if tested_model_node -%} - {% set primary_test_model_database = tested_model_node.get("database") %} + {% set primary_test_model_database = elementary.get_node_database( + tested_model_node + ) %} {% set primary_test_model_schema = tested_model_node.get("schema") %} {% set group_name = group_name or tested_model_node.get("group") %} {% set flatten_primary_model_node = elementary.flatten_node( diff --git a/macros/utils/graph/get_model_database_and_schema_from_test_node.sql b/macros/utils/graph/get_model_database_and_schema_from_test_node.sql index d3b24bd93..c12103d13 100644 --- a/macros/utils/graph/get_model_database_and_schema_from_test_node.sql +++ b/macros/utils/graph/get_model_database_and_schema_from_test_node.sql @@ -1,5 +1,5 @@ {% macro get_model_database_and_schema_from_test_node(test_node) %} - {% set test_database = test_node.get("database") %} + {% set test_database = elementary.get_node_database(test_node) %} {% set test_schema = test_node.get("schema") %} {% set config_dict = elementary.safe_get_with_default(test_node, "config", {}) %} {% set test_schema_sufix = config_dict.get("schema") %} diff --git a/macros/utils/graph/get_node_database.sql b/macros/utils/graph/get_node_database.sql new file mode 100644 index 000000000..934b96c9a --- /dev/null +++ b/macros/utils/graph/get_node_database.sql @@ -0,0 +1,20 @@ +{# + Returns the database name from a node dict. + + ClickHouse does not have a separate database / schema concept — the + dbt-clickhouse adapter sets node.database to None. ClickHouse's own + information_schema populates both the database and schema columns with + the same value (the database name), so we mirror that behaviour here + by falling back to the node's schema when the database is None. +#} +{% macro get_node_database(node) %} + {% do return(adapter.dispatch("get_node_database", "elementary")(node)) %} +{% endmacro %} + +{% macro default__get_node_database(node) %} + {% do return(node.get("database")) %} +{% endmacro %} + +{% macro clickhouse__get_node_database(node) %} + {% do return(node.get("database") or node.get("schema")) %} +{% endmacro %} diff --git a/macros/utils/graph/get_relevant_databases.sql b/macros/utils/graph/get_relevant_databases.sql index e61600f33..d1353d8fe 100644 --- a/macros/utils/graph/get_relevant_databases.sql +++ b/macros/utils/graph/get_relevant_databases.sql @@ -12,7 +12,7 @@ ) %} {% set nodes = models + sources %} {% for node in nodes %} - {% set database_name = node.get("database") %} + {% set database_name = elementary.get_node_database(node) %} {% if database_name %} {% do database_names.append(database_name) %} {% endif %} {% endfor %} {% set unique_database_names = database_names | unique | list %} From e3c04f4589396ff2d0391a3af93835160232c342 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:38:09 +0000 Subject: [PATCH 2/2] fix: also handle target.database being None in get_relevant_databases Co-Authored-By: unknown <> --- macros/utils/graph/get_relevant_databases.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macros/utils/graph/get_relevant_databases.sql b/macros/utils/graph/get_relevant_databases.sql index d1353d8fe..a107626eb 100644 --- a/macros/utils/graph/get_relevant_databases.sql +++ b/macros/utils/graph/get_relevant_databases.sql @@ -1,5 +1,5 @@ {% macro get_relevant_databases() %} - {% set database_names = [target.database] %} + {% set database_names = [target.database or target.schema] %} {% set models = ( graph.nodes.values() | selectattr("resource_type", "==", "model")