Skip to content

Commit de66859

Browse files
authored
Merge branch 'main' into lint-scope-schema-resolution
2 parents e057958 + bc76e47 commit de66859

7 files changed

Lines changed: 79 additions & 6 deletions

File tree

sqlmesh/core/engine_adapter/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ def with_settings(self, **kwargs: t.Any) -> EngineAdapter:
178178
"query_execution_tracker": kwargs.pop(
179179
"query_execution_tracker", self._query_execution_tracker
180180
),
181+
"pre_ping": kwargs.pop("pre_ping", self._pre_ping),
181182
**self._extra_config,
182183
**kwargs,
183184
}

sqlmesh/core/engine_adapter/clickhouse.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ def _build_table_properties_exp(
850850
primary_key_vals = []
851851
if isinstance(primary_key, (exp.Tuple, exp.Array)):
852852
primary_key_vals = primary_key.expressions
853-
if isinstance(ordered_by_raw, exp.Paren):
853+
if isinstance(primary_key, exp.Paren):
854854
primary_key_vals = [primary_key.this]
855855

856856
if not primary_key_vals:

sqlmesh/core/schema_loader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def create_external_models_file(
4545
external_model_fqns = set()
4646

4747
for fqn, model in models.items():
48-
if model.kind.is_external:
48+
if model.kind.is_external and model._path == path:
4949
external_model_fqns.add(fqn)
5050
for dep in model.depends_on:
5151
if dep not in known_models:

tests/core/engine_adapter/test_base.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3522,6 +3522,15 @@ def test_pre_ping(mocker: MockerFixture, make_mocked_engine_adapter: t.Callable)
35223522
adapter._connection_pool.get().close.assert_called_once()
35233523

35243524

3525+
def test_with_settings_preserves_pre_ping(make_mocked_engine_adapter: t.Callable):
3526+
adapter = make_mocked_engine_adapter(EngineAdapter, pre_ping=True)
3527+
assert adapter.with_settings()._pre_ping is True
3528+
assert adapter.with_settings(pre_ping=False)._pre_ping is False
3529+
3530+
adapter = make_mocked_engine_adapter(EngineAdapter)
3531+
assert adapter.with_settings()._pre_ping is False
3532+
3533+
35253534
@pytest.mark.parametrize(
35263535
"partitioned_by",
35273536
[

tests/core/engine_adapter/test_clickhouse.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,25 @@ def build_properties_sql(storage_format="", order_by="", primary_key="", propert
305305
== "ENGINE=MergeTree ORDER BY (a) PRIMARY KEY (a)"
306306
)
307307

308+
# A parenthesized single-column PRIMARY_KEY must be unwrapped regardless of the
309+
# ORDER_BY shape. Previously the PRIMARY_KEY branch checked ORDER_BY's expression,
310+
# so pairing PRIMARY_KEY = (a) with a non-parenthesized ORDER_BY emitted the
311+
# malformed "PRIMARY KEY ((a))".
312+
assert (
313+
build_properties_sql(order_by="ORDER_BY = a,", primary_key="PRIMARY_KEY = (a)")
314+
== "ENGINE=MergeTree ORDER BY (a) PRIMARY KEY (a)"
315+
)
316+
317+
assert (
318+
build_properties_sql(order_by="ORDER_BY = (a, b),", primary_key="PRIMARY_KEY = (a)")
319+
== "ENGINE=MergeTree ORDER BY (a, b) PRIMARY KEY (a)"
320+
)
321+
322+
assert (
323+
build_properties_sql(primary_key="PRIMARY_KEY = (a)")
324+
== "ENGINE=MergeTree ORDER BY () PRIMARY KEY (a)"
325+
)
326+
308327
assert build_properties_sql(order_by="ORDER_BY = a + 1,") == "ENGINE=MergeTree ORDER BY (a + 1)"
309328

310329
assert (

tests/core/test_schema_loader.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,53 @@ def _load_external_models():
305305
assert len(_load_external_models()) == 1
306306

307307

308+
def test_create_external_models_skips_models_from_external_models_directory(tmp_path: Path):
309+
config = Config(gateways={"": GatewayConfig(connection=DuckDBConnectionConfig())})
310+
311+
model_dir = tmp_path / c.MODELS
312+
model_dir.mkdir()
313+
314+
with open(model_dir / "table.sql", "w", encoding="utf8") as fd:
315+
fd.write(
316+
"""
317+
MODEL (
318+
name lake.table,
319+
kind FULL,
320+
);
321+
322+
SELECT * FROM landing.source_table
323+
""",
324+
)
325+
326+
external_models_dir = tmp_path / c.EXTERNAL_MODELS
327+
external_models_dir.mkdir()
328+
329+
with open(external_models_dir / "source_table.yaml", "w", encoding="utf8") as fd:
330+
yaml.dump(
331+
[
332+
{
333+
"name": "landing.source_table",
334+
"columns": {"a": "int"},
335+
}
336+
],
337+
fd,
338+
)
339+
340+
ctx = Context(paths=[tmp_path], config=config)
341+
ctx.engine_adapter.execute("create schema landing")
342+
ctx.engine_adapter.execute("create table landing.source_table as select 1 as a")
343+
ctx.engine_adapter.execute("create schema lake")
344+
345+
ctx.create_external_models()
346+
347+
assert yaml.load(tmp_path / c.EXTERNAL_MODELS_YAML) == []
348+
349+
ctx.load()
350+
external_models = [model for model in ctx.models.values() if isinstance(model, ExternalModel)]
351+
assert len(external_models) == 1
352+
assert external_models[0].fqn == '"memory"."landing"."source_table"'
353+
354+
308355
def test_no_internal_model_conversion(tmp_path: Path, mocker: MockerFixture):
309356
engine_adapter_mock = mocker.Mock()
310357
engine_adapter_mock.columns.return_value = {

tests/integrations/jupyter/test_magics.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -807,10 +807,7 @@ def test_create_external_models(notebook, loaded_sushi_context, convert_all_html
807807

808808
assert not output.stdout
809809
assert not output.stderr
810-
assert len(output.outputs) == 2
811-
converted = sorted(convert_all_html_output_to_text(output))
812-
assert 'Unable to get schema for \'"memory"."raw"."model1"\'' in converted[0]
813-
assert 'Unable to get schema for \'"memory"."raw"."model2"\'' in converted[1]
810+
assert len(output.outputs) == 0
814811

815812
assert external_model_file.exists()
816813
assert (

0 commit comments

Comments
 (0)