diff --git a/CHANGELOG.md b/CHANGELOG.md index 3adfc661f..969cd4744 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## dbt-databricks 1.12.1 (TBD) + +### Under the Hood + +- Honor `incremental_apply_config_changes` in the V1 incremental merge path, allowing users to skip metadata diff queries (tags, column_tags, constraints, column_masks, tblproperties, describe_extended) when set to `false`. Matches the existing V2 behavior. ([#1402](https://github.com/databricks/dbt-databricks/issues/1402)) + ## dbt-databricks 1.12.0 (May 18, 2026) ### Features diff --git a/dbt/include/databricks/macros/materializations/incremental/incremental.sql b/dbt/include/databricks/macros/materializations/incremental/incremental.sql index 7972474e8..2ddf1b668 100644 --- a/dbt/include/databricks/macros/materializations/incremental/incremental.sql +++ b/dbt/include/databricks/macros/materializations/incremental/incremental.sql @@ -133,9 +133,12 @@ {{ set_overwrite_mode('DYNAMIC') }} {%- endif -%} {#-- Relation must be merged --#} - {%- set model_config = adapter.get_config_from_model(config.model) -%} - {%- set _existing_config = adapter.get_relation_config(existing_relation, model_config) -%} - {%- set _configuration_changes = model_config.get_changeset(_existing_config) -%} + {%- set _configuration_changes = none -%} + {%- if config.get('incremental_apply_config_changes', True) | as_bool -%} + {%- set model_config = adapter.get_config_from_model(config.model) -%} + {%- set _existing_config = adapter.get_relation_config(existing_relation, model_config) -%} + {%- set _configuration_changes = model_config.get_changeset(_existing_config) -%} + {%- endif -%} {%- call statement('create_temp_relation', language=language) -%} {{ create_table_as(True, temp_relation, compiled_code, language) }} {%- endcall -%} diff --git a/tests/functional/adapter/incremental/fixtures.py b/tests/functional/adapter/incremental/fixtures.py index 5ff35abc3..fb7123986 100644 --- a/tests/functional/adapter/incremental/fixtures.py +++ b/tests/functional/adapter/incremental/fixtures.py @@ -85,6 +85,16 @@ select cast(1 as bigint) as id """ +metadata_fetch_incremental_skip_config_changes_sql = """ +{{ config( + materialized = 'incremental', + unique_key = 'id', + incremental_apply_config_changes = false, +) }} + +select cast(1 as bigint) as id +""" + metadata_fetch_no_tags_schema = """ version: 2 diff --git a/tests/functional/adapter/incremental/test_v1_incremental_apply_config_changes.py b/tests/functional/adapter/incremental/test_v1_incremental_apply_config_changes.py new file mode 100644 index 000000000..ca2e0b63a --- /dev/null +++ b/tests/functional/adapter/incremental/test_v1_incremental_apply_config_changes.py @@ -0,0 +1,36 @@ +import pytest +from dbt.tests import util + +from tests.functional.adapter.fixtures import ( + MaterializationV1Mixin, + fail_if_tag_and_column_tag_fetch_called_macros, +) +from tests.functional.adapter.incremental import fixtures + + +@pytest.mark.skip_profile("databricks_cluster") +class TestV1IncrementalApplyConfigChangesFalseSkipsTagFetch(MaterializationV1Mixin): + """When `incremental_apply_config_changes` is false, the V1 incremental merge path + must skip the get_relation_config metadata fetches even if the model declares tags. + """ + + @pytest.fixture(scope="class") + def models(self): + return { + "metadata_fetch_incremental.sql": ( + fixtures.metadata_fetch_incremental_skip_config_changes_sql + ), + "schema.yml": fixtures.metadata_fetch_table_tags_schema, + } + + @pytest.fixture(scope="class") + def macros(self): + return {"fail_if_tag_fetch_called.sql": fail_if_tag_and_column_tag_fetch_called_macros} + + def test_v1_incremental_skips_metadata_fetch_when_flag_false(self, project): + # First run creates the table; second run exercises the existing-relation merge path + # where get_relation_config would normally fire metadata queries. + # Tags are declared on the model, so without the flag the run would call fetch_tags + # and fail. The flag must bypass the entire get_relation_config call. + util.run_dbt(["run"]) + util.run_dbt(["run"])