Skip to content

Commit ad5ce8d

Browse files
authored
Feat: Add support for dbt adapter method quote_as_configured (#2970)
1 parent 6d1c54b commit ad5ce8d

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

sqlmesh/dbt/adapter.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,15 @@ def __init__(
3030
jinja_macros: JinjaMacroRegistry,
3131
jinja_globals: t.Optional[t.Dict[str, t.Any]] = None,
3232
project_dialect: t.Optional[str] = None,
33+
quote_policy: t.Optional[Policy] = None,
3334
):
35+
from dbt.adapters.base.relation import Policy
36+
3437
self.jinja_macros = jinja_macros
3538
self.jinja_globals = jinja_globals.copy() if jinja_globals else {}
3639
self.jinja_globals["adapter"] = self
3740
self.project_dialect = project_dialect
41+
self.quote_policy = quote_policy or Policy()
3842

3943
@abc.abstractmethod
4044
def get_relation(self, database: str, schema: str, identifier: str) -> t.Optional[BaseRelation]:
@@ -95,6 +99,10 @@ def quote(self, identifier: str) -> str:
9599
"""Returns a quoted identifier."""
96100
return exp.to_column(identifier).sql(dialect=self.project_dialect, identify=True)
97101

102+
def quote_as_configured(self, value: str, component_type: str) -> str:
103+
"""Returns the value quoted according to the quote policy."""
104+
return self.quote(value) if getattr(self.quote_policy, component_type, False) else value
105+
98106
def dispatch(self, name: str, package: t.Optional[str] = None) -> t.Callable:
99107
"""Returns a dialect-specific version of a macro with the given name."""
100108
target_type = self.jinja_globals["target"]["type"]
@@ -216,20 +224,19 @@ def __init__(
216224
):
217225
from dbt.adapters.base import BaseRelation
218226
from dbt.adapters.base.column import Column
219-
from dbt.adapters.base.relation import Policy
220227

221228
super().__init__(
222229
jinja_macros,
223230
jinja_globals=jinja_globals,
224231
project_dialect=project_dialect or engine_adapter.dialect,
232+
quote_policy=quote_policy,
225233
)
226234

227235
table_mapping = table_mapping or {}
228236

229237
self.engine_adapter = engine_adapter
230238
self.relation_type = relation_type or BaseRelation
231239
self.column_type = column_type or Column
232-
self.quote_policy = quote_policy or Policy()
233240
self.table_mapping = {
234241
**to_table_mapping((snapshots or {}).values(), deployability_index),
235242
**table_mapping,

sqlmesh/dbt/builtin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ def create_builtin_globals(
382382
jinja_macros,
383383
jinja_globals={**builtin_globals, **jinja_globals},
384384
project_dialect=project_dialect,
385+
quote_policy=api.quote_policy,
385386
)
386387

387388
sql_execution = SQLExecution(adapter)

tests/dbt/test_adapter.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
from sqlmesh import Context
1515
from sqlmesh.core.dialect import schema_
1616
from sqlmesh.core.snapshot import SnapshotId
17+
from sqlmesh.dbt.adapter import ParsetimeAdapter
1718
from sqlmesh.dbt.project import Project
1819
from sqlmesh.dbt.relation import Policy
1920
from sqlmesh.dbt.target import SnowflakeConfig
2021
from sqlmesh.utils.errors import ConfigError
22+
from sqlmesh.utils.jinja import JinjaMacroRegistry
2123

2224
pytestmark = pytest.mark.dbt
2325

@@ -257,3 +259,14 @@ def test_feature_flag_scd_type_2(copy_to_temp_path, caplog):
257259
"Skipping loading Snapshot (SCD Type 2) models due to the feature flag disabling this feature"
258260
in caplog.text
259261
)
262+
263+
264+
def test_quote_as_configured():
265+
adapter = ParsetimeAdapter(
266+
JinjaMacroRegistry(),
267+
project_dialect="duckdb",
268+
quote_policy=Policy(schema=False, identifier=True),
269+
)
270+
adapter.quote_as_configured("foo", "identifier") == '"foo"'
271+
adapter.quote_as_configured("foo", "schema") == "foo"
272+
adapter.quote_as_configured("foo", "database") == "foo"

0 commit comments

Comments
 (0)