Skip to content

Commit 5258915

Browse files
committed
Fix: Skip cleanup of missing physical tables
1 parent 5aacaa8 commit 5258915

2 files changed

Lines changed: 52 additions & 5 deletions

File tree

sqlmesh/core/snapshot/evaluator.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,11 +1073,16 @@ def _cleanup_snapshot(
10731073

10741074
evaluation_strategy = _evaluation_strategy(snapshot, adapter)
10751075
for is_table_deployable, table_name in table_names:
1076-
evaluation_strategy.delete(
1077-
table_name,
1078-
is_table_deployable=is_table_deployable,
1079-
physical_schema=snapshot.physical_schema,
1080-
)
1076+
# Use `get_data_object` to check if the table exists instead of `table_exists` since the former
1077+
# is based on `INFORMATION_SCHEMA` and avoids touching the table directly.
1078+
# This is important when the table name is malformed for some reason and running any statement
1079+
# that touches the table would result in an error.
1080+
if adapter.get_data_object(table_name) is not None:
1081+
evaluation_strategy.delete(
1082+
table_name,
1083+
is_table_deployable=is_table_deployable,
1084+
physical_schema=snapshot.physical_schema,
1085+
)
10811086

10821087
if on_complete is not None:
10831088
on_complete(table_name)

tests/core/test_snapshot_evaluator.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,12 +438,23 @@ def create_and_cleanup(name: str, dev_table_only: bool):
438438
return snapshot
439439

440440
snapshot = create_and_cleanup("catalog.test_schema.test_model", True)
441+
adapter_mock.get_data_object.assert_called_once_with(
442+
f"catalog.sqlmesh__test_schema.test_schema__test_model__{snapshot.fingerprint.to_version()}__dev"
443+
)
441444
adapter_mock.drop_table.assert_called_once_with(
442445
f"catalog.sqlmesh__test_schema.test_schema__test_model__{snapshot.fingerprint.to_version()}__dev"
443446
)
444447
adapter_mock.reset_mock()
445448

446449
snapshot = create_and_cleanup("test_schema.test_model", False)
450+
adapter_mock.get_data_object.assert_has_calls(
451+
[
452+
call(
453+
f"sqlmesh__test_schema.test_schema__test_model__{snapshot.fingerprint.to_version()}__dev"
454+
),
455+
call(f"sqlmesh__test_schema.test_schema__test_model__{snapshot.version}"),
456+
]
457+
)
447458
adapter_mock.drop_table.assert_has_calls(
448459
[
449460
call(
@@ -455,6 +466,12 @@ def create_and_cleanup(name: str, dev_table_only: bool):
455466
adapter_mock.reset_mock()
456467

457468
snapshot = create_and_cleanup("test_model", False)
469+
adapter_mock.get_data_object.assert_has_calls(
470+
[
471+
call(f"sqlmesh__default.test_model__{snapshot.fingerprint.to_version()}__dev"),
472+
call(f"sqlmesh__default.test_model__{snapshot.version}"),
473+
]
474+
)
458475
adapter_mock.drop_table.assert_has_calls(
459476
[
460477
call(f"sqlmesh__default.test_model__{snapshot.fingerprint.to_version()}__dev"),
@@ -463,6 +480,31 @@ def create_and_cleanup(name: str, dev_table_only: bool):
463480
)
464481

465482

483+
def test_cleanup_skip_missing_table(adapter_mock, make_snapshot):
484+
adapter_mock.get_data_object.return_value = None
485+
486+
evaluator = SnapshotEvaluator(adapter_mock)
487+
488+
model = SqlModel(
489+
name="catalog.test_schema.test_model",
490+
kind=IncrementalByTimeRangeKind(time_column="a"),
491+
storage_format="parquet",
492+
query=parse_one("SELECT a FROM tbl WHERE ds BETWEEN @start_ds and @end_ds"),
493+
)
494+
495+
snapshot = make_snapshot(model)
496+
snapshot.categorize_as(SnapshotChangeCategory.BREAKING, forward_only=True)
497+
snapshot.version = "test_version"
498+
499+
evaluator.promote([snapshot], EnvironmentNamingInfo(name="test_env"))
500+
evaluator.cleanup([SnapshotTableCleanupTask(snapshot=snapshot.table_info, dev_table_only=True)])
501+
502+
adapter_mock.get_data_object.assert_called_once_with(
503+
f"catalog.sqlmesh__test_schema.test_schema__test_model__{snapshot.fingerprint.to_version()}__dev"
504+
)
505+
adapter_mock.drop_table.assert_not_called()
506+
507+
466508
def test_cleanup_external_model(mocker: MockerFixture, adapter_mock, make_snapshot):
467509
evaluator = SnapshotEvaluator(adapter_mock)
468510

0 commit comments

Comments
 (0)