Skip to content

Commit 585acf1

Browse files
committed
Raise TrinoDataError if the INTERVAL type value exceeds the maximum or minimum limit. Add test cases for edge scenarios
1 parent 78da73c commit 585acf1

File tree

2 files changed

+78
-22
lines changed

2 files changed

+78
-22
lines changed

tests/integration/test_types_integration.py

Lines changed: 70 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -740,30 +740,79 @@ def create_timezone(timezone_str: str) -> tzinfo:
740740

741741

742742
def test_interval_year_to_month(trino_connection):
743-
SqlTest(trino_connection) \
744-
.add_field(sql="CAST(null AS INTERVAL YEAR TO MONTH)", python=None) \
745-
.add_field(sql="INTERVAL '10' YEAR", python=relativedelta(years=10)) \
746-
.add_field(sql="INTERVAL '-5' YEAR", python=relativedelta(years=-5)) \
747-
.add_field(sql="INTERVAL '3' MONTH", python=relativedelta(months=3)) \
748-
.add_field(sql="INTERVAL '-18' MONTH", python=relativedelta(years=-1, months=-6)) \
749-
.add_field(sql="INTERVAL '30' MONTH", python=relativedelta(years=2, months=6)) \
750-
.add_field(sql="INTERVAL '124-30' YEAR TO MONTH", python=relativedelta(years=126, months=6)) \
751-
.execute()
743+
(
744+
SqlTest(trino_connection)
745+
.add_field(
746+
sql="CAST(null AS INTERVAL YEAR TO MONTH)",
747+
python=None)
748+
.add_field(
749+
sql="INTERVAL '10' YEAR",
750+
python=relativedelta(years=10))
751+
.add_field(
752+
sql="INTERVAL '-5' YEAR",
753+
python=relativedelta(years=-5))
754+
.add_field(
755+
sql="INTERVAL '3' MONTH",
756+
python=relativedelta(months=3))
757+
.add_field(
758+
sql="INTERVAL '-18' MONTH",
759+
python=relativedelta(years=-1, months=-6))
760+
.add_field(
761+
sql="INTERVAL '30' MONTH",
762+
python=relativedelta(years=2, months=6))
763+
# max supported INTERVAL in Trino
764+
.add_field(
765+
sql="INTERVAL '178956970-7' YEAR TO MONTH",
766+
python=relativedelta(years=178956970, months=7))
767+
# min supported INTERVAL in Trino
768+
.add_field(
769+
sql="INTERVAL '-178956970-8' YEAR TO MONTH",
770+
python=relativedelta(years=-178956970, months=-8))
771+
).execute()
752772

753773

754774
def test_interval_day_to_second(trino_connection):
755-
SqlTest(trino_connection) \
756-
.add_field(sql="CAST(null AS INTERVAL DAY TO SECOND)", python=None) \
757-
.add_field(sql="INTERVAL '2' DAY", python=timedelta(days=2)) \
758-
.add_field(sql="INTERVAL '-2' DAY", python=timedelta(days=-2)) \
759-
.add_field(sql="INTERVAL '-2' SECOND", python=timedelta(seconds=-2)) \
760-
.add_field(sql="INTERVAL '1 11:11:11.116555' DAY TO SECOND",
761-
python=timedelta(days=1, seconds=40271, microseconds=116000)) \
762-
.add_field(sql="INTERVAL '-5 23:59:57.000' DAY TO SECOND", python=timedelta(days=-6, seconds=3)) \
763-
.add_field(sql="INTERVAL '12 10:45' DAY TO MINUTE", python=timedelta(days=12, seconds=38700)) \
764-
.add_field(sql="INTERVAL '45:32.123' MINUTE TO SECOND", python=timedelta(seconds=2732, microseconds=123000)) \
765-
.add_field(sql="INTERVAL '32.123' SECOND", python=timedelta(seconds=32, microseconds=123000)) \
766-
.execute()
775+
(
776+
SqlTest(trino_connection)
777+
.add_field(
778+
sql="CAST(null AS INTERVAL DAY TO SECOND)",
779+
python=None)
780+
.add_field(
781+
sql="INTERVAL '2' DAY",
782+
python=timedelta(days=2))
783+
.add_field(
784+
sql="INTERVAL '-2' DAY",
785+
python=timedelta(days=-2))
786+
.add_field(
787+
sql="INTERVAL '-2' SECOND",
788+
python=timedelta(seconds=-2))
789+
.add_field(
790+
sql="INTERVAL '1 11:11:11.116555' DAY TO SECOND",
791+
python=timedelta(days=1, seconds=40271, microseconds=116000))
792+
.add_field(
793+
sql="INTERVAL '-5 23:59:57.000' DAY TO SECOND",
794+
python=timedelta(days=-6, seconds=3))
795+
.add_field(
796+
sql="INTERVAL '12 10:45' DAY TO MINUTE",
797+
python=timedelta(days=12, seconds=38700))
798+
.add_field(
799+
sql="INTERVAL '45:32.123' MINUTE TO SECOND",
800+
python=timedelta(seconds=2732, microseconds=123000))
801+
.add_field(
802+
sql="INTERVAL '32.123' SECOND",
803+
python=timedelta(seconds=32, microseconds=123000))
804+
# max supported timedelta in Python
805+
.add_field(
806+
sql="INTERVAL '999999999 23:59:59.999' DAY TO SECOND",
807+
python=timedelta(days=999999999, hours=23, minutes=59, seconds=59, milliseconds=999))
808+
# min supported timedelta in Python
809+
.add_field(
810+
sql="INTERVAL '-999999999' DAY",
811+
python=timedelta(days=-999999999))
812+
).execute()
813+
814+
SqlExpectFailureTest(trino_connection).execute("INTERVAL '1000000000' DAY")
815+
SqlExpectFailureTest(trino_connection).execute("INTERVAL '-999999999 00:00:00.001' DAY TO SECOND")
767816

768817

769818
def test_array(trino_connection):

trino/mapper.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,14 @@ def map(self, value: Any) -> Optional[timedelta]:
198198
int(milliseconds))
199199
if is_negative:
200200
days, hours, minutes, seconds, milliseconds = -days, -hours, -minutes, -seconds, -milliseconds
201-
return timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds, milliseconds=milliseconds)
201+
try:
202+
return timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds, milliseconds=milliseconds)
203+
except OverflowError as e:
204+
error_str = (
205+
f"Could not convert '{value}' into the associated python type, as the value "
206+
"exceeds the maximum or minimum limit."
207+
)
208+
raise trino.exceptions.TrinoDataError(error_str) from e
202209

203210

204211
class ArrayValueMapper(ValueMapper[List[Optional[Any]]]):

0 commit comments

Comments
 (0)