Reject out-of-range dates in to_date().
authorTom Lane
Mon, 14 Jan 2013 20:19:48 +0000 (15:19 -0500)
committerTom Lane
Mon, 14 Jan 2013 20:20:02 +0000 (15:20 -0500)
Dates outside the supported range could be entered, but would not print
reasonably, and operations such as conversion to timestamp wouldn't behave
sanely either.  Since this has the potential to result in undumpable table
data, it seems worth back-patching.

Hitoshi Harada

src/backend/utils/adt/formatting.c

index b46cb87615060cd02eec9f8b642a247cf035c72e..65bca38b2dd93907be105fa8c6243c14b30fa1fd 100644 (file)
@@ -3322,6 +3322,12 @@ to_date(PG_FUNCTION_ARGS)
 
    do_to_timestamp(date_txt, fmt, &tm, &fsec);
 
+   if (!IS_VALID_JULIAN(tm.tm_year, tm.tm_mon, tm.tm_mday))
+       ereport(ERROR,
+               (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+                errmsg("date out of range: \"%s\"",
+                       text_to_cstring(date_txt))));
+
    result = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) - POSTGRES_EPOCH_JDATE;
 
    PG_RETURN_DATEADT(result);