diff --git a/pyiceberg/expressions/literals.py b/pyiceberg/expressions/literals.py index 1ff8008520..747dbbb796 100644 --- a/pyiceberg/expressions/literals.py +++ b/pyiceberg/expressions/literals.py @@ -317,6 +317,10 @@ def _(self, _: IntegerType) -> Literal[int]: @to.register(FloatType) def _(self, _: FloatType) -> Literal[float]: + if FloatType.max < self.value: + return FloatAboveMax() + elif FloatType.min > self.value: + return FloatBelowMin() return FloatLiteral(float(self.value)) @to.register(DoubleType) diff --git a/tests/expressions/test_literals.py b/tests/expressions/test_literals.py index de9d390775..1b88ef207b 100644 --- a/tests/expressions/test_literals.py +++ b/tests/expressions/test_literals.py @@ -184,6 +184,16 @@ def test_long_to_float_conversion() -> None: assert lit.value == float_lit.value +def test_long_to_float_outside_bound() -> None: + big_lit = literal(10**39) + above_max_lit = big_lit.to(FloatType()) + assert above_max_lit == FloatAboveMax() + + small_lit = literal(-(10**39)) + below_min_lit = small_lit.to(FloatType()) + assert below_min_lit == FloatBelowMin() + + def test_long_to_double_conversion() -> None: lit = literal(34).to(LongType()) dbl_lit = lit.to(DoubleType())