|
10 | 10 | from sqlmesh.core.dialect import normalize_model_name |
11 | 11 | from sqlmesh.core.engine_adapter import SnowflakeEngineAdapter |
12 | 12 | from sqlmesh.core.engine_adapter.base import EngineAdapter |
13 | | -from sqlmesh.core.engine_adapter.shared import DataObjectType |
| 13 | +from sqlmesh.core.engine_adapter.shared import DataObject, DataObjectType |
14 | 14 | from sqlmesh.core.model import load_sql_based_model |
15 | 15 | from sqlmesh.core.model.definition import SqlModel |
16 | 16 | from sqlmesh.core.node import IntervalUnit |
@@ -1049,6 +1049,45 @@ def test_alter_table_iceberg(mocker: MockerFixture, make_mocked_engine_adapter: |
1049 | 1049 | assert to_sql_calls(adapter) == ['ALTER TABLE "test_table" ADD "b" INT'] |
1050 | 1050 |
|
1051 | 1051 |
|
| 1052 | +def test_alter_table_drops_clustering_key_before_drop_column( |
| 1053 | + mocker: MockerFixture, make_mocked_engine_adapter: t.Callable |
| 1054 | +): |
| 1055 | + mocker.patch("sqlmesh.core.engine_adapter.snowflake.SnowflakeEngineAdapter.set_current_catalog") |
| 1056 | + adapter = make_mocked_engine_adapter(SnowflakeEngineAdapter, default_catalog="test_catalog") |
| 1057 | + |
| 1058 | + current_table = {"a": "INT", "b": "INT"} |
| 1059 | + target_table = {"a": "INT"} |
| 1060 | + adapter.columns = lambda table_name, **kwargs: { |
| 1061 | + k: exp.DataType.build(v) |
| 1062 | + for k, v in (current_table if table_name == "test_table" else target_table).items() |
| 1063 | + } |
| 1064 | + |
| 1065 | + def _get_data_objects(schema_name, object_names=None, **kwargs): |
| 1066 | + table_name = next(iter(object_names or [])) |
| 1067 | + return [ |
| 1068 | + DataObject( |
| 1069 | + catalog="test_catalog", |
| 1070 | + schema="test_schema", |
| 1071 | + name=table_name, |
| 1072 | + type=DataObjectType.TABLE, |
| 1073 | + # the current table is clustered by the column being dropped |
| 1074 | + clustering_key='"b"' if table_name == "test_table" else None, |
| 1075 | + ) |
| 1076 | + ] |
| 1077 | + |
| 1078 | + mocker.patch.object(adapter, "get_data_objects", side_effect=_get_data_objects) |
| 1079 | + |
| 1080 | + alter_operations = adapter.get_alter_operations("test_table", "target_table") |
| 1081 | + adapter.alter_table(alter_operations) |
| 1082 | + |
| 1083 | + # Snowflake rejects dropping a column that belongs to a clustering key, so the |
| 1084 | + # clustering key must be dropped before the column is dropped. |
| 1085 | + assert to_sql_calls(adapter) == [ |
| 1086 | + 'ALTER TABLE "test_table" DROP CLUSTERING KEY', |
| 1087 | + 'ALTER TABLE "test_table" DROP COLUMN "b"', |
| 1088 | + ] |
| 1089 | + |
| 1090 | + |
1052 | 1091 | def test_create_view_with_schema_and_grants( |
1053 | 1092 | snowflake_mocked_engine_adapter: SnowflakeEngineAdapter, |
1054 | 1093 | ): |
|
0 commit comments