]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Consider loss of precision in negative binary timestamps too
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 13 May 2021 09:49:33 +0000 (11:49 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 13 May 2021 09:49:33 +0000 (11:49 +0200)
psycopg3/psycopg3/types/date.py
tests/types/test_date.py

index dfd6c9bce1b6ef8022acdd2ac2372e6150522a95..341ce380c6bd6502635d508d072dd353dbc1097d 100644 (file)
@@ -183,7 +183,7 @@ class DateTimeTzBinaryDumper(_BaseDateTimeDumper):
     def dump(self, obj: datetime) -> bytes:
         delta = obj - _pg_datetimetz_epoch
         secs = delta.total_seconds()
-        if secs < self._delta_prec_loss:
+        if -self._delta_prec_loss < secs < self._delta_prec_loss:
             micros = int(1_000_000 * secs)
         else:
             micros = delta.microseconds + 1_000_000 * (
@@ -204,7 +204,7 @@ class DateTimeBinaryDumper(DateTimeTzBinaryDumper):
     def dump(self, obj: datetime) -> bytes:
         delta = obj - _pg_datetime_epoch
         secs = delta.total_seconds()
-        if secs < self._delta_prec_loss:
+        if -self._delta_prec_loss < secs < self._delta_prec_loss:
             micros = int(1_000_000 * secs)
         else:
             micros = (
index 2b3d4f816160185658478e87f402ec06b7576ab0..d37bb85aee3282ac421a8b816038dc67096d7c2b 100644 (file)
@@ -104,6 +104,7 @@ def test_load_date_overflow_binary(conn, val):
     "val, expr",
     [
         ("min", "0001-01-01 00:00"),
+        ("258,1,8,1,12,32,358261", "0258-1-8 1:12:32.358261"),
         ("1000,1,1,0,0", "1000-01-01 00:00"),
         ("2000,1,1,0,0", "2000-01-01 00:00"),
         ("2000,1,2,3,4,5,6", "2000-01-02 03:04:05.000006"),
@@ -204,6 +205,7 @@ def test_load_datetime_overflow_binary(conn, val):
         ("min~2", "0001-01-01 00:00"),
         ("min~-12", "0001-01-01 00:00-12:00"),
         ("min~+12", "0001-01-01 00:00+12:00"),
+        ("258,1,8,1,12,32,358261~1:2:3", "0258-1-8 1:12:32.358261+01:02:03"),
         ("1000,1,1,0,0~2", "1000-01-01 00:00+2"),
         ("2000,1,1,0,0~2", "2000-01-01 00:00+2"),
         ("2000,1,1,0,0~12", "2000-01-01 00:00+12"),
@@ -211,7 +213,9 @@ def test_load_datetime_overflow_binary(conn, val):
         ("2000,1,1,0,0~01:02:03", "2000-01-01 00:00+01:02:03"),
         ("2000,1,1,0,0~-01:02:03", "2000-01-01 00:00-01:02:03"),
         ("2000,12,31,23,59,59,999999~2", "2000-12-31 23:59:59.999999+2"),
+        ("2300,1,1,0,0,0,1~1", "2300-01-01 00:00:00.000001+1"),
         ("3000,1,1,0,0~2", "3000-01-01 00:00+2"),
+        ("7000,1,1,0,0,0,1~-1:2:3", "7000-01-01 00:00:00.000001-01:02:03"),
         ("max~2", "9999-12-31 23:59:59.999999"),
     ],
 )