summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera2017-01-19 12:45:38 +0000
committerAlvaro Herrera2017-01-19 12:45:38 +0000
commit30bcebbdcf23eb8b78e553c4b3b5eb847410ef19 (patch)
tree4e9cdf2bd1ef08f2416bb4bb07b6284b570d5147
parent8b07aee8c5d803801c00103f0d61e32356aaf29c (diff)
Allow negative years in make_date to represent BC years
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
-rw-r--r--src/backend/utils/adt/date.c14
-rw-r--r--src/test/regress/expected/date.out8
-rw-r--r--src/test/regress/sql/date.sql2
3 files changed, 16 insertions, 8 deletions
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
index 96cfacdf30..0a100a30ea 100644
--- a/src/backend/utils/adt/date.c
+++ b/src/backend/utils/adt/date.c
@@ -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,
diff --git a/src/test/regress/expected/date.out b/src/test/regress/expected/date.out
index 418b146425..1bcc9465a9 100644
--- a/src/test/regress/expected/date.out
+++ b/src/test/regress/expected/date.out
@@ -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);
diff --git a/src/test/regress/sql/date.sql b/src/test/regress/sql/date.sql
index 4553fd1c97..22f80f2ee2 100644
--- a/src/test/regress/sql/date.sql
+++ b/src/test/regress/sql/date.sql
@@ -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);