From bcfe5e952cf8b63bd6d917bdc301c923b8c60e9b Mon Sep 17 00:00:00 2001 From: Ishaan Samantray Date: Mon, 1 Jun 2026 15:07:10 -0400 Subject: [PATCH] fix(util): guard _datetime_from_weaviate_str against empty string input Empty string is the protobuf wire-format default for an unset string field. Calling string[-1] on "" raises IndexError, crashing gRPC deserialization for any object with an unset date property. Return datetime.min for empty input, matching the existing behaviour for year-zero dates. Fixes #2052 --- test/test_util.py | 2 ++ weaviate/util.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/test/test_util.py b/test/test_util.py index 417cb77ef..1d3f2bdea 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -458,6 +458,8 @@ def test_is_weaviate_too_old(version: str, too_old: bool): ), # Test handling year 0 (should return datetime.min) ("0000-01-15T14:30:45.123456Z", datetime.min), + # Test empty string (protobuf default for unset string field) + ("", datetime.min), ], ) def test_datetime_from_weaviate_str(input_str: str, expected: datetime) -> None: diff --git a/weaviate/util.py b/weaviate/util.py index 7ee9e5566..67de55bb2 100644 --- a/weaviate/util.py +++ b/weaviate/util.py @@ -751,6 +751,8 @@ def _datetime_to_string(value: TIME) -> str: def _datetime_from_weaviate_str(string: str) -> datetime.datetime: + if not string: + return datetime.datetime.min if string[-1] != "Z": string = "".join(string.rsplit(":", 1))