|
11 | 11 | from sqlmesh.core.model import load_sql_based_model |
12 | 12 | from sqlmesh.core.model.definition import SqlModel |
13 | 13 | from sqlmesh.core.dialect import schema_ |
| 14 | +from sqlmesh.utils.date import to_ds |
14 | 15 | from sqlmesh.utils.errors import SQLMeshError |
15 | 16 | from tests.core.engine_adapter import to_sql_calls |
16 | 17 |
|
@@ -683,3 +684,74 @@ def test_replace_table_catalog_support( |
683 | 684 | sql_calls[0] |
684 | 685 | == f'CREATE TABLE IF NOT EXISTS "{catalog_name}"."schema"."test_table" AS SELECT 1 AS "col"' |
685 | 686 | ) |
| 687 | + |
| 688 | + |
| 689 | +@pytest.mark.parametrize( |
| 690 | + "catalog_type_overrides", [{}, {"my_catalog": "hive"}, {"other_catalog": "iceberg"}] |
| 691 | +) |
| 692 | +def test_insert_overwrite_time_partition_hive( |
| 693 | + make_mocked_engine_adapter: t.Callable, catalog_type_overrides: t.Dict[str, str] |
| 694 | +): |
| 695 | + config = TrinoConnectionConfig( |
| 696 | + user="user", |
| 697 | + host="host", |
| 698 | + catalog="catalog", |
| 699 | + catalog_type_overrides=catalog_type_overrides, |
| 700 | + ) |
| 701 | + adapter: TrinoEngineAdapter = make_mocked_engine_adapter( |
| 702 | + TrinoEngineAdapter, catalog_type_overrides=config.catalog_type_overrides |
| 703 | + ) |
| 704 | + adapter.fetchone = MagicMock(return_value=None) # type: ignore |
| 705 | + |
| 706 | + adapter.insert_overwrite_by_time_partition( |
| 707 | + table_name=".".join(["my_catalog", "schema", "test_table"]), |
| 708 | + query_or_df=parse_one("SELECT a, b FROM tbl"), |
| 709 | + start="2022-01-01", |
| 710 | + end="2022-01-02", |
| 711 | + time_column="b", |
| 712 | + time_formatter=lambda x, _: exp.Literal.string(to_ds(x)), |
| 713 | + target_columns_to_types={"a": exp.DataType.build("INT"), "b": exp.DataType.build("STRING")}, |
| 714 | + ) |
| 715 | + |
| 716 | + assert to_sql_calls(adapter) == [ |
| 717 | + "SET SESSION my_catalog.insert_existing_partitions_behavior='OVERWRITE'", |
| 718 | + 'INSERT INTO "my_catalog"."schema"."test_table" ("a", "b") SELECT "a", "b" FROM (SELECT "a", "b" FROM "tbl") AS "_subquery" WHERE "b" BETWEEN \'2022-01-01\' AND \'2022-01-02\'', |
| 719 | + "SET SESSION my_catalog.insert_existing_partitions_behavior='APPEND'", |
| 720 | + ] |
| 721 | + |
| 722 | + |
| 723 | +@pytest.mark.parametrize( |
| 724 | + "catalog_type_overrides", |
| 725 | + [ |
| 726 | + {"my_catalog": "iceberg"}, |
| 727 | + {"my_catalog": "unknown"}, |
| 728 | + ], |
| 729 | +) |
| 730 | +def test_insert_overwrite_time_partition_iceberg( |
| 731 | + make_mocked_engine_adapter: t.Callable, catalog_type_overrides: t.Dict[str, str] |
| 732 | +): |
| 733 | + config = TrinoConnectionConfig( |
| 734 | + user="user", |
| 735 | + host="host", |
| 736 | + catalog="catalog", |
| 737 | + catalog_type_overrides=catalog_type_overrides, |
| 738 | + ) |
| 739 | + adapter: TrinoEngineAdapter = make_mocked_engine_adapter( |
| 740 | + TrinoEngineAdapter, catalog_type_overrides=config.catalog_type_overrides |
| 741 | + ) |
| 742 | + adapter.fetchone = MagicMock(return_value=None) # type: ignore |
| 743 | + |
| 744 | + adapter.insert_overwrite_by_time_partition( |
| 745 | + table_name=".".join(["my_catalog", "schema", "test_table"]), |
| 746 | + query_or_df=parse_one("SELECT a, b FROM tbl"), |
| 747 | + start="2022-01-01", |
| 748 | + end="2022-01-02", |
| 749 | + time_column="b", |
| 750 | + time_formatter=lambda x, _: exp.Literal.string(to_ds(x)), |
| 751 | + target_columns_to_types={"a": exp.DataType.build("INT"), "b": exp.DataType.build("STRING")}, |
| 752 | + ) |
| 753 | + |
| 754 | + assert to_sql_calls(adapter) == [ |
| 755 | + 'DELETE FROM "my_catalog"."schema"."test_table" WHERE "b" BETWEEN \'2022-01-01\' AND \'2022-01-02\'', |
| 756 | + 'INSERT INTO "my_catalog"."schema"."test_table" ("a", "b") SELECT "a", "b" FROM (SELECT "a", "b" FROM "tbl") AS "_subquery" WHERE "b" BETWEEN \'2022-01-01\' AND \'2022-01-02\'', |
| 757 | + ] |
0 commit comments