Skip to content

Commit 1a0c02a

Browse files
committed
Raise an error for dates > 10K instead of returning Y9999
Close psycopg#1307.
1 parent 1454b14 commit 1a0c02a

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

NEWS

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
Current release
22
---------------
33

4+
What's new in psycopg 2.9.2
5+
^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
7+
Raise `ValueError` for dates >= Y10k (:ticket:`#1307`)
8+
9+
410
What's new in psycopg 2.9.1
511
^^^^^^^^^^^^^^^^^^^^^^^^^^^
612

7-
Fix regression with named `sql.Placeholder` (:ticket:`1291`).
13+
Fix regression with named `sql.Placeholder` (:ticket:`#1291`).
814

915

1016
What's new in psycopg 2.9

psycopg/typecast_datetime.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ typecast_PYDATE_cast(const char *str, Py_ssize_t len, PyObject *curs)
7171
return NULL;
7272
}
7373
else {
74-
if (y > 9999) y = 9999;
7574
obj = PyObject_CallFunction(
7675
(PyObject*)PyDateTimeAPI->DateType, "iii", y, m, d);
7776
}
@@ -172,8 +171,6 @@ _parse_noninftz(const char *str, Py_ssize_t len, PyObject *curs)
172171
mm += 1;
173172
ss -= 60;
174173
}
175-
if (y > 9999)
176-
y = 9999;
177174

178175
tzinfo_factory = ((cursorObject *)curs)->tzinfo_factory;
179176
if (n >= 5 && tzinfo_factory != Py_None) {

tests/test_dates.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,26 @@ def setUp(self):
115115
self.DATETIME = psycopg2.extensions.PYDATETIME
116116
self.INTERVAL = psycopg2.extensions.PYINTERVAL
117117

118+
def test_parse_10k_date(self):
119+
# datetime does not support dates larger than date.max
120+
self.assertEqual(self.DATE('9999-12-31', self.curs), date(9999, 12, 31))
121+
self.assertRaises(ValueError, self.DATE, '10000-01-01', self.curs)
122+
118123
def test_parse_bc_date(self):
119124
# datetime does not support BC dates
125+
self.assertEqual(self.DATE('0001-01-01', self.curs), date(1, 1, 1))
120126
self.assertRaises(ValueError, self.DATE, '00042-01-01 BC', self.curs)
121127

128+
def test_parse_10k_datetime(self):
129+
# datetime does not support dates larger than date.max
130+
self.assertEqual(self.DATETIME('9999-12-31 23:59:59', self.curs),
131+
datetime(9999, 12, 31, 23, 59, 59))
132+
self.assertRaises(ValueError, self.DATE, '10000-01-01', self.curs)
133+
122134
def test_parse_bc_datetime(self):
123135
# datetime does not support BC dates
136+
self.assertEqual(self.DATETIME('0001-01-01 13:30:29', self.curs),
137+
datetime(1, 1, 1, 13, 30, 29))
124138
self.assertRaises(ValueError, self.DATETIME,
125139
'00042-01-01 13:30:29 BC', self.curs)
126140

0 commit comments

Comments
 (0)