From: Daniele Varrazzo Date: Sat, 27 Jan 2024 01:09:11 +0000 (+0000) Subject: fix(c): don't overflow intervals on windows either X-Git-Tag: 3.1.18~7^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86387833991bfaa525e085e2b45ae2523f539c1a;p=thirdparty%2Fpsycopg.git fix(c): don't overflow intervals on windows either In MSVC, long is 4 bytes. Should use long long instead. int64_t is more understandable. --- diff --git a/psycopg_c/psycopg_c/types/datetime.pyx b/psycopg_c/psycopg_c/types/datetime.pyx index 3056d9d28..4b0784bde 100644 --- a/psycopg_c/psycopg_c/types/datetime.pyx +++ b/psycopg_c/psycopg_c/types/datetime.pyx @@ -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 = (aval // 1_000_000) + ussecs = (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))