From 2990256fcc894f516b47d4b2f5d487b8444cbf52 Mon Sep 17 00:00:00 2001 From: Junwang Zhao Date: Wed, 17 Jun 2026 00:18:05 +0800 Subject: [PATCH 1/2] Reject unsupported identity transform types --- pyiceberg/transforms.py | 4 +++- tests/test_transforms.py | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pyiceberg/transforms.py b/pyiceberg/transforms.py index 739e18a6e6..f2d09c8a7f 100644 --- a/pyiceberg/transforms.py +++ b/pyiceberg/transforms.py @@ -73,6 +73,8 @@ DateType, DecimalType, FixedType, + GeographyType, + GeometryType, IcebergType, IntegerType, LongType, @@ -717,7 +719,7 @@ def transform(self, source: IcebergType) -> Callable[[S | None], S | None]: return lambda v: v def can_transform(self, source: IcebergType) -> bool: - return source.is_primitive + return source.is_primitive and not isinstance(source, (GeographyType, GeometryType)) def result_type(self, source: IcebergType) -> IcebergType: return source diff --git a/tests/test_transforms.py b/tests/test_transforms.py index 96500907cf..cf73b49fc4 100644 --- a/tests/test_transforms.py +++ b/tests/test_transforms.py @@ -101,6 +101,8 @@ DoubleType, FixedType, FloatType, + GeographyType, + GeometryType, IntegerType, LongType, NestedField, @@ -255,6 +257,11 @@ def test_identity_transform_unknown_type() -> None: assert IdentityTransform().to_human_string(UnknownType(), None) == "null" +@pytest.mark.parametrize("type_var", [GeometryType(), GeographyType()]) +def test_identity_transform_unsupported_type(type_var: PrimitiveType) -> None: + assert not IdentityTransform().can_transform(type_var) + + def test_string_with_surrogate_pair() -> None: string_with_surrogate_pair = "string with a surrogate pair: 💰" as_bytes = bytes(string_with_surrogate_pair, UTF8) From 869754aa228f7be98bb0f3db00aaf7fd686f2959 Mon Sep 17 00:00:00 2001 From: Junwang Zhao Date: Wed, 17 Jun 2026 10:41:02 +0800 Subject: [PATCH 2/2] resolve review comments --- pyiceberg/transforms.py | 1 + tests/test_transforms.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pyiceberg/transforms.py b/pyiceberg/transforms.py index f2d09c8a7f..0914c056c6 100644 --- a/pyiceberg/transforms.py +++ b/pyiceberg/transforms.py @@ -719,6 +719,7 @@ def transform(self, source: IcebergType) -> Callable[[S | None], S | None]: return lambda v: v def can_transform(self, source: IcebergType) -> bool: + # TODO: disallow VariantType when PyIceberg supports it. return source.is_primitive and not isinstance(source, (GeographyType, GeometryType)) def result_type(self, source: IcebergType) -> IcebergType: diff --git a/tests/test_transforms.py b/tests/test_transforms.py index cf73b49fc4..c846bf5a28 100644 --- a/tests/test_transforms.py +++ b/tests/test_transforms.py @@ -258,7 +258,7 @@ def test_identity_transform_unknown_type() -> None: @pytest.mark.parametrize("type_var", [GeometryType(), GeographyType()]) -def test_identity_transform_unsupported_type(type_var: PrimitiveType) -> None: +def test_identity_can_transform_unsupported_type(type_var: PrimitiveType) -> None: assert not IdentityTransform().can_transform(type_var)