|
18 | 18 | from sqlmesh.dbt.target import BigQueryConfig, SnowflakeConfig
|
19 | 19 | from sqlmesh.utils.errors import ConfigError
|
20 | 20 | from sqlmesh.utils.jinja import JinjaMacroRegistry
|
| 21 | +from sqlmesh.core.schema_diff import SchemaDiffer, TableAlterChangeColumnTypeOperation |
21 | 22 |
|
22 | 23 | pytestmark = pytest.mark.dbt
|
23 | 24 |
|
@@ -349,3 +350,81 @@ def test_adapter_get_relation_normalization(
|
349 | 350 | renderer("{{ adapter.list_relations(database=None, schema='foo') }}")
|
350 | 351 | == '[<SnowflakeRelation "memory"."FOO"."BAR">]'
|
351 | 352 | )
|
| 353 | + |
| 354 | + |
| 355 | +def test_adapter_expand_target_column_types( |
| 356 | + sushi_test_project: Project, runtime_renderer: t.Callable, mocker: MockerFixture |
| 357 | +): |
| 358 | + from sqlmesh.core.engine_adapter.base import DataObject, DataObjectType |
| 359 | + |
| 360 | + data_object_from = DataObject( |
| 361 | + catalog="test", schema="foo", name="from_table", type=DataObjectType.TABLE |
| 362 | + ) |
| 363 | + data_object_to = DataObject( |
| 364 | + catalog="test", schema="foo", name="to_table", type=DataObjectType.TABLE |
| 365 | + ) |
| 366 | + from_columns = { |
| 367 | + "int_col": exp.DataType.build("int"), |
| 368 | + "same_text_col": exp.DataType.build("varchar(1)"), # varchar(1) -> varchar(1) |
| 369 | + "unexpandable_text_col": exp.DataType.build("varchar(2)"), # varchar(4) -> varchar(2) |
| 370 | + "expandable_text_col1": exp.DataType.build("varchar(16)"), # varchar(8) -> varchar(16) |
| 371 | + "expandable_text_col2": exp.DataType.build("varchar(64)"), # varchar(32) -> varchar(64) |
| 372 | + } |
| 373 | + to_columns = { |
| 374 | + "int_col": exp.DataType.build("int"), |
| 375 | + "same_text_col": exp.DataType.build("varchar(1)"), |
| 376 | + "unexpandable_text_col": exp.DataType.build("varchar(4)"), |
| 377 | + "expandable_text_col1": exp.DataType.build("varchar(8)"), |
| 378 | + "expandable_text_col2": exp.DataType.build("varchar(32)"), |
| 379 | + } |
| 380 | + adapter_mock = mocker.MagicMock() |
| 381 | + adapter_mock.default_catalog = "test" |
| 382 | + adapter_mock.get_data_object.side_effect = [data_object_from, data_object_to] |
| 383 | + # columns() is called 4 times, twice by adapter.get_columns_in_relation() and twice by the engine_adapter |
| 384 | + adapter_mock.columns.side_effect = [ |
| 385 | + from_columns, |
| 386 | + to_columns, |
| 387 | + from_columns, |
| 388 | + to_columns, |
| 389 | + ] |
| 390 | + adapter_mock.schema_differ = SchemaDiffer() |
| 391 | + |
| 392 | + context = sushi_test_project.context |
| 393 | + renderer = runtime_renderer(context, engine_adapter=adapter_mock) |
| 394 | + |
| 395 | + renderer(""" |
| 396 | + {%- set from_relation = adapter.get_relation( |
| 397 | + database=None, |
| 398 | + schema='foo', |
| 399 | + identifier='from_table') -%} |
| 400 | +
|
| 401 | + {% set to_relation = adapter.get_relation( |
| 402 | + database=None, |
| 403 | + schema='foo', |
| 404 | + identifier='to_table') -%} |
| 405 | +
|
| 406 | + {% do adapter.expand_target_column_types(from_relation, to_relation) %} |
| 407 | + """) |
| 408 | + adapter_mock.get_data_object.assert_has_calls( |
| 409 | + [ |
| 410 | + call(exp.to_table('"test"."foo"."from_table"')), |
| 411 | + call(exp.to_table('"test"."foo"."to_table"')), |
| 412 | + ] |
| 413 | + ) |
| 414 | + assert len(adapter_mock.alter_table.call_args.args) == 1 |
| 415 | + alter_expressions = adapter_mock.alter_table.call_args.args[0] |
| 416 | + assert len(alter_expressions) == 2 |
| 417 | + alter_operation1 = alter_expressions[0] |
| 418 | + assert isinstance(alter_operation1, TableAlterChangeColumnTypeOperation) |
| 419 | + assert alter_operation1.expression == parse_one( |
| 420 | + """ALTER TABLE "test"."foo"."to_table" |
| 421 | + ALTER COLUMN expandable_text_col1 |
| 422 | + SET DATA TYPE VARCHAR(16)""" |
| 423 | + ) |
| 424 | + alter_operation2 = alter_expressions[1] |
| 425 | + assert isinstance(alter_operation2, TableAlterChangeColumnTypeOperation) |
| 426 | + assert alter_operation2.expression == parse_one( |
| 427 | + """ALTER TABLE "test"."foo"."to_table" |
| 428 | + ALTER COLUMN expandable_text_col2 |
| 429 | + SET DATA TYPE VARCHAR(64)""" |
| 430 | + ) |
0 commit comments