Interesting bug report. The problem is that sscanf(buf, "%d", &val)
eats leading white space, but our functions were not handling that.
I have applied the attached patch that fixes this:test=> select to_timestamp(' 0300','yyyymmdd hh24mi');
to_timestamp------------------------0300-01-01 00:00:00-05(1 row)test=> select to_timestamp(' 030004','yyyymmdd
hh24mi'); to_timestamp------------------------ 0300-04-01 00:00:00-05(1 row)test=> select to_timestamp('
040004','yyyymmddhh24mi'); to_timestamp------------------------ 0400-04-01 00:00:00-05(1 row)
It doesn't throw an error for too mamy format strings, but it does avoid
the incorrect values. The fix will appear in 8.2.
---------------------------------------------------------------------------
Mario Weilguni wrote:
> mydb=# select to_timestamp('00000000 0300','yyyymmdd hh24mi');
> to_timestamp
> ---------------------------
> 0001-01-01 03:00:00+01 BC
> (1 row)
>
> Questionable, but probably valid.
>
>
>
> mydb=# select to_timestamp(' 0300','yyyymmdd hh24mi');
> to_timestamp
> ------------------------
> 0300-12-25 03:00:00+01
> (1 row)
>
> This puzzles me. Where is the 25th of december coming from?
>
>
>
> mydb=# select to_timestamp(' 030004','yyyymmdd hh24mi');
> to_timestamp
> ------------------------
> 0382-04-23 03:00:00+01
> (1 row)
>
> Same as above.
>
>
> mydb=# select to_timestamp(' 040004','yyyymmdd hh24mi');
> to_timestamp
> ------------------------
> 0509-10-10 04:00:00+01
>
>
> I think all except the first one should raise a warning, isn't it? Where can I
> find the source code of this function?
>
> Best regards,
> Mario Weilguni
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
> choose an index scan if your joining column's datatypes do not
> match
>
-- Bruce Momjian http://candle.pha.pa.us EnterpriseDB http://www.enterprisedb.com
+ If your life is a hard drive, Christ can be your backup. +