diff --git a/pyiceberg/table/__init__.py b/pyiceberg/table/__init__.py index df7aaf824f..48cd34eb31 100644 --- a/pyiceberg/table/__init__.py +++ b/pyiceberg/table/__init__.py @@ -275,6 +275,8 @@ def __init__(self, table: Table, autocommit: bool = False): @property def table_metadata(self) -> TableMetadata: + if not self._updates: + return self._table.metadata return update_table_metadata(self._table.metadata, self._updates) def __enter__(self) -> Transaction: diff --git a/tests/table/test_init.py b/tests/table/test_init.py index 481326b44b..384704324f 100644 --- a/tests/table/test_init.py +++ b/tests/table/test_init.py @@ -1103,6 +1103,20 @@ def test_update_metadata_table_schema(table_v2: Table) -> None: assert new_metadata.current_schema_id == 2 +def test_transaction_table_metadata_without_staged_updates(table_v2: Table) -> None: + transaction = table_v2.transaction() + assert transaction.table_metadata is table_v2.metadata + + +def test_transaction_table_metadata_with_staged_updates(table_v2: Table) -> None: + transaction = table_v2.transaction() + transaction.set_properties(test_a="test_a") + + assert transaction.table_metadata.properties["test_a"] == "test_a" + assert transaction.table_metadata is not table_v2.metadata + assert "test_a" not in table_v2.metadata.properties + + def test_update_metadata_add_snapshot(table_v2: Table) -> None: new_snapshot = Snapshot( snapshot_id=25, diff --git a/tests/table/test_snapshots.py b/tests/table/test_snapshots.py index 39aeb7b349..f169dafe7a 100644 --- a/tests/table/test_snapshots.py +++ b/tests/table/test_snapshots.py @@ -674,6 +674,8 @@ def make_file() -> DataFile: return DataFile.from_args(content=DataFileContent.DATA, record_count=1, file_size_in_bytes=1, partition=Record()) txn = table_v2.transaction() + # Stage an update, so every read calls update_table_metadata + txn.set_properties(test_a="test_a") with mock.patch("pyiceberg.table.update_table_metadata", wraps=update_table_metadata) as spy: # _summary() cost must not scale with the number of data files