Unpredictable text -> date implicit casting behaviour/to_date bug

Started by Aasmund Midttun Godalover 24 years ago5 messagespatches
Jump to latest
#1Aasmund Midttun Godal
postgresql@envisity.com

The implicit casting of text to date is normally quite good, however i think it should only use one method during a given query (or maybe transaction?) or maybe it should give a notice of some sort? - i was quite astonished when I discovered the following: (look closely at row 4 and 5 vs the others)

SELECT ordredato, ordredato::date from old_faktura where status = 'ORD';
ordredato | ?column?
-----------+------------
18.10.01 | 2001-10-18
31.10.01 | 2001-10-31
01.11.01 | 2001-01-11
03.11.01 | 2001-03-11
03.11.01 | 2001-03-11
10.11.01 | 2001-10-11
26.11.01 | 2001-11-26

Added to the fact that to_date has a bug:

SELECT ordredato, ordredato::date, to_date(ordredato, 'DD.MM.YY') from old_faktura where status = 'ANN';
ordredato | ?column? | to_date
-----------+------------+---------------
18.04.00 | 2000-04-18 | 0001-04-18 BC
30.08.01 | 2001-08-30 | 2001-08-30
18.04.00 | 2000-04-18 | 0001-04-18 BC

It sometimes makes converting dates a little challenge...

Aasmund Midttun Godal

aasmund@godal.com - http://www.godal.com/
+47 40 45 20 46

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Aasmund Midttun Godal (#1)
Re: Unpredictable text -> date implicit casting behaviour/to_date bug

"Aasmund Midttun Godal" <postgresql@envisity.com> writes:

The implicit casting of text to date is normally quite good, however i
think it should only use one method during a given query (or maybe
transaction?)

Try setting DateStyle to match the date style you are using. Postgres
is doing the best it can with ambiguous input.

Added to the fact that to_date has a bug:

SELECT ordredato, ordredato::date, to_date(ordredato, 'DD.MM.YY') from old_faktura where status = 'ANN';
ordredato | ?column? | to_date
-----------+------------+---------------
18.04.00 | 2000-04-18 | 0001-04-18 BC
30.08.01 | 2001-08-30 | 2001-08-30
18.04.00 | 2000-04-18 | 0001-04-18 BC

I agree, this is not desired behavior. The problem seems to be that the
logic in to_timestamp() tries to use "field is not zero" as a substitute
test for "field was provided". At least in the case of the year fields,
this is *not* workable. There must be a separate flag bit.

regards, tom lane

#3Karel Zak
zakkr@zf.jcu.cz
In reply to: Tom Lane (#2)
Re: [SQL] Unpredictable text -> date implicit casting behaviour/to_date bug

On Mon, Dec 31, 2001 at 11:02:47AM -0500, Tom Lane wrote:

"Aasmund Midttun Godal" <postgresql@envisity.com> writes:

The implicit casting of text to date is normally quite good, however i
think it should only use one method during a given query (or maybe
transaction?)

Try setting DateStyle to match the date style you are using. Postgres
is doing the best it can with ambiguous input.

Added to the fact that to_date has a bug:

SELECT ordredato, ordredato::date, to_date(ordredato, 'DD.MM.YY') from old_faktura where status = 'ANN';
ordredato | ?column? | to_date
-----------+------------+---------------
18.04.00 | 2000-04-18 | 0001-04-18 BC
30.08.01 | 2001-08-30 | 2001-08-30
18.04.00 | 2000-04-18 | 0001-04-18 BC

I agree, this is not desired behavior. The problem seems to be that the
logic in to_timestamp() tries to use "field is not zero" as a substitute
test for "field was provided". At least in the case of the year fields,
this is *not* workable. There must be a separate flag bit.

regards, tom lane

Nice bug :-(

It's fixed and the patch is attached, please apply it to 7.2.

Thanks for report.

Karel

--
Karel Zak <zakkr@zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/

C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz

Attachments:

formatting-01022002.patch.gzapplication/x-gzipDownload
#4Bruce Momjian
bruce@momjian.us
In reply to: Karel Zak (#3)
Re: [SQL] Unpredictable text -> date implicit casting behaviour/to_date

Thomas added datetime stuff over the weekend, so I assume this patch
should be applied in the next 24 hours, unless someone objects.

---------------------------------------------------------------------------

Karel Zak wrote:

On Mon, Dec 31, 2001 at 11:02:47AM -0500, Tom Lane wrote:

"Aasmund Midttun Godal" <postgresql@envisity.com> writes:

The implicit casting of text to date is normally quite good, however i
think it should only use one method during a given query (or maybe
transaction?)

Try setting DateStyle to match the date style you are using. Postgres
is doing the best it can with ambiguous input.

Added to the fact that to_date has a bug:

SELECT ordredato, ordredato::date, to_date(ordredato, 'DD.MM.YY') from old_faktura where status = 'ANN';
ordredato | ?column? | to_date
-----------+------------+---------------
18.04.00 | 2000-04-18 | 0001-04-18 BC
30.08.01 | 2001-08-30 | 2001-08-30
18.04.00 | 2000-04-18 | 0001-04-18 BC

I agree, this is not desired behavior. The problem seems to be that the
logic in to_timestamp() tries to use "field is not zero" as a substitute
test for "field was provided". At least in the case of the year fields,
this is *not* workable. There must be a separate flag bit.

regards, tom lane

Nice bug :-(

It's fixed and the patch is attached, please apply it to 7.2.

Thanks for report.

Karel

--
Karel Zak <zakkr@zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/

C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz

[ Attachment, skipping... ]

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Karel Zak (#3)
Re: [SQL] Unpredictable text -> date implicit casting behaviour/to_date bug

Karel Zak <zakkr@zf.jcu.cz> writes:

It's fixed and the patch is attached, please apply it to 7.2.

Patch applied to CVS. Thanks!

regards, tom lane