diff --git a/pyiceberg/transforms.py b/pyiceberg/transforms.py index 739e18a6e6..0914c056c6 100644 --- a/pyiceberg/transforms.py +++ b/pyiceberg/transforms.py @@ -73,6 +73,8 @@ DateType, DecimalType, FixedType, + GeographyType, + GeometryType, IcebergType, IntegerType, LongType, @@ -717,7 +719,8 @@ 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 + # TODO: disallow VariantType when PyIceberg supports it. + 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..c846bf5a28 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_can_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)