Skip to content

Commit 8a7edf8

Browse files
committed
fix: load materializations before destroy invalidates environments
Signed-off-by: lafirm <136463254+lafirm@users.noreply.github.com>
1 parent c5ad0fb commit 8a7edf8

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

‎sqlmesh/core/context.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3158,6 +3158,9 @@ def _context_diff(
31583158
)
31593159

31603160
def _destroy(self) -> bool:
3161+
# Load materializations before any state writes so a failure aborts destroy without invalidating environments
3162+
self._load_materializations()
3163+
31613164
# Invalidate all environments, including prod
31623165
for environment in self.state_reader.get_environments():
31633166
self.state_sync.invalidate_environment(name=environment.name, protect_prod=False)

‎tests/core/integration/test_aux_commands.py‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,26 @@ def test_run_loads_materializations_once(init_and_plan_context: t.Callable, mock
110110
assert loader_spy.call_count == 1
111111

112112

113+
@time_machine.travel("2023-01-08 15:00:00 UTC")
114+
def test_destroy_fails_before_invalidating_environments_on_materialization_error(
115+
init_and_plan_context: t.Callable, mocker: MockerFixture
116+
):
117+
context, plan = init_and_plan_context("examples/sushi")
118+
context.apply(plan)
119+
assert context.state_reader.get_environment("prod").expiration_ts is None
120+
121+
for loader in context._loaders:
122+
mocker.patch.object(
123+
loader, "load_materializations", side_effect=SQLMeshError("broken materialization")
124+
)
125+
context._materializations_loaded = False
126+
127+
with pytest.raises(SQLMeshError, match="broken materialization"):
128+
context._destroy()
129+
130+
assert context.state_reader.get_environment("prod").expiration_ts is None
131+
132+
113133
def test_janitor_loads_materialization(tmp_path: Path):
114134
config_file_path = Path("config.yaml")
115135
database = tmp_path / "janitor_test.duckdb"

0 commit comments

Comments
 (0)