Skip to content

Commit 077ad0c

Browse files
Fix: Compare columns by using the schema differ based on snapshots dialect (#4595)
1 parent f00d6a8 commit 077ad0c

7 files changed

Lines changed: 141 additions & 136 deletions

File tree

sqlmesh/core/context.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
from sqlmesh.core.plan.definition import UserProvidedFlags
9494
from sqlmesh.core.reference import ReferenceGraph
9595
from sqlmesh.core.scheduler import Scheduler, CompletionStatus
96-
from sqlmesh.core.schema_diff import SchemaDiffer
9796
from sqlmesh.core.schema_loader import create_external_models_file
9897
from sqlmesh.core.selector import Selector
9998
from sqlmesh.core.snapshot import (
@@ -1541,7 +1540,6 @@ def plan_builder(
15411540
),
15421541
end_bounded=not run,
15431542
ensure_finalized_snapshots=self.config.plan.use_finalized_state,
1544-
engine_schema_differ=SchemaDiffer(), # TODO: fix to properly handle it
15451543
interval_end_per_model=max_interval_end_per_model,
15461544
console=self.console,
15471545
user_provided_flags=user_provided_flags,

sqlmesh/core/plan/builder.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121
UserProvidedFlags,
2222
earliest_interval_start,
2323
)
24-
from sqlmesh.core.schema_diff import SchemaDiffer, has_drop_alteration, get_dropped_column_names
24+
from sqlmesh.core.schema_diff import (
25+
get_schema_differ,
26+
has_drop_alteration,
27+
get_dropped_column_names,
28+
)
2529
from sqlmesh.core.snapshot import (
2630
DeployabilityIndex,
2731
Snapshot,
@@ -78,14 +82,12 @@ class PlanBuilder:
7882
ensure_finalized_snapshots: Whether to compare against snapshots from the latest finalized
7983
environment state, or to use whatever snapshots are in the current environment state even if
8084
the environment is not finalized.
81-
engine_schema_differ: Schema differ from the context engine adapter.
8285
interval_end_per_model: The mapping from model FQNs to target end dates.
8386
"""
8487

8588
def __init__(
8689
self,
8790
context_diff: ContextDiff,
88-
engine_schema_differ: SchemaDiffer,
8991
start: t.Optional[TimeLike] = None,
9092
end: t.Optional[TimeLike] = None,
9193
execution_time: t.Optional[TimeLike] = None,
@@ -137,7 +139,6 @@ def __init__(
137139
self._backfill_models = backfill_models
138140
self._end = end or default_end
139141
self._apply = apply
140-
self._engine_schema_differ = engine_schema_differ
141142
self._console = console or get_console()
142143
self._choices: t.Dict[SnapshotId, SnapshotChangeCategory] = {}
143144
self._user_provided_flags = user_provided_flags
@@ -493,7 +494,7 @@ def _check_destructive_changes(self, directly_modified: t.Set[SnapshotId]) -> No
493494
if columns_to_types_all_known(old_columns_to_types) and columns_to_types_all_known(
494495
new_columns_to_types
495496
):
496-
schema_diff = self._engine_schema_differ.compare_columns(
497+
schema_diff = get_schema_differ(snapshot.model.dialect).compare_columns(
497498
new.name,
498499
old_columns_to_types,
499500
new_columns_to_types,

sqlmesh/core/schema_diff.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,5 +723,27 @@ def get_dropped_column_names(alter_expressions: t.List[exp.Alter]) -> t.List[str
723723
return dropped_columns
724724

725725

726+
def get_schema_differ(dialect: str) -> SchemaDiffer:
727+
"""
728+
Returns the appropriate SchemaDiffer for a given dialect without initializing the engine adapter.
729+
730+
Args:
731+
dialect: The dialect for which to get the schema differ.
732+
733+
Returns:
734+
The SchemaDiffer instance configured for the given dialect.
735+
"""
736+
from sqlmesh.core.engine_adapter import (
737+
DIALECT_TO_ENGINE_ADAPTER,
738+
DIALECT_ALIASES,
739+
EngineAdapter,
740+
)
741+
742+
dialect = dialect.lower()
743+
dialect = DIALECT_ALIASES.get(dialect, dialect)
744+
engine_adapter_class = DIALECT_TO_ENGINE_ADAPTER.get(dialect, EngineAdapter)
745+
return getattr(engine_adapter_class, "SCHEMA_DIFFER", SchemaDiffer())
746+
747+
726748
def _get_name_and_type(struct: exp.ColumnDef) -> t.Tuple[exp.Identifier, exp.DataType]:
727749
return struct.this, struct.args["kind"]

tests/core/test_context.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,6 @@ def test_diff(sushi_context: Context, mocker: MockerFixture):
279279

280280
plan = PlanBuilder(
281281
context_diff=sushi_context._context_diff("prod"),
282-
engine_schema_differ=sushi_context.engine_adapter.SCHEMA_DIFFER,
283282
).build()
284283

285284
# stringify used to trigger an unhashable exception due to

0 commit comments

Comments
 (0)