Skip to content

Commit 14fe3ad

Browse files
committed
Fixed integer overflow in interval typecaster
Close psycopg#512.
1 parent f5bd606 commit 14fe3ad

File tree

3 files changed

+9
-4
lines changed

3 files changed

+9
-4
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Bug fixes:
4747

4848
- Fixed error caused by missing decoding `~psycopg2.extras.LoggingConnection`
4949
(:ticket:`#483`).
50+
- Fixed integer overflow in :sql:`interval` seconds (:ticket:`#512`).
5051

5152
Other changes:
5253

psycopg/typecast_datetime.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,10 @@ typecast_PYTIME_cast(const char *str, Py_ssize_t len, PyObject *curs)
220220
static PyObject *
221221
typecast_PYINTERVAL_cast(const char *str, Py_ssize_t len, PyObject *curs)
222222
{
223-
long years = 0, months = 0, days = 0;
223+
long years = 0, months = 0, days = 0, sec;
224224
double hours = 0.0, minutes = 0.0, seconds = 0.0, hundredths = 0.0;
225225
double v = 0.0, sign = 1.0, denominator = 1.0;
226-
int part = 0, sec;
226+
int part = 0;
227227
double micro;
228228

229229
if (str == NULL) { Py_RETURN_NONE; }
@@ -318,8 +318,8 @@ typecast_PYINTERVAL_cast(const char *str, Py_ssize_t len, PyObject *curs)
318318
days += years*365 + months*30;
319319

320320
micro = (seconds - floor(seconds)) * 1000000.0;
321-
sec = (int)floor(seconds);
322-
return PyObject_CallFunction((PyObject*)PyDateTimeAPI->DeltaType, "iii",
321+
sec = (long)floor(seconds);
322+
return PyObject_CallFunction((PyObject*)PyDateTimeAPI->DeltaType, "lli",
323323
days, sec, (int)round(micro));
324324
}
325325

tests/test_dates.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,10 @@ def test_time_24(self):
333333
t = self.execute("select '24:00+05:30'::timetz;")
334334
self.assertEqual(t, time(0, 0, tzinfo=FixedOffsetTimezone(330)))
335335

336+
def test_large_interval(self):
337+
t = self.execute("select '999999:00:00'::interval")
338+
self.assertEqual(t.days * 24 + t.seconds / 60.0 / 60, 999999)
339+
336340

337341
# Only run the datetime tests if psycopg was compiled with support.
338342
if not hasattr(psycopg2.extensions, 'PYDATETIME'):

0 commit comments

Comments
 (0)