This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch 
gh-readonly-queue/main/pr-3899-07099ee180db9a1e89fc55d21bcac21b7a33e2f9
in repository https://gitbox.apache.org/repos/asf/iceberg-python.git

commit ebbc0ba3e4c633179b4069a70a8f9a4453e75d88
Author: Alex Stephen <[email protected]>
AuthorDate: Thu Sep 24 20:15:27 2026 +0000

    Register `to_bytes` for `UnknownType` (#3899)
    
    `from_bytes` and `partition_to_py` both handle `UnknownType`, but
    `to_bytes` did not, so serializing an unknown value fell through to the
    dispatch fallback and raised. Unknown values are always null and have no
    binary representation, so return None, matching `Conversions.toByteBuffer`
    in the Java implementation.
    
    The JSON single-value entry points are deliberately left unregistered:
    the spec defines no JSON representation for unknown, since a non-null
    initial-default or write-default is invalid for the type.
---
 pyiceberg/conversions.py  |  6 ++++++
 tests/test_conversions.py | 18 ++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/pyiceberg/conversions.py b/pyiceberg/conversions.py
index 268cbb93e..6dd964f43 100644
--- a/pyiceberg/conversions.py
+++ b/pyiceberg/conversions.py
@@ -321,6 +321,12 @@ def _(primitive_type: DecimalType, value: Decimal) -> 
bytes:
     return decimal_to_bytes(value)
 
 
+@to_bytes.register(UnknownType)
+def _(_: UnknownType, value: Any) -> None:
+    """Return None since the unknown type has no binary representation."""
+    return None
+
+
 @singledispatch  # type: ignore
 def from_bytes(primitive_type: PrimitiveType, b: bytes) -> L:  # type: ignore
     """Convert bytes to a built-in python value.
diff --git a/tests/test_conversions.py b/tests/test_conversions.py
index ec04d393c..e786ae068 100644
--- a/tests/test_conversions.py
+++ b/tests/test_conversions.py
@@ -109,6 +109,7 @@ from pyiceberg.types import (
     TimestamptzNanoType,
     TimestamptzType,
     TimeType,
+    UnknownType,
     UUIDType,
 )
 
@@ -606,3 +607,20 @@ def test_json_single_serialization(primitive_type: 
PrimitiveType, value: Any, ex
 )
 def test_json_serialize_roundtrip(primitive_type: PrimitiveType, value: Any) 
-> None:
     assert value == conversions.from_json(primitive_type, 
conversions.to_json(primitive_type, value))
+
+
+def test_unknown_type_conversions() -> None:
+    """Unknown values are always null, so they have no binary or partition 
representation."""
+    unknown = UnknownType()
+
+    assert conversions.to_bytes(unknown, "iceberg") is None
+    assert conversions.from_bytes(unknown, b"\x01\x02\x03\xff") is None
+    assert conversions.partition_to_py(unknown, "iceberg") is None
+
+    # The spec defines no JSON single-value representation for unknown, since a
+    # non-null initial-default or write-default is invalid for the type.
+    with pytest.raises(TypeError):
+        conversions.to_json(unknown, "iceberg")
+
+    with pytest.raises(TypeError):
+        conversions.from_json(unknown, "iceberg")

Reply via email to