Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions pyiceberg/conversions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
18 changes: 18 additions & 0 deletions tests/test_conversions.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
TimestamptzNanoType,
TimestamptzType,
TimeType,
UnknownType,
UUIDType,
)

Expand Down Expand Up @@ -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")
Loading