From 07bce6e75559f750a8c7cf3caba86d440d4db4d4 Mon Sep 17 00:00:00 2001 From: Can Bekleyici Date: Fri, 27 Feb 2026 16:52:53 +0100 Subject: [PATCH 1/7] feat: support key-only databricks_tags Signed-off-by: Can Bekleyici --- .../relation_configs/column_tags.py | 4 +-- .../databricks/relation_configs/tags.py | 4 +-- .../databricks/macros/relations/tags.sql | 4 +-- .../adapter/column_tags/fixtures.py | 4 +-- .../adapter/column_tags/test_column_tags.py | 4 +-- tests/functional/adapter/tags/fixtures.py | 5 +-- .../adapter/tags/test_databricks_tags.py | 10 +++--- .../test_column_tags_config.py | 12 +++---- tests/unit/relation_configs/test_tags.py | 31 ++++++++++++++----- 9 files changed, 47 insertions(+), 31 deletions(-) diff --git a/dbt/adapters/databricks/relation_configs/column_tags.py b/dbt/adapters/databricks/relation_configs/column_tags.py index 93d5ea890..ec52840dc 100644 --- a/dbt/adapters/databricks/relation_configs/column_tags.py +++ b/dbt/adapters/databricks/relation_configs/column_tags.py @@ -55,7 +55,7 @@ def from_relation_results(cls, results: RelationResults) -> ColumnTagsConfig: # row contains [column_name, tag_name, tag_value] column_name = str(row[0]) tag_name = str(row[1]) - tag_value = str(row[2]) + tag_value = str(row[2] or "") if column_name not in set_column_tags: set_column_tags[column_name] = {} @@ -79,7 +79,7 @@ def from_relation_config(cls, relation_config: RelationConfig) -> ColumnTagsConf if databricks_tags: if isinstance(databricks_tags, dict): set_column_tags[col["name"]] = { - str(k): str(v) for k, v in databricks_tags.items() + str(k): str(v or "") for k, v in databricks_tags.items() } else: raise DbtRuntimeError("databricks_tags must be a dictionary") diff --git a/dbt/adapters/databricks/relation_configs/tags.py b/dbt/adapters/databricks/relation_configs/tags.py index 9286bc9b3..aadb5d29d 100644 --- a/dbt/adapters/databricks/relation_configs/tags.py +++ b/dbt/adapters/databricks/relation_configs/tags.py @@ -33,7 +33,7 @@ def from_relation_results(cls, results: RelationResults) -> TagsConfig: if table: for row in table.rows: - tags[str(row[0])] = str(row[1]) + tags[str(row[0])] = str(row[1] or "") return TagsConfig(set_tags=tags) @@ -43,7 +43,7 @@ def from_relation_config(cls, relation_config: RelationConfig) -> TagsConfig: if not tags: return TagsConfig(set_tags=dict()) if isinstance(tags, dict): - tags = {str(k): str(v) for k, v in tags.items()} + tags = {str(k): str(v or "") for k, v in tags.items()} return TagsConfig(set_tags=tags) else: raise DbtRuntimeError("databricks_tags must be a dictionary") diff --git a/dbt/include/databricks/macros/relations/tags.sql b/dbt/include/databricks/macros/relations/tags.sql index 6ba6e29a9..17a347ec8 100644 --- a/dbt/include/databricks/macros/relations/tags.sql +++ b/dbt/include/databricks/macros/relations/tags.sql @@ -30,8 +30,8 @@ {% macro alter_set_tags(relation, tags) -%} ALTER {{ relation.type.render() }} {{ relation.render() }} SET TAGS ( - {% for tag in tags -%} - '{{ tag }}' = '{{ tags[tag] }}' {%- if not loop.last %}, {% endif -%} + {% for key, value in tags.items() -%} + '{{ key }}' = '{{ value }}' {%- if not loop.last %}, {% endif -%} {%- endfor %} ) {%- endmacro -%} diff --git a/tests/functional/adapter/column_tags/fixtures.py b/tests/functional/adapter/column_tags/fixtures.py index 5c26f835b..256849900 100644 --- a/tests/functional/adapter/column_tags/fixtures.py +++ b/tests/functional/adapter/column_tags/fixtures.py @@ -13,7 +13,7 @@ - name: account_number databricks_tags: pii: "true" - sensitive: "true" + sensitive: "" """ updated_column_tag_model = """ @@ -29,7 +29,7 @@ - name: account_number databricks_tags: pii: "true" - sensitive: "true" + sensitive: "" """ column_tags_seed = """ diff --git a/tests/functional/adapter/column_tags/test_column_tags.py b/tests/functional/adapter/column_tags/test_column_tags.py index 6f4fdb222..17e057038 100644 --- a/tests/functional/adapter/column_tags/test_column_tags.py +++ b/tests/functional/adapter/column_tags/test_column_tags.py @@ -31,7 +31,7 @@ def test_column_tags(self, project): tags = project.run_sql(column_tags_query, fetch="all") expected_tags = { ("account_number", "pii", "true"), - ("account_number", "sensitive", "true"), + ("account_number", "sensitive", ""), } actual_tags = {(row[0], row[1], row[2]) for row in tags} assert actual_tags == expected_tags @@ -51,7 +51,7 @@ def test_column_tags(self, project): expected_tags = { ("id", "pii", "false"), ("account_number", "pii", "true"), - ("account_number", "sensitive", "true"), + ("account_number", "sensitive", ""), } actual_tags = {(row[0], row[1], row[2]) for row in tags} assert actual_tags == expected_tags diff --git a/tests/functional/adapter/tags/fixtures.py b/tests/functional/adapter/tags/fixtures.py index 67422fd93..3dad09a82 100644 --- a/tests/functional/adapter/tags/fixtures.py +++ b/tests/functional/adapter/tags/fixtures.py @@ -1,7 +1,7 @@ tags_sql = """ {{ config( materialized = 'table', - databricks_tags = {'a': 'b', 'c': 'd'}, + databricks_tags = {'a': 'b', 'c': 'd', 'k': ''}, ) }} select cast(1 as bigint) as id, 'hello' as msg, 'blue' as color @@ -19,7 +19,7 @@ streaming_table_tags_sql = """ {{ config( materialized='streaming_table', - databricks_tags = {'a': 'b', 'c': 'd'}, + databricks_tags = {'a': 'b', 'c': 'd', 'k': ''}, ) }} select * from stream {{ ref('my_seed') }} @@ -54,4 +54,5 @@ def model(dbt, spark): databricks_tags: a: b c: d + k: "" """ diff --git a/tests/functional/adapter/tags/test_databricks_tags.py b/tests/functional/adapter/tags/test_databricks_tags.py index a4eeb7741..e28d11510 100644 --- a/tests/functional/adapter/tags/test_databricks_tags.py +++ b/tests/functional/adapter/tags/test_databricks_tags.py @@ -23,8 +23,8 @@ def test_tags(self, project): " where schema_name = '{schema}' and table_name='tags'", fetch="all", ) - assert len(results) == 2 - expected_tags = {("a", "b"), ("c", "d")} + assert len(results) == 3 + expected_tags = {("a", "b"), ("c", "d"), ("k", "")} actual_tags = set((row[0], row[1]) for row in results) assert actual_tags == expected_tags @@ -56,8 +56,8 @@ def test_updated_tags(self, project): " where schema_name = '{schema}' and table_name='tags'", fetch="all", ) - assert len(results) == 3 - expected_tags = {("a", "b"), ("c", "d"), ("e", "f")} + assert len(results) == 4 + expected_tags = {("a", "b"), ("c", "d"), ("k", ""), ("e", "f")} actual_tags = set((row[0], row[1]) for row in results) assert actual_tags == expected_tags @@ -151,7 +151,7 @@ def test_updated_tags(self, project): " where schema_name = '{schema}' and table_name='tags'", fetch="all", ) - assert len(results) == 3 + assert len(results) == 4 @pytest.mark.python diff --git a/tests/unit/relation_configs/test_column_tags_config.py b/tests/unit/relation_configs/test_column_tags_config.py index 099f9da30..a4269d2a1 100644 --- a/tests/unit/relation_configs/test_column_tags_config.py +++ b/tests/unit/relation_configs/test_column_tags_config.py @@ -26,7 +26,7 @@ def test_from_relation_results__some(self): "information_schema.column_tags": Table( rows=[ ["col1", "tag_a", "value_a"], - ["col1", "tag_b", "value_b"], + ["col1", "tag_b", ""], # key-only tag ["col2", "tag_c", "value_c"], ], column_names=["column_name", "tag_name", "tag_value"], @@ -35,7 +35,7 @@ def test_from_relation_results__some(self): spec = ColumnTagsProcessor.from_relation_results(results) assert spec == ColumnTagsConfig( set_column_tags={ - "col1": {"tag_a": "value_a", "tag_b": "value_b"}, + "col1": {"tag_a": "value_a", "tag_b": ""}, "col2": {"tag_c": "value_c"}, } ) @@ -54,14 +54,14 @@ def test_from_relation_config__without_column_tags(self): def test_from_relation_config__with_dict(self): model = Mock() model.columns = { - "email": {"_extra": {"databricks_tags": {"pii": "true", "env": "prod"}}}, + "email": {"_extra": {"databricks_tags": {"pii": "", "env": "prod"}}}, "id": {"_extra": {}}, "created_at": {}, } spec = ColumnTagsProcessor.from_relation_config(model) assert spec == ColumnTagsConfig( set_column_tags={ - "email": {"pii": "true", "env": "prod"}, + "email": {"pii": "", "env": "prod"}, } ) @@ -71,14 +71,14 @@ def test_from_relation_config__with_column_info(self): "id": ColumnInfo(name="id", _extra={}), "email": ColumnInfo( name="email", - _extra={"databricks_tags": {"pii": "true", "env": "prod"}}, + _extra={"databricks_tags": {"pii": "", "env": "prod"}}, ), "created_at": ColumnInfo(name="created_at"), } spec = ColumnTagsProcessor.from_relation_config(model) assert spec == ColumnTagsConfig( set_column_tags={ - "email": {"pii": "true", "env": "prod"}, + "email": {"pii": "", "env": "prod"}, } ) diff --git a/tests/unit/relation_configs/test_tags.py b/tests/unit/relation_configs/test_tags.py index e465739b8..0b76637f3 100644 --- a/tests/unit/relation_configs/test_tags.py +++ b/tests/unit/relation_configs/test_tags.py @@ -24,6 +24,15 @@ def test_from_relation_results__some(self): spec = TagsProcessor.from_relation_results(results) assert spec == TagsConfig(set_tags={"a": "valA", "b": "valB"}) + def test_from_relation_results__key_only(self): + results = { + "information_schema.tags": Table( + rows=[["a", ""]], column_names=["tag_name", "tag_value"] + ) + } + spec = TagsProcessor.from_relation_results(results) + assert spec == TagsConfig(set_tags={"a": ""}) + def test_from_relation_config__without_tags(self): model = Mock() model.config.extra = {} @@ -36,6 +45,12 @@ def test_from_relation_config__with_tags(self): spec = TagsProcessor.from_relation_config(model) assert spec == TagsConfig(set_tags={"a": "valA", "b": "1"}) + def test_from_relation_config__with_key_only_tags(self): + model = Mock() + model.config.extra = {"databricks_tags": {"a": "", "b": None}} + spec = TagsProcessor.from_relation_config(model) + assert spec == TagsConfig(set_tags={"a": "", "b": ""}) + def test_from_relation_config__with_incorrect_tags(self): model = Mock() model.config.extra = {"databricks_tags": ["a", "b"]} @@ -52,25 +67,25 @@ def test_get_diff__empty_and_some_exist(self): # Tags are "set only" - when config has no tags and relation has tags, # we don't unset the existing tags config = TagsConfig(set_tags={}) - other = TagsConfig(set_tags={"tag": "value"}) - diff = config.get_diff(other) + config_old = TagsConfig(set_tags={"tag": "value"}) + diff = config.get_diff(config_old) assert diff is None # No changes needed since we don't unset tags def test_get_diff__some_new_and_empty_existing(self): config = TagsConfig(set_tags={"tag": "value"}) - other = TagsConfig(set_tags={}) - diff = config.get_diff(other) + config_old = TagsConfig(set_tags={}) + diff = config.get_diff(config_old) assert diff == TagsConfig(set_tags={"tag": "value"}) def test_get_diff__mixed_case(self): # Tags are "set only" - only the new/updated tags are included config = TagsConfig(set_tags={"a": "value", "b": "value"}) - other = TagsConfig(set_tags={"b": "other_value", "c": "value"}) - diff = config.get_diff(other) + config_old = TagsConfig(set_tags={"b": "other_value", "c": "value"}) + diff = config.get_diff(config_old) assert diff == TagsConfig(set_tags={"a": "value", "b": "value"}) def test_get_diff__no_changes(self): config = TagsConfig(set_tags={"tag": "value"}) - other = TagsConfig(set_tags={"tag": "value"}) - diff = config.get_diff(other) + config_old = TagsConfig(set_tags={"tag": "value"}) + diff = config.get_diff(config_old) assert diff is None From f936946470f8c7adf50f75968a7f4ef8e7caa545 Mon Sep 17 00:00:00 2001 From: Can Bekleyici Date: Fri, 27 Feb 2026 17:04:42 +0100 Subject: [PATCH 2/7] docs: add docs for key-only tags feature Signed-off-by: Can Bekleyici --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c5c6c1dd..abcb04eb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ gated behind the `use_concurrent_microbatch` behavior flag (default: `false`). Opt in via `flags: {use_concurrent_microbatch: true}` in `dbt_project.yml` ([#914](https://github.com/databricks/dbt-databricks/issues/914)) +- Add support for key-only `databricks_tags` for table and column tagging. This can now be configured by settings + tag values as empty strings `""`. ([#1270](https://github.com/databricks/dbt-databricks/issues/1270)) ### Fixes From 92c68c398765ecd650b86f950a6857b69c018f95 Mon Sep 17 00:00:00 2001 From: Shubham Dhal Date: Mon, 20 Apr 2026 17:50:59 +0530 Subject: [PATCH 3/7] chore: fix bad merge for CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7eb67d9b9..b62084aaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ gated behind the `use_concurrent_microbatch` behavior flag (default: `false`). Opt in via `flags: {use_concurrent_microbatch: true}` in `dbt_project.yml` ([#914](https://github.com/databricks/dbt-databricks/issues/914)) +- Run `optimize` on snapshots when `liquid_clustered_by`, `zorder`, or `auto_liquid_cluster` config is set, matching existing behavior for tables and incremental models ([#1335](https://github.com/databricks/dbt-databricks/issues/1335)) ### Fixes From 9df5810c1eb3cae8ee6a102f44ac18ae89ec8928 Mon Sep 17 00:00:00 2001 From: Can Bekleyici Date: Fri, 24 Apr 2026 00:04:46 +0200 Subject: [PATCH 4/7] fix: tags and column-tags now don't collapse falsy values from config --- dbt/adapters/databricks/relation_configs/column_tags.py | 4 ++-- dbt/adapters/databricks/relation_configs/tags.py | 4 ++-- dbt/include/databricks/macros/relations/tags.sql | 4 ++-- tests/functional/adapter/column_tags/fixtures.py | 6 ++++-- tests/functional/adapter/column_tags/test_column_tags.py | 6 ++++-- tests/unit/relation_configs/test_column_tags_config.py | 8 ++++---- tests/unit/relation_configs/test_tags.py | 6 ++++++ 7 files changed, 24 insertions(+), 14 deletions(-) diff --git a/dbt/adapters/databricks/relation_configs/column_tags.py b/dbt/adapters/databricks/relation_configs/column_tags.py index ec52840dc..26c8f6aa5 100644 --- a/dbt/adapters/databricks/relation_configs/column_tags.py +++ b/dbt/adapters/databricks/relation_configs/column_tags.py @@ -55,7 +55,7 @@ def from_relation_results(cls, results: RelationResults) -> ColumnTagsConfig: # row contains [column_name, tag_name, tag_value] column_name = str(row[0]) tag_name = str(row[1]) - tag_value = str(row[2] or "") + tag_value = "" if row[2] is None else str(row[2]) if column_name not in set_column_tags: set_column_tags[column_name] = {} @@ -79,7 +79,7 @@ def from_relation_config(cls, relation_config: RelationConfig) -> ColumnTagsConf if databricks_tags: if isinstance(databricks_tags, dict): set_column_tags[col["name"]] = { - str(k): str(v or "") for k, v in databricks_tags.items() + str(k): "" if v is None else str(v) for k, v in databricks_tags.items() } else: raise DbtRuntimeError("databricks_tags must be a dictionary") diff --git a/dbt/adapters/databricks/relation_configs/tags.py b/dbt/adapters/databricks/relation_configs/tags.py index aadb5d29d..757c3fdf0 100644 --- a/dbt/adapters/databricks/relation_configs/tags.py +++ b/dbt/adapters/databricks/relation_configs/tags.py @@ -33,7 +33,7 @@ def from_relation_results(cls, results: RelationResults) -> TagsConfig: if table: for row in table.rows: - tags[str(row[0])] = str(row[1] or "") + tags[str(row[0])] = "" if row[1] is None else str(row[1]) return TagsConfig(set_tags=tags) @@ -43,7 +43,7 @@ def from_relation_config(cls, relation_config: RelationConfig) -> TagsConfig: if not tags: return TagsConfig(set_tags=dict()) if isinstance(tags, dict): - tags = {str(k): str(v or "") for k, v in tags.items()} + tags = {str(k): "" if v is None else str(v) for k, v in tags.items()} return TagsConfig(set_tags=tags) else: raise DbtRuntimeError("databricks_tags must be a dictionary") diff --git a/dbt/include/databricks/macros/relations/tags.sql b/dbt/include/databricks/macros/relations/tags.sql index 17a347ec8..6ba6e29a9 100644 --- a/dbt/include/databricks/macros/relations/tags.sql +++ b/dbt/include/databricks/macros/relations/tags.sql @@ -30,8 +30,8 @@ {% macro alter_set_tags(relation, tags) -%} ALTER {{ relation.type.render() }} {{ relation.render() }} SET TAGS ( - {% for key, value in tags.items() -%} - '{{ key }}' = '{{ value }}' {%- if not loop.last %}, {% endif -%} + {% for tag in tags -%} + '{{ tag }}' = '{{ tags[tag] }}' {%- if not loop.last %}, {% endif -%} {%- endfor %} ) {%- endmacro -%} diff --git a/tests/functional/adapter/column_tags/fixtures.py b/tests/functional/adapter/column_tags/fixtures.py index 256849900..8cee5afe6 100644 --- a/tests/functional/adapter/column_tags/fixtures.py +++ b/tests/functional/adapter/column_tags/fixtures.py @@ -13,7 +13,8 @@ - name: account_number databricks_tags: pii: "true" - sensitive: "" + sensitive: "true" + key_only: "" """ updated_column_tag_model = """ @@ -29,7 +30,8 @@ - name: account_number databricks_tags: pii: "true" - sensitive: "" + sensitive: "true" + key_only: "" """ column_tags_seed = """ diff --git a/tests/functional/adapter/column_tags/test_column_tags.py b/tests/functional/adapter/column_tags/test_column_tags.py index 17ffcdc69..b6ae2541b 100644 --- a/tests/functional/adapter/column_tags/test_column_tags.py +++ b/tests/functional/adapter/column_tags/test_column_tags.py @@ -31,7 +31,8 @@ def test_column_tags(self, project): tags = project.run_sql(column_tags_query, fetch="all") expected_tags = { ("account_number", "pii", "true"), - ("account_number", "sensitive", ""), + ("account_number", "sensitive", "true"), + ("account_number", "key_only", ""), } actual_tags = {(row[0], row[1], row[2]) for row in tags} assert actual_tags == expected_tags @@ -51,7 +52,8 @@ def test_column_tags(self, project): expected_tags = { ("id", "pii", "false"), ("account_number", "pii", "true"), - ("account_number", "sensitive", ""), + ("account_number", "sensitive", "true"), + ("account_number", "key_only", ""), } actual_tags = {(row[0], row[1], row[2]) for row in tags} assert actual_tags == expected_tags diff --git a/tests/unit/relation_configs/test_column_tags_config.py b/tests/unit/relation_configs/test_column_tags_config.py index a4269d2a1..a4d19bf9a 100644 --- a/tests/unit/relation_configs/test_column_tags_config.py +++ b/tests/unit/relation_configs/test_column_tags_config.py @@ -54,14 +54,14 @@ def test_from_relation_config__without_column_tags(self): def test_from_relation_config__with_dict(self): model = Mock() model.columns = { - "email": {"_extra": {"databricks_tags": {"pii": "", "env": "prod"}}}, + "email": {"_extra": {"databricks_tags": {"pii": "", "env": "prod", "priority": 0, "enabled": False}}}, "id": {"_extra": {}}, "created_at": {}, } spec = ColumnTagsProcessor.from_relation_config(model) assert spec == ColumnTagsConfig( set_column_tags={ - "email": {"pii": "", "env": "prod"}, + "email": {"pii": "", "env": "prod", "priority": "0", "enabled": "False"}, } ) @@ -71,14 +71,14 @@ def test_from_relation_config__with_column_info(self): "id": ColumnInfo(name="id", _extra={}), "email": ColumnInfo( name="email", - _extra={"databricks_tags": {"pii": "", "env": "prod"}}, + _extra={"databricks_tags": {"pii": "", "env": "prod", "priority": 0, "enabled": False}}, ), "created_at": ColumnInfo(name="created_at"), } spec = ColumnTagsProcessor.from_relation_config(model) assert spec == ColumnTagsConfig( set_column_tags={ - "email": {"pii": "", "env": "prod"}, + "email": {"pii": "", "env": "prod", "priority": "0", "enabled": "False"}, } ) diff --git a/tests/unit/relation_configs/test_tags.py b/tests/unit/relation_configs/test_tags.py index 0b76637f3..a9e4bdc0b 100644 --- a/tests/unit/relation_configs/test_tags.py +++ b/tests/unit/relation_configs/test_tags.py @@ -51,6 +51,12 @@ def test_from_relation_config__with_key_only_tags(self): spec = TagsProcessor.from_relation_config(model) assert spec == TagsConfig(set_tags={"a": "", "b": ""}) + def test_from_relation_config__with_falsy_tags(self): + model = Mock() + model.config.extra = {"databricks_tags": {"priority": 0, "enabled": False}} + spec = TagsProcessor.from_relation_config(model) + assert spec == TagsConfig(set_tags={"priority": "0", "enabled": "False"}) + def test_from_relation_config__with_incorrect_tags(self): model = Mock() model.config.extra = {"databricks_tags": ["a", "b"]} From 68e4cb9a241f45899ac60514d3ee3f023b117960 Mon Sep 17 00:00:00 2001 From: Shubham Dhal Date: Fri, 24 Apr 2026 13:45:52 +0530 Subject: [PATCH 5/7] test: cover YAML null column tags + tighten CHANGELOG wording - Add `null_value:` (bare key, YAML parses to None) alongside the existing empty-string case in the column-tags functional fixtures. This matches the exact input form reported in #1270 and exercises the `None -> ""` coercion end-to-end. - CHANGELOG: fix "settings" typo and mention that `None` is also accepted as an input form for key-only tags. Co-authored-by: Can Bekleyici --- CHANGELOG.md | 4 ++-- tests/functional/adapter/column_tags/fixtures.py | 2 ++ tests/functional/adapter/column_tags/test_column_tags.py | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b62084aaa..bf7791f62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,8 @@ ### Features -- Add support for key-only `databricks_tags` for table and column tagging. This can now be configured by settings - tag values as empty strings `""`. ([#1270](https://github.com/databricks/dbt-databricks/issues/1270)) +- Add support for key-only `databricks_tags` for table and column tagging. This can now be configured by setting + tag values to empty strings `""` or `None`. ([#1270](https://github.com/databricks/dbt-databricks/issues/1270)) ## dbt-databricks 1.11.7 (Apr 17, 2026) diff --git a/tests/functional/adapter/column_tags/fixtures.py b/tests/functional/adapter/column_tags/fixtures.py index 8cee5afe6..0e282d222 100644 --- a/tests/functional/adapter/column_tags/fixtures.py +++ b/tests/functional/adapter/column_tags/fixtures.py @@ -15,6 +15,7 @@ pii: "true" sensitive: "true" key_only: "" + null_value: """ updated_column_tag_model = """ @@ -32,6 +33,7 @@ pii: "true" sensitive: "true" key_only: "" + null_value: """ column_tags_seed = """ diff --git a/tests/functional/adapter/column_tags/test_column_tags.py b/tests/functional/adapter/column_tags/test_column_tags.py index b6ae2541b..1154b8a7e 100644 --- a/tests/functional/adapter/column_tags/test_column_tags.py +++ b/tests/functional/adapter/column_tags/test_column_tags.py @@ -33,6 +33,7 @@ def test_column_tags(self, project): ("account_number", "pii", "true"), ("account_number", "sensitive", "true"), ("account_number", "key_only", ""), + ("account_number", "null_value", ""), } actual_tags = {(row[0], row[1], row[2]) for row in tags} assert actual_tags == expected_tags @@ -54,6 +55,7 @@ def test_column_tags(self, project): ("account_number", "pii", "true"), ("account_number", "sensitive", "true"), ("account_number", "key_only", ""), + ("account_number", "null_value", ""), } actual_tags = {(row[0], row[1], row[2]) for row in tags} assert actual_tags == expected_tags From a53a02f32cd105647c2d632640cc3de0b1121022 Mon Sep 17 00:00:00 2001 From: Shubham Dhal Date: Fri, 24 Apr 2026 14:22:25 +0530 Subject: [PATCH 6/7] CHANGELOG.md fixes --- CHANGELOG.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44c89771c..df104bda0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,3 @@ -<<<<<<< feat/support-for-key-only-databricks-tags -## dbt-databricks 1.11.8 (TBD) - -### Features - -- Add support for key-only `databricks_tags` for table and column tagging. This can now be configured by setting - tag values to empty strings `""` or `None`. ([#1270](https://github.com/databricks/dbt-databricks/issues/1270)) -======= ## dbt-databricks 1.12.0 (TBD) ### Features @@ -13,7 +5,7 @@ - Add support for metric views as a materialization ([#1285](https://github.com/databricks/dbt-databricks/pull/1285)) - Add support for row filters ([#1294](https://github.com/databricks/dbt-databricks/pull/1294)) - Add support for Python UDFs ([#1336](https://github.com/databricks/dbt-databricks/pull/1336)) ->>>>>>> 1.12.latest +- Add support for key-only `databricks_tags` for table and column tagging. This can now be configured by setting tag values to empty strings `""` or `None`. ([#1339](https://github.com/databricks/dbt-databricks/pull/1339)) ## dbt-databricks 1.11.7 (Apr 17, 2026) From e76fe0f50cf35cecc2011cd78ab8b011c55e7d05 Mon Sep 17 00:00:00 2001 From: Shubham Dhal Date: Fri, 24 Apr 2026 15:08:58 +0530 Subject: [PATCH 7/7] style: fix ruff E501 line-length violations in column tags test --- tests/unit/relation_configs/test_column_tags_config.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/unit/relation_configs/test_column_tags_config.py b/tests/unit/relation_configs/test_column_tags_config.py index a4d19bf9a..2205138e8 100644 --- a/tests/unit/relation_configs/test_column_tags_config.py +++ b/tests/unit/relation_configs/test_column_tags_config.py @@ -54,7 +54,11 @@ def test_from_relation_config__without_column_tags(self): def test_from_relation_config__with_dict(self): model = Mock() model.columns = { - "email": {"_extra": {"databricks_tags": {"pii": "", "env": "prod", "priority": 0, "enabled": False}}}, + "email": { + "_extra": { + "databricks_tags": {"pii": "", "env": "prod", "priority": 0, "enabled": False} + } + }, "id": {"_extra": {}}, "created_at": {}, } @@ -71,7 +75,9 @@ def test_from_relation_config__with_column_info(self): "id": ColumnInfo(name="id", _extra={}), "email": ColumnInfo( name="email", - _extra={"databricks_tags": {"pii": "", "env": "prod", "priority": 0, "enabled": False}}, + _extra={ + "databricks_tags": {"pii": "", "env": "prod", "priority": 0, "enabled": False} + }, ), "created_at": ColumnInfo(name="created_at"), }