Skip to content

Commit 3d3a87d

Browse files
authored
fix: prevent duplicate alias in --empty mode for inline ref/source (#1397)
## Summary - Sets `require_alias: bool = False` on `DatabricksRelation`, preventing `render_limited()` from injecting a `_dbt_limit_subq_*` alias that conflicts with user-provided `AS` aliases when running `dbt run --empty` - Adds conformance tests for `--empty` mode (`BaseTestEmpty` and `BaseTestEmptyInlineSourceRef`) - Adds a unit test verifying `render_limited()` output has no trailing subquery alias ## Context When `dbt run --empty` is used, dbt wraps `ref()` and `source()` in a zero-row subquery. `BaseRelation` defaults to `require_alias=True`, which appends an auto-generated alias (`_dbt_limit_subq_{table}`). If the user also has an `AS` alias in their SQL (e.g. `{{ ref('orders') }} AS orders`), the two aliases conflict and produce invalid SQL. Databricks SQL does not require subquery aliases, so `require_alias` should be `False`. Resolves dbt-labs/dbt-adapters#660 for Databricks. ## Test plan - [x] Unit test: `test_render_limited_with_empty_no_alias` — asserts `render_limited()` produces no trailing alias with `limit=0` - [x] Functional test: `TestDatabricksEmptyInlineSourceRef` — end-to-end against live cluster, `dbt run --empty` with inline source alias - [x] Functional test: `TestDatabricksEmpty` — general `--empty` conformance - [x] All 721 existing unit tests pass (0 regressions)
1 parent 8611c72 commit 3d3a87d

File tree

5 files changed

+24
-0
lines changed

5 files changed

+24
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
- Fix `workflow_job` Python model submission method failing with dictionary attribute error ([#1360](https://github.com/databricks/dbt-databricks/issues/1360))
1010
- Fix `TestWorkflowJob` functional test that was unreachable on all profiles due to incorrect skip list, wrong model fixture, and invalid `max_retries` parameter ([#1360](https://github.com/databricks/dbt-databricks/issues/1360))
1111
- Fix column order mismatch in microbatch and replace_where incremental strategies by using INSERT BY NAME syntax ([#1338](https://github.com/databricks/dbt-databricks/issues/1338))
12+
- Fix `dbt run --empty` failing with inline `ref()` / `source()` aliases ([dbt-labs/dbt-adapters#660](https://github.com/dbt-labs/dbt-adapters/issues/660))
1213

1314
## dbt-databricks 1.11.6 (Mar 10, 2026)
1415

dbt/adapters/databricks/relation.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class DatabricksRelation(BaseRelation):
7272
quote_policy: Policy = field(default_factory=lambda: DatabricksQuotePolicy())
7373
include_policy: Policy = field(default_factory=lambda: DatabricksIncludePolicy())
7474
quote_character: str = "`"
75+
require_alias: bool = False
7576
is_delta: Optional[bool] = None
7677
create_constraints: list[TypedConstraint] = field(default_factory=list)
7778
alter_constraints: list[TypedConstraint] = field(default_factory=list)

tests/functional/adapter/empty/__init__.py

Whitespace-only changes.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from dbt.tests.adapter.empty.test_empty import BaseTestEmpty, BaseTestEmptyInlineSourceRef
2+
3+
4+
class TestDatabricksEmpty(BaseTestEmpty):
5+
pass
6+
7+
8+
class TestDatabricksEmptyInlineSourceRef(BaseTestEmptyInlineSourceRef):
9+
pass

tests/unit/test_relation.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,16 @@ def test_render_constraints_for_create__with_constraints(
368368
relation.add_constraint(custom_constraint)
369369
relation.add_constraint(pk_constraint)
370370
assert relation.render_constraints_for_create() == "a > 1, PRIMARY KEY (a)"
371+
372+
373+
class TestDatabricksRenderLimited:
374+
def test_render_limited_with_empty_no_alias(self):
375+
relation = DatabricksRelation.create(
376+
database="test_catalog",
377+
schema="test_schema",
378+
identifier="test_model",
379+
limit=0,
380+
)
381+
result = relation.render_limited()
382+
expected = "(select * from `test_catalog`.`test_schema`.`test_model` where false limit 0)"
383+
assert result == expected

0 commit comments

Comments
 (0)