From 6a636731576952f449d1507659ed1894533308ef Mon Sep 17 00:00:00 2001 From: Iaroslav Zeigerman Date: Mon, 31 Mar 2025 22:42:04 -0700 Subject: [PATCH] Fix: Pass the model dialect when computing a hash for the column types --- sqlmesh/core/model/definition.py | 2 +- .../v0077_fix_column_type_hash_calculation.py | 5 +++++ tests/core/test_model.py | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 sqlmesh/migrations/v0077_fix_column_type_hash_calculation.py diff --git a/sqlmesh/core/model/definition.py b/sqlmesh/core/model/definition.py index 60748f1dd5..c48fb74015 100644 --- a/sqlmesh/core/model/definition.py +++ b/sqlmesh/core/model/definition.py @@ -1051,7 +1051,7 @@ def _data_hash_values(self) -> t.List[str]: for column_name, column_type in (self.columns_to_types_ or {}).items(): data.append(column_name) - data.append(column_type.sql()) + data.append(column_type.sql(dialect=self.dialect)) for key, value in (self.physical_properties or {}).items(): data.append(key) diff --git a/sqlmesh/migrations/v0077_fix_column_type_hash_calculation.py b/sqlmesh/migrations/v0077_fix_column_type_hash_calculation.py new file mode 100644 index 0000000000..67dc460497 --- /dev/null +++ b/sqlmesh/migrations/v0077_fix_column_type_hash_calculation.py @@ -0,0 +1,5 @@ +"""Use the model's dialect when calculating the hash for the column types.""" + + +def migrate(state_sync, **kwargs): # type: ignore + pass diff --git a/tests/core/test_model.py b/tests/core/test_model.py index badb628c7f..3f3e771260 100644 --- a/tests/core/test_model.py +++ b/tests/core/test_model.py @@ -8435,3 +8435,20 @@ def test_ignored_rules_serialization(): deserialized_model = SqlModel.parse_raw(model_json) assert deserialized_model.dict() == model.dict() + + +def test_data_hash_unchanged_when_column_type_uses_default_dialect(): + model = create_sql_model( + "foo", + parse_one("SELECT * FROM bla"), + columns={"a": exp.DataType.build("int")}, + dialect="bigquery", + ) + + deserialized_model = SqlModel.parse_raw(model.json()) + + assert model.columns_to_types_ == {"a": exp.DataType.build("int")} + assert deserialized_model.columns_to_types_ == {"a": exp.DataType.build("bigint")} + + # int == int64 in bigquery + assert model.data_hash == deserialized_model.data_hash