Обсуждение: Bug in storing Timestamp

Поиск
Список
Период
Сортировка

Bug in storing Timestamp

От
Boris Kirzner
Дата:
Short description :
Storing java.sql.Timestamp with specified milliseconds value results to
wrong value stored in db.

System details :
OS : WindowsXP
PostgreSQL version : 8.0.1
Driver version : 8.0 build 310

Detailed description :
In order to reproduce the bug run the following code.
Create the table in the db.
The code creates a timestamp of "0001-01-01 02:02:02.0" and stores it
into the db.
The actual value stored is "02:22:42".


CREATE TABLE TYPES_EXTENDED (
  id char(10),
  t_time time
)
WITHOUT OIDS;

long milliseconds = Timestamp.valueOf("0001-01-01 02:02:02.0").getTime();
Timestamp javaTimestamp = new Timestamp(milliseconds);
System.out.println("Timestamp stored : " + javaTimestamp);
PreparedStatement stmt = connection.prepareStatement("insert into
types_extended(ID,t_time) values ('aaa',?)");
stmt.setTimestamp(1, javaTimestamp);
stmt.execute();


Thank you in advance,

--
Boris Kirzner
Mainsoft Corporation
http://www.mainsoft.com


Re: Bug in storing Timestamp

От
"mikael-aronsson"
Дата:
Hi !

I have never had any problems with timestamps, if I remember correct the
resolution gets worse when you get far away from 1900 or so, is it possible
that using year 0001 gives that bad resolution maybe ?

Mikael

----- Original Message -----
From: "Boris Kirzner" <borisk@mainsoft.com>
To: <pgsql-jdbc@postgresql.org>
Sent: Monday, April 11, 2005 2:39 PM
Subject: [JDBC] Bug in storing Timestamp


> Short description :
> Storing java.sql.Timestamp with specified milliseconds value results to
> wrong value stored in db.
>
> System details :
> OS : WindowsXP
> PostgreSQL version : 8.0.1
> Driver version : 8.0 build 310
>
> Detailed description :
> In order to reproduce the bug run the following code.
> Create the table in the db.
> The code creates a timestamp of "0001-01-01 02:02:02.0" and stores it into
> the db.
> The actual value stored is "02:22:42".
>
>
> CREATE TABLE TYPES_EXTENDED (
>  id char(10),
>  t_time time
> )
> WITHOUT OIDS;
>
> long milliseconds = Timestamp.valueOf("0001-01-01 02:02:02.0").getTime();
> Timestamp javaTimestamp = new Timestamp(milliseconds);
> System.out.println("Timestamp stored : " + javaTimestamp);
> PreparedStatement stmt = connection.prepareStatement("insert into
> types_extended(ID,t_time) values ('aaa',?)");
> stmt.setTimestamp(1, javaTimestamp);
> stmt.execute();
>
>
> Thank you in advance,
>
> --
> Boris Kirzner
> Mainsoft Corporation
> http://www.mainsoft.com
>
>
> ---------------------------(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


Re: Bug in storing Timestamp

От
Tom Lane
Дата:
"mikael-aronsson" <mikael-aronsson@telia.com> writes:
> I have never had any problems with timestamps, if I remember correct the
> resolution gets worse when you get far away from 1900 or so, is it possible
> that using year 0001 gives that bad resolution maybe ?

Good thought, but no; the error at 0001 is still down around the sixth
decimal place:

regression=# select '0001-01-01 02:02:02.123456'::timestamp;
         timestamp
----------------------------
 0001-01-01 02:02:02.123459
(1 row)

I was wondering about the fact that he was storing into a time column
rather than a timestamp.  That works if the conversion is done on the
server, modulo the sixth decimal place again:

regression=# select '0001-01-01 02:02:02.123456'::timestamp::time;
      time
-----------------
 02:02:02.123459
(1 row)

but maybe it's confusing the JDBC driver into doing the wrong thing
entirely.

            regards, tom lane

Re: Bug in storing Timestamp

От
Kris Jurka
Дата:

On Mon, 11 Apr 2005, Boris Kirzner wrote:

> Short description :
> Storing java.sql.Timestamp with specified milliseconds value results to
> wrong value stored in db.
>
> PostgreSQL version : 8.0.1
> Driver version : 8.0 build 310
>
> Detailed description :
> In order to reproduce the bug run the following code.
> Create the table in the db.
> The code creates a timestamp of "0001-01-01 02:02:02.0" and stores it
> into the db.
> The actual value stored is "02:22:42".

I am not able to reproduce this problem.  The attached test case shows a
problem with storing java.sql.Time into a timetz type because the correct
offset is not saved, but that's not what you've described.  Perhaps it is
something specific to your timezone?

Kris Jurka

Вложения

Re: Bug in storing Timestamp

От
Boris Kirzner
Дата:
Kris Jurka wrote:

>I am not able to reproduce this problem.  The attached test case shows a
>problem with storing java.sql.Time into a timetz type because the correct
>offset is not saved, but that's not what you've described.  Perhaps it is
>something specific to your timezone?
>
>Kris Jurka
>

Hello Kris
After more investigation I found that the bug I'm talking about can be
reproduced on timestamp column also.

The configuration is as follows :
PostgeSQL runs on WindowsXP that has "Automatically adjust clock for dst
savings" OFF, timezone is (GMT+02:00) Jerusalem
Client runs on WindowsXP that has "Automatically adjust clock for dst
savings" OFF , timezone is (GMT+02:00) Jerusalem

The test stores 2004-08-09 20:30:15.50 timestamp into a table and
immediately fetches it.
Actual result : the value fetched is 2004-08-09 21:30:15.5
Expected result : the value fetched is 2004-08-09 20:30:15.5

Note : if you set client's "Automatically adjust clock for dst savings"
to ON, the test passes.

Attached are test and table sql.

Thanks,
Boris

--
Boris Kirzner
Mainsoft Corporation
http://www.mainsoft.com

package tests;

import java.sql.*;
import java.util.Properties;

/*
 * @(#)PostgreSQL_Timestamp_Test.java    1.0 Created on Apr 21, 2005 2:19:54 PM
 *
 * Copyright 2002-2003 Mainsoft Corporation. All Rights Reserved.
 *
 * This software is the proprietary information of Mainsoft Corporation.
 * Use is subject to license terms.
 *
 */

public class PostgreSQL_Timestamp_Test
{
    public static void main(String[] args)
    {
        Connection connection = connect("xp050", "", "GHTDB", "postgres", "postgres", false);
        Timestamp ts = Timestamp.valueOf("2004-08-09 20:30:15.50");

        try
        {
            PreparedStatement pstmt = connection.prepareStatement("delete from borisk_timestamp");
            pstmt.execute();

            pstmt = connection.prepareStatement("insert into borisk_timestamp values(?)");
            pstmt.setTimestamp(1, ts);

            pstmt.execute();

            pstmt = connection.prepareStatement("select * from borisk_timestamp");
            pstmt.execute();

            ResultSet rs = pstmt.getResultSet();
            rs.next();
            Timestamp ts1 = rs.getTimestamp(1);
            System.out.println(ts);
            System.out.println(ts1);

            pstmt = connection.prepareStatement("delete from borisk_timestamp");
            pstmt.execute();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    private static Connection connect(String host, String port, String catalog, String user, String pass, boolean
trace)
    {
        String conStr = buildUrl(host, port, catalog);

        try
        {
            activateJDBCDriver(getDriverName());
            Properties info = new Properties();

            info.put("user", user);
            info.put("password", pass);

            if (trace)
            {
                System.out.println("Getting connection to host " + host + "  port " + port + " catalog " + catalog);
            }
            DriverManager.setLoginTimeout(15);
            Connection con = DriverManager.getConnection(conStr, info);
            if (trace)
            {
                System.out.println("Connected to host " + host);
            }
            return con;
        }
        catch (SQLException e)
        {
            if (trace)
            {
                System.out.println("Error connecting to host " + host + " : " + e.getMessage());
            }
        }

        return null;
    }

    private static void activateJDBCDriver(String _driver)
    {
        try
        {
            Class.forName(_driver).newInstance();
        }
        catch (InstantiationException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }

    private static String buildUrl(String host, String port, String catalog)
    {
        return "jdbc:postgresql://" + host + "/" + catalog;
    }

    private static String getDriverName()
    {
        return "org.postgresql.Driver";
    }
}
CREATE TABLE borisk_timestamp
(
  t_timestamp timestamp
)
WITHOUT OIDS;
ALTER TABLE borisk_timestamp OWNER TO postgres;

Re: Bug in storing Timestamp

От
Kris Jurka
Дата:

On Thu, 21 Apr 2005, Boris Kirzner wrote:

>
> Kris Jurka wrote:
>
> >I am not able to reproduce this problem.  The attached test case shows a
> >problem with storing java.sql.Time into a timetz type because the correct
> >offset is not saved, but that's not what you've described.  Perhaps it is
> >something specific to your timezone?
> >
> After more investigation I found that the bug I'm talking about can be
> reproduced on timestamp column also.
>
> The configuration is as follows :
> PostgeSQL runs on WindowsXP that has "Automatically adjust clock for dst
> savings" OFF, timezone is (GMT+02:00) Jerusalem
> Client runs on WindowsXP that has "Automatically adjust clock for dst
> savings" OFF , timezone is (GMT+02:00) Jerusalem
>
> The test stores 2004-08-09 20:30:15.50 timestamp into a table and
> immediately fetches it.
> Actual result : the value fetched is 2004-08-09 21:30:15.5
> Expected result : the value fetched is 2004-08-09 20:30:15.5


This is a known bug in the 8.0 driver and seems different than your
original complaint.  Being off by an hour (the difference between the two
timezones) is the expected (and incorrect) behavior that I expected to
see.  Your original complaint was off by 20:40 which is an unusual number,
are you still seeing that?

Kris Jurka