Skip to content

Commit c47bf45

Browse files
authored
Fix: Use end-bounded missing intervals when checking for gaps during the promotion (#2424)
1 parent f1b5f8f commit c47bf45

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

sqlmesh/core/state_sync/common.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,9 @@ def _ensure_no_gaps(
293293
end = prev_snapshot.intervals[-1][1]
294294

295295
if start < end:
296-
missing_intervals = target_snapshot.missing_intervals(start, end)
296+
missing_intervals = target_snapshot.missing_intervals(
297+
start, end, end_bounded=True
298+
)
297299

298300
if missing_intervals:
299301
raise SQLMeshError(

tests/core/test_state_sync.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import duckdb
77
import pandas as pd
88
import pytest
9+
from freezegun import freeze_time
910
from pytest_mock.plugin import MockerFixture
1011
from sqlglot import exp
1112

@@ -833,6 +834,36 @@ def test_promote_snapshots_no_gaps(state_sync: EngineAdapterStateSync, make_snap
833834
)
834835

835836

837+
@freeze_time("2023-01-08 16:00:00")
838+
def test_promote_snapshots_no_gaps_lookback(
839+
state_sync: EngineAdapterStateSync, make_snapshot: t.Callable
840+
):
841+
model = SqlModel(
842+
name="a",
843+
cron="@hourly",
844+
query=parse_one("select 1, ds"),
845+
kind=IncrementalByTimeRangeKind(time_column="ds", lookback=1),
846+
start="2023-01-01",
847+
)
848+
849+
snapshot = make_snapshot(model, version="a")
850+
snapshot.change_category = SnapshotChangeCategory.BREAKING
851+
state_sync.push_snapshots([snapshot])
852+
state_sync.add_interval(snapshot, "2023-01-01", "2023-01-08 15:00:00")
853+
promote_snapshots(state_sync, [snapshot], "prod", no_gaps=True)
854+
855+
assert now_timestamp() == to_timestamp("2023-01-08 16:00:00")
856+
857+
new_snapshot_same_version = make_snapshot(model, version="b")
858+
new_snapshot_same_version.change_category = SnapshotChangeCategory.BREAKING
859+
new_snapshot_same_version.fingerprint = snapshot.fingerprint.copy(
860+
update={"data_hash": "new_snapshot_same_version"}
861+
)
862+
state_sync.push_snapshots([new_snapshot_same_version])
863+
state_sync.add_interval(new_snapshot_same_version, "2023-01-01", "2023-01-08 15:00:00")
864+
promote_snapshots(state_sync, [new_snapshot_same_version], "prod", no_gaps=True)
865+
866+
836867
def test_finalize(state_sync: EngineAdapterStateSync, make_snapshot: t.Callable):
837868
snapshot_a = make_snapshot(
838869
SqlModel(

0 commit comments

Comments
 (0)