Обсуждение: Re: [BUGS] bug in timestamp and out of range values
On Thursday 02 November 2006 17:48, Tom Lane wrote:
> Robert Treat <xzilla@users.sourceforge.net> writes:
> > pagila=# select to_date('3232098', 'MM/DD/YYYY');
> > to_date
> > ---------------
> > 4568-06-26 BC
> > (1 row)
>
> to_date's absymal lack of error checking is well known. It should
> surely refuse that input altogether, given that format string.
> Feel free to send a patch ...
>
> As for the range issue, date_in does refuse negative Julian dates:
>
> regression=# select '4714-01-27 BC'::date;
> ERROR: date out of range: "4714-01-27 BC"
>
> but again to_date doesn't:
>
> regression=# select to_date('4714-01-27 BC', 'YYYY-MM-DD BC');
> to_date
> ---------------
> 4714-01-27 BC
> (1 row)
>
I'm not concerned about to_date so much as I am that timestamp_in lets you
store values you can't read with timestamp_out. Once the value is in there
you can happily move it around with create table as and such...
--
Robert Treat
Build A Brighter LAMP :: Linux Apache {middleware} PostgreSQL
>> but again to_date doesn't:
>>
>> regression=# select to_date('4714-01-27 BC', 'YYYY-MM-DD BC');
>> to_date
>> ---------------
>> 4714-01-27 BC
>> (1 row)
>>
>
> I'm not concerned about to_date so much as I am that timestamp_in lets you
> store values you can't read with timestamp_out. Once the value is in there
> you can happily move it around with create table as and such...
Hmmm... if that is the case, I would also have a pretty significant
concern. We have basically created an environment that is unreliable
during a restore. Not to mention violating data type constraints.
postgres=# create table timetest (test date);
CREATE TABLE
postgres=# insert into timetest values (to_date('4714-01-27 BC', 'YYYY-MM-DD BC'));
INSERT 159911984 1
postgres=# select '4714-01-27 BC'::date;
ERROR: date out of range: "4714-01-27 BC"
postgres=# select cast(test as date) from timetest; test
---------------4714-01-27 BC
(1 row)
postgres=#
postgres=# select cast('4714-01-27 BC' as date);
ERROR: date out of range: "4714-01-27 BC"
postgres=#
This seems pretty broken.
Joshua D. Drake
--
=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997 http://www.commandprompt.com/
Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
>
> postgres=# select '4714-01-27 BC'::date;
> ERROR: date out of range: "4714-01-27 BC"
> postgres=# select cast(test as date) from timetest;
> test
> ---------------
> 4714-01-27 BC
> (1 row)
>
> postgres=#
> postgres=# select cast('4714-01-27 BC' as date);
> ERROR: date out of range: "4714-01-27 BC"
> postgres=#
>
> This seems pretty broken.
>
> Joshua D. Drake
And further this with timestamp instead of date:
postgres=# create table timestamptest(test timestamp);
CREATE TABLE
postgres=# insert into timestamptest values (to_date('4714-01-27 BC', 'YYYY-MM-DD BC'));
INSERT 159911988 1
postgres=# select * from timestamptest;
ERROR: timestamp out of range
Sincerely,
Joshua D. Drake
--
=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997 http://www.commandprompt.com/
Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
Robert Treat <xzilla@users.sourceforge.net> writes:
> I'm not concerned about to_date so much as I am that timestamp_in lets you
> store values you can't read with timestamp_out.
Your example does not demonstrate any such thing. What it demonstrates
is that to_date will let an out-of-range date into the system, not that
timestamp_in will. Counterexample:
regression=# select '4714-01-27 BC'::timestamp;
ERROR: timestamp out of range: "4714-01-27 BC"
regards, tom lane