Skip to content

Commit 30bcebb

Browse files
committed
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
1 parent 8b07aee commit 30bcebb

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

src/backend/utils/adt/date.c

+9-5
Original file line numberDiff line numberDiff line change
@@ -252,16 +252,20 @@ make_date(PG_FUNCTION_ARGS)
252252
struct pg_tm tm;
253253
DateADT date;
254254
int dterr;
255+
bool bc = false;
255256

256257
tm.tm_year = PG_GETARG_INT32(0);
257258
tm.tm_mon = PG_GETARG_INT32(1);
258259
tm.tm_mday = PG_GETARG_INT32(2);
259260

260-
/*
261-
* Note: we'll reject zero or negative year values. Perhaps negatives
262-
* should be allowed to represent BC years?
263-
*/
264-
dterr = ValidateDate(DTK_DATE_M, false, false, false, &tm);
261+
/* Handle negative years as BC */
262+
if (tm.tm_year < 0)
263+
{
264+
bc = true;
265+
tm.tm_year = -tm.tm_year;
266+
}
267+
268+
dterr = ValidateDate(DTK_DATE_M, false, false, bc, &tm);
265269

266270
if (dterr != 0)
267271
ereport(ERROR,

src/test/regress/expected/date.out

+6-2
Original file line numberDiff line numberDiff line change
@@ -1454,6 +1454,12 @@ select make_date(2013, 7, 15);
14541454
07-15-2013
14551455
(1 row)
14561456

1457+
select make_date(-44, 3, 15);
1458+
make_date
1459+
---------------
1460+
03-15-0044 BC
1461+
(1 row)
1462+
14571463
select make_time(8, 20, 0.0);
14581464
make_time
14591465
-----------
@@ -1467,8 +1473,6 @@ select make_date(2013, 13, 1);
14671473
ERROR: date field value out of range: 2013-13-01
14681474
select make_date(2013, 11, -1);
14691475
ERROR: date field value out of range: 2013-11--1
1470-
select make_date(-44, 3, 15); -- perhaps we should allow this sometime?
1471-
ERROR: date field value out of range: -44-03-15
14721476
select make_time(10, 55, 100.1);
14731477
ERROR: time field value out of range: 10:55:100.1
14741478
select make_time(24, 0, 2.1);

src/test/regress/sql/date.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,11 @@ SELECT EXTRACT(UNDEFINED FROM DATE 'infinity'); -- ERROR: timestamp units "
338338

339339
-- test constructors
340340
select make_date(2013, 7, 15);
341+
select make_date(-44, 3, 15);
341342
select make_time(8, 20, 0.0);
342343
-- should fail
343344
select make_date(2013, 2, 30);
344345
select make_date(2013, 13, 1);
345346
select make_date(2013, 11, -1);
346-
select make_date(-44, 3, 15); -- perhaps we should allow this sometime?
347347
select make_time(10, 55, 100.1);
348348
select make_time(24, 0, 2.1);

0 commit comments

Comments
 (0)