Skip to content

Commit 93a19a5

Browse files
committed
Fix: Use the default dialect when constructing a table mapping key in the dbt adapter (#2853)
1 parent 9b2c3b1 commit 93a19a5

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

sqlmesh/dbt/adapter.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import pandas as pd
88
from sqlglot import exp, parse_one
9+
from sqlglot.optimizer.qualify_columns import quote_identifiers
910

1011
from sqlmesh.core.dialect import normalize_and_quote, normalize_model_name
1112
from sqlmesh.core.engine_adapter import EngineAdapter
@@ -323,7 +324,9 @@ def resolve_identifier(self, relation: BaseRelation) -> t.Optional[str]:
323324
return identifier if identifier else None
324325

325326
def _map_table_name(self, table: exp.Table) -> exp.Table:
326-
name = table.sql(dialect=self.project_dialect)
327+
# Use the default dialect since this is the dialect used to normalize and quote keys in the
328+
# mapping table.
329+
name = quote_identifiers(table, dialect=self.project_dialect).sql()
327330
physical_table_name = self.table_mapping.get(name)
328331
if not physical_table_name:
329332
return table

tests/dbt/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def sushi_test_project(sushi_test_dbt_context: Context) -> Project:
1717
@pytest.fixture()
1818
def runtime_renderer() -> t.Callable:
1919
def create_renderer(context: DbtContext, **kwargs: t.Any) -> t.Callable:
20-
environment = context.jinja_macros.build_environment(**context.jinja_globals, **kwargs)
20+
environment = context.jinja_macros.build_environment(**{**context.jinja_globals, **kwargs})
2121

2222
def render(value: str) -> str:
2323
return environment.from_string(value).render()

tests/dbt/test_adapter.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from dbt.adapters.base import BaseRelation
1010
from dbt.adapters.base.column import Column
1111
from pytest_mock.plugin import MockerFixture
12-
from sqlglot import exp
12+
from sqlglot import exp, parse_one
1313

1414
from sqlmesh import Context
1515
from sqlmesh.core.dialect import schema_
@@ -169,8 +169,12 @@ def test_adapter_dispatch(sushi_test_project: Project, runtime_renderer: t.Calla
169169
renderer("{{ adapter.dispatch('current_engine')() }}")
170170

171171

172+
@pytest.mark.parametrize("project_dialect", ["duckdb", "bigquery"])
172173
def test_adapter_map_snapshot_tables(
173-
sushi_test_project: Project, runtime_renderer: t.Callable, mocker: MockerFixture
174+
sushi_test_project: Project,
175+
runtime_renderer: t.Callable,
176+
mocker: MockerFixture,
177+
project_dialect: str,
174178
):
175179
snapshot_mock = mocker.Mock()
176180
snapshot_mock.name = '"memory"."test_db"."test_model"'
@@ -191,6 +195,7 @@ def test_adapter_map_snapshot_tables(
191195
test_model=BaseRelation.create(schema="test_db", identifier="test_model"),
192196
foo_bar=BaseRelation.create(schema="foo", identifier="bar"),
193197
default_catalog="memory",
198+
dialect=project_dialect,
194199
)
195200

196201
engine_adapter.create_schema("foo")
@@ -203,18 +208,24 @@ def test_adapter_map_snapshot_tables(
203208
table_name="foo.bar", columns_to_types={"col": exp.DataType.build("int")}
204209
)
205210

211+
expected_test_model_table_name = parse_one('"memory"."sqlmesh"."test_db__test_model"').sql(
212+
dialect=project_dialect
213+
)
214+
206215
assert (
207216
renderer(
208217
"{{ adapter.get_relation(database=none, schema='test_db', identifier='test_model') }}"
209218
)
210-
== '"memory"."sqlmesh"."test_db__test_model"'
219+
== expected_test_model_table_name
211220
)
212221

213222
assert "baz" in renderer("{{ run_query('SELECT * FROM test_db.test_model') }}")
214223

224+
expected_foo_bar_table_name = parse_one('"memory"."foo"."bar"').sql(dialect=project_dialect)
225+
215226
assert (
216227
renderer("{{ adapter.get_relation(database=none, schema='foo', identifier='bar') }}")
217-
== '"memory"."foo"."bar"'
228+
== expected_foo_bar_table_name
218229
)
219230

220231
assert renderer("{{ adapter.resolve_schema(test_model) }}") == "sqlmesh"

0 commit comments

Comments
 (0)