From b9de23c992d0243f11915cc9badeda39da520b5d Mon Sep 17 00:00:00 2001 From: Anas Khan <83116240+anxkhn@users.noreply.github.com> Date: Sat, 4 Jul 2026 18:25:47 +0530 Subject: [PATCH] fix: preserve write_default when applying a name mapping NameMappingProjectionVisitor.field rebuilt each NestedField with an initial_write= keyword, but NestedField.__init__ has no such parameter (the write-default keyword is write_default). Being a Pydantic model, the unknown key was swallowed by **data and silently ignored, so apply_name_mapping dropped every field's write_default to None. Pass write_default= to match the NestedField constructor and add a regression test asserting both initial_default and write_default survive a name mapping. --- pyiceberg/table/name_mapping.py | 2 +- tests/table/test_name_mapping.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pyiceberg/table/name_mapping.py b/pyiceberg/table/name_mapping.py index 1cf6bc0106..bd8b8529c5 100644 --- a/pyiceberg/table/name_mapping.py +++ b/pyiceberg/table/name_mapping.py @@ -341,7 +341,7 @@ def field(self, field: NestedField, field_partner: MappedField | None, field_res required=field.required, doc=field.doc, initial_default=field.initial_default, - initial_write=field.write_default, + write_default=field.write_default, ) def list(self, list_type: ListType, list_partner: MappedField | None, element_result: IcebergType) -> IcebergType: diff --git a/tests/table/test_name_mapping.py b/tests/table/test_name_mapping.py index e8de5f18e5..073e893455 100644 --- a/tests/table/test_name_mapping.py +++ b/tests/table/test_name_mapping.py @@ -403,3 +403,22 @@ def test_mapping_using_by_visitor(table_schema_nested: Schema, table_name_mappin ), ) assert apply_name_mapping(schema_without_ids, table_name_mapping_nested).fields == table_schema_nested.fields + + +def test_mapping_preserves_field_defaults() -> None: + schema_without_ids = Schema( + NestedField( + field_id=0, + name="foo", + field_type=StringType(), + required=False, + initial_default="init", + write_default="write", + ), + ) + name_mapping = NameMapping([MappedField(field_id=1, names=["foo"])]) + + mapped_field = apply_name_mapping(schema_without_ids, name_mapping).fields[0] + + assert mapped_field.initial_default == "init" + assert mapped_field.write_default == "write"