Skip to content

Commit de2b0d6

Browse files
committed
don't recreate RW views during migration
1 parent e4cb63e commit de2b0d6

2 files changed

Lines changed: 66 additions & 13 deletions

File tree

sqlmesh/core/snapshot/evaluator.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
SnapshotIdBatch,
6666
SnapshotInfoLike,
6767
SnapshotTableCleanupTask,
68+
SnapshotChangeCategory,
6869
)
6970
from sqlmesh.core.snapshot.execution_tracker import QueryExecutionTracker
7071
from sqlmesh.utils import random_id, CorrelationId
@@ -2439,20 +2440,27 @@ def migrate(
24392440
**kwargs: t.Any,
24402441
) -> None:
24412442
logger.info("Migrating view '%s'", target_table_name)
2442-
model = snapshot.model
2443-
render_kwargs = dict(
2444-
execution_time=now(), snapshots=kwargs["snapshots"], engine_adapter=self.adapter
2445-
)
2443+
if (
2444+
snapshot.is_forward_only
2445+
or bool(snapshot.model.physical_version)
2446+
or not snapshot.virtual_environment_mode.is_full
2447+
or snapshot.change_category == SnapshotChangeCategory.INDIRECT_NON_BREAKING
2448+
or not self.adapter.COMMENT_CREATION_VIEW.is_unsupported
2449+
):
2450+
model = snapshot.model
2451+
render_kwargs = dict(
2452+
execution_time=now(), snapshots=kwargs["snapshots"], engine_adapter=self.adapter
2453+
)
24462454

2447-
self.adapter.create_view(
2448-
target_table_name,
2449-
model.render_query_or_raise(**render_kwargs),
2450-
model.columns_to_types,
2451-
materialized=self._is_materialized_view(model),
2452-
view_properties=model.render_physical_properties(**render_kwargs),
2453-
table_description=model.description,
2454-
column_descriptions=model.column_descriptions,
2455-
)
2455+
self.adapter.create_view(
2456+
target_table_name,
2457+
model.render_query_or_raise(**render_kwargs),
2458+
model.columns_to_types,
2459+
materialized=self._is_materialized_view(model),
2460+
view_properties=model.render_physical_properties(**render_kwargs),
2461+
table_description=model.description,
2462+
column_descriptions=model.column_descriptions,
2463+
)
24562464

24572465
def delete(self, name: str, **kwargs: t.Any) -> None:
24582466
cascade = kwargs.pop("cascade", False)

tests/core/test_snapshot_evaluator.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
DataObject,
2424
DataObjectType,
2525
InsertOverwriteStrategy,
26+
CommentCreationView,
2627
)
2728
from sqlmesh.core.environment import EnvironmentNamingInfo
2829
from sqlmesh.core.macros import RuntimeStage, macro, MacroEvaluator, MacroFunc
@@ -1497,6 +1498,50 @@ def test_migrate_view(
14971498
)
14981499

14991500

1501+
@pytest.mark.parametrize(
1502+
"change_category",
1503+
[
1504+
SnapshotChangeCategory.BREAKING,
1505+
SnapshotChangeCategory.NON_BREAKING,
1506+
SnapshotChangeCategory.METADATA,
1507+
],
1508+
)
1509+
def test_migrate_view_recreation_not_needed(
1510+
mocker: MockerFixture,
1511+
make_snapshot,
1512+
make_mocked_engine_adapter,
1513+
change_category: SnapshotChangeCategory,
1514+
):
1515+
model = SqlModel(
1516+
name="test_schema.test_model",
1517+
kind=ViewKind(),
1518+
description="my_description",
1519+
query=parse_one("SELECT c, a FROM tbl"),
1520+
)
1521+
snapshot = make_snapshot(model, version="1")
1522+
snapshot.change_category = change_category
1523+
snapshot.forward_only = False
1524+
1525+
adapter = make_mocked_engine_adapter(EngineAdapter)
1526+
adapter.COMMENT_CREATION_VIEW = CommentCreationView.UNSUPPORTED
1527+
adapter.with_settings = lambda **kwargs: adapter
1528+
mocker.patch(
1529+
"sqlmesh.core.engine_adapter.base.EngineAdapter.get_data_objects",
1530+
return_value=[
1531+
DataObject(
1532+
schema="sqlmesh__test_schema",
1533+
name=f"test_schema__test_model__{snapshot.version}",
1534+
type="view",
1535+
)
1536+
],
1537+
)
1538+
1539+
evaluator = SnapshotEvaluator(adapter)
1540+
evaluator.migrate([snapshot], {})
1541+
1542+
adapter.cursor.execute.assert_not_called()
1543+
1544+
15001545
def test_migrate_snapshot_data_object_type_mismatch(
15011546
mocker: MockerFixture,
15021547
make_snapshot,

0 commit comments

Comments
 (0)