diff --git a/dlt/common/schema/utils.py b/dlt/common/schema/utils.py index 038abdc4d0..49a46240ce 100644 --- a/dlt/common/schema/utils.py +++ b/dlt/common/schema/utils.py @@ -511,7 +511,11 @@ def diff_table( partial_table[k] = v # type: ignore # this should not really happen - if is_nested_table(tab_a) and (resource := tab_b.get("resource")): + if ( + is_nested_table(tab_a) + and (resource := tab_b.get("resource")) + and resource != tab_a.get("parent") + ): raise TablePropertiesConflictException( schema_name, table_name, "resource", resource, tab_a.get("parent") ) diff --git a/tests/pipeline/test_pipeline.py b/tests/pipeline/test_pipeline.py index e58db64e5e..3216562582 100644 --- a/tests/pipeline/test_pipeline.py +++ b/tests/pipeline/test_pipeline.py @@ -667,6 +667,28 @@ def with_table_hints(): assert_data_table_counts(pipeline, {"table_a": 2, "table_b": 2, "table_c": 1}) +def test_mark_parent_table() -> None: + @dlt.resource() + def my_table(): + yield {"id": 1} + yield dlt.mark.with_hints( + {"id": 10}, + dlt.mark.make_hints(table_name="my_other_table", parent_table_name="my_table"), + ) + + pipeline_name = "pipe_" + uniq_id() + pipeline = dlt.pipeline(pipeline_name=pipeline_name, destination="duckdb") + info = pipeline.run(my_table) + assert_load_info(info) + assert pipeline.last_trace.last_normalize_info.row_counts == { + "_dlt_pipeline_state": 1, + "my_table": 1, + "my_other_table": 1, + } + # check table counts + assert_data_table_counts(pipeline, {"my_table": 1, "my_other_table": 1}) + + def test_restore_state_on_dummy() -> None: pipeline_name = "pipe_" + uniq_id() p = dlt.pipeline(pipeline_name=pipeline_name, destination=DUMMY_COMPLETE)