]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
fix(c): don't overflow intervals on windows either
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 27 Jan 2024 01:09:11 +0000 (01:09 +0000)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 27 Jan 2024 01:31:59 +0000 (01:31 +0000)
In MSVC, long is 4 bytes. Should use long long instead. int64_t is more
understandable.

psycopg_c/psycopg_c/types/datetime.pyx

index 3056d9d28f240bbcdd30071a9d5c0c6a418b774f..4b0784bded5cce4661d1a40038d9a614ecde7b21 100644 (file)
@@ -4,6 +4,7 @@ Cython adapters for date/time types.
 
 # Copyright (C) 2021 The Psycopg Team
 
+from libc.stdint cimport int64_t
 from libc.string cimport memset, strchr
 from cpython cimport datetime as cdt
 from cpython.dict cimport PyDict_GetItem
@@ -391,7 +392,7 @@ cdef class DateLoader(CLoader):
         if length != 10:
             self._error_date(data, "unexpected length")
 
-        cdef long vals[3]
+        cdef int64_t vals[3]
         memset(vals, 0, sizeof(vals))
 
         cdef const char *ptr
@@ -437,7 +438,7 @@ cdef class TimeLoader(CLoader):
 
     cdef object cload(self, const char *data, size_t length):
 
-        cdef long vals[3]
+        cdef int64_t vals[3]
         memset(vals, 0, sizeof(vals))
         cdef const char *ptr
         cdef const char *end = data + length
@@ -494,7 +495,7 @@ cdef class TimetzLoader(CLoader):
 
     cdef object cload(self, const char *data, size_t length):
 
-        cdef long vals[3]
+        cdef int64_t vals[3]
         memset(vals, 0, sizeof(vals))
         cdef const char *ptr
         cdef const char *end = data + length
@@ -581,7 +582,7 @@ cdef class TimestampLoader(CLoader):
         if self._order == ORDER_PGDM or self._order == ORDER_PGMD:
             return self._cload_pg(data, end)
 
-        cdef long vals[6]
+        cdef int64_t vals[6]
         memset(vals, 0, sizeof(vals))
         cdef const char *ptr
 
@@ -611,7 +612,7 @@ cdef class TimestampLoader(CLoader):
             raise _get_timestamp_load_error(self._pgconn, data, ex) from None
 
     cdef object _cload_pg(self, const char *data, const char *end):
-        cdef long vals[4]
+        cdef int64_t vals[4]
         memset(vals, 0, sizeof(vals))
         cdef const char *ptr
 
@@ -721,7 +722,7 @@ cdef class TimestamptzLoader(_BaseTimestamptzLoader):
         if end[-1] == b'C':  # ends with BC
             raise _get_timestamp_load_error(self._pgconn, data) from None
 
-        cdef long vals[6]
+        cdef int64_t vals[6]
         memset(vals, 0, sizeof(vals))
 
         # Parse the first 6 groups of digits (date and time)
@@ -863,9 +864,9 @@ cdef class IntervalLoader(CLoader):
             return self._cload_notimpl(data, length)
 
         cdef int days = 0, us = 0
-        cdef long secs = 0
+        cdef int64_t secs = 0
         cdef char sign
-        cdef long val
+        cdef int64_t val
         cdef const char *ptr = data
         cdef const char *sep
         cdef const char *end = ptr + length
@@ -909,7 +910,7 @@ cdef class IntervalLoader(CLoader):
                 break
 
         # Parse the time part. An eventual sign was already consumed in the loop
-        cdef long vals[3]
+        cdef int64_t vals[3]
         memset(vals, 0, sizeof(vals))
         if ptr != NULL:
             ptr = _parse_date_values(ptr, end, vals, ARRAYSIZE(vals))
@@ -971,11 +972,11 @@ cdef class IntervalBinaryLoader(CLoader):
         # Work only with positive values as the cdivision behaves differently
         # with negative values, and cdivision=False adds overhead.
         cdef int64_t aval = val if val >= 0 else -val
-        cdef long us, ussecs, usdays
+        cdef int64_t us, ussecs, usdays
 
-        # Group the micros in biggers stuff or timedelta_new might overflow
+        # Group the micros in bigger stuff or timedelta_new might overflow
         with cython.cdivision(True):
-            ussecs = <long>(aval // 1_000_000)
+            ussecs = <int64_t>(aval // 1_000_000)
             us = aval % 1_000_000
 
             usdays = ussecs // 86_400
@@ -993,7 +994,7 @@ cdef class IntervalBinaryLoader(CLoader):
 
 
 cdef const char *_parse_date_values(
-    const char *ptr, const char *end, long *vals, int nvals
+    const char *ptr, const char *end, int64_t *vals, int nvals
 ):
     """
     Parse *nvals* numeric values separated by non-numeric chars.
@@ -1051,7 +1052,7 @@ cdef int _parse_timezone_to_seconds(const char **bufptr, const char *end):
     cdef char sgn = ptr[0]
 
     # Parse at most three groups of digits
-    cdef long vals[3]
+    cdef int64_t vals[3]
     memset(vals, 0, sizeof(vals))
 
     ptr = _parse_date_values(ptr + 1, end, vals, ARRAYSIZE(vals))