]> granicus.if.org Git - postgresql/commitdiff
Allow negative years in make_date to represent BC years
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 19 Jan 2017 12:45:38 +0000 (09:45 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 19 Jan 2017 12:45:38 +0000 (09:45 -0300)
There doesn't seem to be any reason not to allow negative years to be
interpreted as BC, so do that.

The documentation is pretty vague on the details of this function, so
nothing needs to change there.

Reported-by: Andy Abelisto, in bug #14446
src/backend/utils/adt/date.c
src/test/regress/expected/date.out
src/test/regress/sql/date.sql

index 96cfacdf30f1bfdb6043fdacc3cb5dc205518987..0a100a30eaf4f5f161f78e7a7353a6dff67dccae 100644 (file)
@@ -252,16 +252,20 @@ make_date(PG_FUNCTION_ARGS)
        struct pg_tm tm;
        DateADT         date;
        int                     dterr;
+       bool            bc = false;
 
        tm.tm_year = PG_GETARG_INT32(0);
        tm.tm_mon = PG_GETARG_INT32(1);
        tm.tm_mday = PG_GETARG_INT32(2);
 
-       /*
-        * Note: we'll reject zero or negative year values.  Perhaps negatives
-        * should be allowed to represent BC years?
-        */
-       dterr = ValidateDate(DTK_DATE_M, false, false, false, &tm);
+       /* Handle negative years as BC */
+       if (tm.tm_year < 0)
+       {
+               bc = true;
+               tm.tm_year = -tm.tm_year;
+       }
+
+       dterr = ValidateDate(DTK_DATE_M, false, false, bc, &tm);
 
        if (dterr != 0)
                ereport(ERROR,
index 418b1464250d4a018476cfa03ce7b99899d0f114..1bcc9465a93e041f685d6eaa28e0f691e1859567 100644 (file)
@@ -1454,6 +1454,12 @@ select make_date(2013, 7, 15);
  07-15-2013
 (1 row)
 
+select make_date(-44, 3, 15);
+   make_date   
+---------------
+ 03-15-0044 BC
+(1 row)
+
 select make_time(8, 20, 0.0);
  make_time 
 -----------
@@ -1467,8 +1473,6 @@ select make_date(2013, 13, 1);
 ERROR:  date field value out of range: 2013-13-01
 select make_date(2013, 11, -1);
 ERROR:  date field value out of range: 2013-11--1
-select make_date(-44, 3, 15);  -- perhaps we should allow this sometime?
-ERROR:  date field value out of range: -44-03-15
 select make_time(10, 55, 100.1);
 ERROR:  time field value out of range: 10:55:100.1
 select make_time(24, 0, 2.1);
index 4553fd1c975b0657cb8a297b189f8030f9a1bede..22f80f2ee255b1ddcf8b7b513b830862989344f1 100644 (file)
@@ -338,11 +338,11 @@ SELECT EXTRACT(UNDEFINED FROM DATE 'infinity');     -- ERROR:  timestamp units "
 
 -- test constructors
 select make_date(2013, 7, 15);
+select make_date(-44, 3, 15);
 select make_time(8, 20, 0.0);
 -- should fail
 select make_date(2013, 2, 30);
 select make_date(2013, 13, 1);
 select make_date(2013, 11, -1);
-select make_date(-44, 3, 15);  -- perhaps we should allow this sometime?
 select make_time(10, 55, 100.1);
 select make_time(24, 0, 2.1);