mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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
This commit is contained in:
		@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user