On Tue, Mar 31, 2015 at 12:22:39PM -0700, David Fetter wrote:
> On Tue, Mar 31, 2015 at 12:58:27PM -0400, Tom Lane wrote:
> > David Fetter <[email protected]> writes:
> > > On Tue, Mar 31, 2015 at 10:34:45AM -0400, Adam Brightwell wrote:
> > >> Previously, zero was rejected, what does it do now? I'm sure it
> > >> represents 0 AD/CE, however, is that important enough to note
> > >> given that it was not allowed previously?
> >
> > > Now, it's supposed to take 0 as 1 BCE, -1 as 2 BCE, etc. There
> > > should probably be tests for that.
> >
> > Surely that is *not* what we want?
>
> It is if we're to be consistent with the rest of the system, to wit:
>
> SELECT to_date('YYYY','0000');
> to_date
> ---------------
> 0001-01-01 BC
> (1 row)
Looking at this further, I think that it should be consistent with
cast rather than with to_date().
SELECT date '0000-01-01';
ERROR: date/time field value out of range: "0000-01-01"
LINE 1: SELECT date '0000-01-01';
Please find attached the next revision of the patch.
Cheers,
David.
--
David Fetter <[email protected]> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: [email protected]
Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
index d66f640..bbf10e9 100644
--- a/src/backend/utils/adt/date.c
+++ b/src/backend/utils/adt/date.c
@@ -248,10 +248,15 @@ make_date(PG_FUNCTION_ARGS)
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?
+ * Note: Negative years are taken to be BCE.
*/
- dterr = ValidateDate(DTK_DATE_M, false, false, false, &tm);
+ if (tm.tm_year >= 0)
+ dterr = ValidateDate(DTK_DATE_M, false, false, false, &tm);
+ else
+ {
+ tm.tm_year = -1 * tm.tm_year;
+ dterr = ValidateDate(DTK_DATE_M, false, false, true, &tm);
+ }
if (dterr != 0)
ereport(ERROR,
diff --git a/src/test/regress/expected/date.out
b/src/test/regress/expected/date.out
index 8923f60..953e262 100644
--- a/src/test/regress/expected/date.out
+++ b/src/test/regress/expected/date.out
@@ -1191,6 +1191,12 @@ select make_date(2013, 7, 15);
07-15-2013
(1 row)
+select make_date(-44, 3, 15); -- Negative years are BCE
+ make_date
+---------------
+ 03-15-0044 BC
+(1 row)
+
select make_time(8, 20, 0.0);
make_time
-----------
@@ -1198,14 +1204,14 @@ select make_time(8, 20, 0.0);
(1 row)
-- should fail
+select make_date(0, 1, 1);
+ERROR: date field value out of range: 0-01-01
select make_date(2013, 2, 30);
ERROR: date field value out of range: 2013-02-30
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 a62e92a..bd9a845 100644
--- a/src/test/regress/sql/date.sql
+++ b/src/test/regress/sql/date.sql
@@ -279,11 +279,12 @@ select isfinite('infinity'::date),
isfinite('-infinity'::date), isfinite('today'
-- test constructors
select make_date(2013, 7, 15);
+select make_date(-44, 3, 15); -- Negative years are BCE
select make_time(8, 20, 0.0);
-- should fail
+select make_date(0, 1, 1);
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);
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers