[ https://issues.apache.org/jira/browse/IGNITE-22056?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Pavel Pereslegin updated IGNITE-22056: -------------------------------------- Labels: ignite-3 (was: ) > Jdbc. Incorrect value can be read for a column with Instant. > ------------------------------------------------------------ > > Key: IGNITE-22056 > URL: https://issues.apache.org/jira/browse/IGNITE-22056 > Project: Ignite > Issue Type: Bug > Reporter: Pavel Pereslegin > Priority: Major > Labels: ignite-3 > > For dates (before 1900), we can get the incorrect value using the > ResultSet#getTimestamp method (for a column with Instant value (TIMESTAMP > WITH TIME ZONE) ). > Reproducer > {code:java} > @Test > public void testTimestamps() throws SQLException { > // Ignoring time zone. > TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC"))); > try (Connection conn = DriverManager.getConnection(URL)) { > try (Statement stmt = conn.createStatement()) { > stmt.execute( > "CREATE TABLE t (tt_id INT PRIMARY KEY, dt timestamp, ts > timestamp with local time zone);" > + "INSERT INTO t VALUES(0, '1581-12-31 00:00:00', > '1581-12-31 00:00:00')" > ); > } > try (Statement stmt = conn.createStatement()) { > try (ResultSet rs = stmt.executeQuery("select dt, ts from t")) { > assertTrue(rs.next()); > LocalDateTime ldt = > LocalDateTime.parse("1581-12-31T00:00:00"); > assertEquals(ldt, rs.getObject("dt")); > assertEquals(ldt.atOffset(ZoneOffset.UTC).toInstant(), > rs.getObject("ts")); > Timestamp tsFromDateTime = rs.getTimestamp("dt"); > Timestamp tsFromTimestamp = rs.getTimestamp("ts"); > assertEquals(tsFromDateTime, tsFromTimestamp); // fails > // Expected :1581-12-31 00:00:00.0 > // Actual :1581-12-21 00:00:00.0 > } > } > } > } > {code} > The main problem is the poor implementation of java.sql.Timestamp. > To be specific, {{valueOf(LocalDateTime)}} and {{from(Instant)}} constructs > different timestamps, even for the same dates. > {code:java} > TimeZone.setDefault(TimeZone.getTimeZone("UTC")); > Instant instant = Instant.parse("1581-12-31T00:00:00Z"); > LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, > ZoneId.of("UTC")); > Timestamp rightMillisTs = Timestamp.from(instant); > Timestamp wrongMillisTs = Timestamp.valueOf(localDateTime); > // This alidation fails. > assertEquals(rightMillisTs.getTime(), wrongMillisTs.getTime()); > // Expected :-12244176000000 > // Actual :-12243312000000 > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)