Skip to content

Commit

Permalink
[misc] using default java ISO6801 when using Instant with default tim…
Browse files Browse the repository at this point in the history
…ezone UTC
  • Loading branch information
rusher committed Apr 18, 2023
1 parent ba7f739 commit b831488
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 8 deletions.
22 changes: 14 additions & 8 deletions src/main/java/org/mariadb/jdbc/plugin/codec/InstantCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,21 @@ public void encodeText(
Instant instant = (Instant) val;

encoder.writeByte('\'');
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
if (calParam != null) {
zonedDateTime = zonedDateTime.withZoneSameInstant(calParam.getTimeZone().toZoneId());
if (calParam == null && "UTC".equals(ZoneId.systemDefault().getId())) {
// reusing ISO6801 format, replacing T by space and removing Z
encoder.writeAscii(instant.toString().replace('T', ' '));
encoder.pos(encoder.pos() - 1); // remove 'Z'
} else {
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
if (calParam != null) {
zonedDateTime = zonedDateTime.withZoneSameInstant(calParam.getTimeZone().toZoneId());
}
encoder.writeAscii(
zonedDateTime.format(
instant.getNano() != 0
? LocalDateTimeCodec.TIMESTAMP_FORMAT
: LocalDateTimeCodec.TIMESTAMP_FORMAT_NO_FRACTIONAL));
}
encoder.writeAscii(
zonedDateTime.format(
instant.getNano() != 0
? LocalDateTimeCodec.TIMESTAMP_FORMAT
: LocalDateTimeCodec.TIMESTAMP_FORMAT_NO_FRACTIONAL));
encoder.writeByte('\'');
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,14 @@ public void getDateTimezoneTest() throws SQLException {
try (Connection conGmtm8 = createCon("timezone=auto")) {
getDateTimezoneTestGmtm8(conGmtm8, getPrepare(conGmtm8), TimeZone.getTimeZone("GMT-8"));
}
try (Connection conGmtm8 = createCon("timezone=auto&useServerPrepStmts=true")) {
getDateTimezoneTestGmtm8(conGmtm8, getPrepare(conGmtm8), TimeZone.getTimeZone("GMT-8"));
}
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
try (Connection conUtc = createCon("timezone=UTC")) {
getDateTimezoneTestUtc(conUtc, getPrepare(conUtc), TimeZone.getTimeZone("UTC"));
}

TimeZone.setDefault(initialTz);
try (Connection conAuto = createCon("timezone=auto")) {
getDateTimezoneTestNormal(conAuto, getPrepare(conAuto));
Expand Down Expand Up @@ -447,6 +455,10 @@ public void getDateTimezoneTestGmt8(Connection conGmt8, ResultSet rs, TimeZone t
prep.setInt(1, 4);
prep.setObject(2, OffsetDateTime.parse("2010-01-12T17:55:12-04:00"));
prep.execute();

prep.setInt(1, 5);
prep.setObject(2, Instant.parse("2010-01-12T17:55:13.152Z"));
prep.execute();
}
conGmt8.commit();

Expand Down Expand Up @@ -492,6 +504,9 @@ public void getDateTimezoneTestGmt8(Connection conGmt8, ResultSet rs, TimeZone t
assertEquals(1263333312000L, rs.getTimestamp(2).getTime());
assertEquals("2010-01-13 05:55:12.000000", rs.getString(2));
assertEquals("2010-01-13", rs.getDate(2).toString());

rs.next();
assertEquals("2010-01-12T17:55:13.152Z", rs.getObject(2, Instant.class).toString());
}
conGmt8.rollback();
}
Expand Down Expand Up @@ -523,6 +538,10 @@ public void getDateTimezoneTestGmtm8(Connection conGmt8, ResultSet rs, TimeZone
prep.setInt(1, 4);
prep.setObject(2, OffsetDateTime.parse("2010-01-12T17:55:12+04:00"));
prep.execute();

prep.setInt(1, 5);
prep.setObject(2, Instant.parse("2010-01-12T17:55:13.152Z"));
prep.execute();
}
conGmt8.commit();

Expand Down Expand Up @@ -568,6 +587,92 @@ public void getDateTimezoneTestGmtm8(Connection conGmt8, ResultSet rs, TimeZone
assertEquals(1263304512000L, rs.getTimestamp(2).getTime());
assertEquals("2010-01-12 05:55:12.000000", rs.getString(2));
assertEquals("2010-01-12", rs.getDate(2).toString());

rs.next();
assertEquals("2010-01-12T17:55:13.152Z", rs.getObject(2, Instant.class).toString());
}
conGmt8.rollback();
}

public void getDateTimezoneTestUtc(Connection conGmt8, ResultSet rs, TimeZone tz)
throws SQLException {

assertEquals("2010-01-12T01:55:12Z", rs.getObject(1, OffsetDateTime.class).toString());

conGmt8.createStatement().execute("TRUNCATE TABLE DateTimeCodec3");
try (PreparedStatement prep =
conGmt8.prepareStatement("INSERT INTO DateTimeCodec3 values (?,?)")) {
prep.setInt(1, -2);
prep.setString(2, "2010-01-12 01:55:12");
prep.execute();

prep.setInt(1, 1);
prep.setObject(2, OffsetDateTime.parse("2010-01-12T01:55:12Z"));
prep.execute();

prep.setInt(1, 2);
prep.setObject(2, OffsetDateTime.parse("2010-01-12T01:55:12-01:00"));
prep.execute();

prep.setInt(1, 3);
prep.setObject(2, OffsetDateTime.parse("2010-01-12T01:55:12Z"));
prep.execute();

prep.setInt(1, 4);
prep.setObject(2, OffsetDateTime.parse("2010-01-12T17:55:12+04:00"));
prep.execute();

prep.setInt(1, 5);
prep.setObject(2, Instant.parse("2010-01-12T17:55:13.152Z"));
prep.execute();
}
conGmt8.commit();

java.sql.Statement stmt = conGmt8.createStatement();
stmt.execute("START TRANSACTION"); // if MAXSCALE ensure using WRITER
try (PreparedStatement prepStmt = conGmt8.prepareStatement("select * from DateTimeCodec3")) {
rs = prepStmt.executeQuery();
rs.next();
assertEquals("2010-01-12T01:55:12Z", rs.getObject(2, OffsetDateTime.class).toString());
assertEquals("2010-01-12 01:55:12.000000", rs.getString(2));

rs.next();
assertEquals("2010-01-12T01:55:12Z", rs.getObject(2, OffsetDateTime.class).toString());
assertEquals("2010-01-12 01:55:12.0", rs.getTimestamp(2).toString());
assertEquals(1263261312000L, rs.getTimestamp(2).getTime());
assertEquals(
"2010-01-12 02:55:12.0",
rs.getTimestamp(2, Calendar.getInstance(TimeZone.getTimeZone("GMT-1:00"))).toString());
assertEquals("2010-01-12 01:55:12.000000", rs.getString(2));
assertEquals("2010-01-12", rs.getDate(2).toString());
assertEquals(
"2010-01-12",
rs.getDate(2, Calendar.getInstance(TimeZone.getTimeZone("UTC"))).toString());
assertEquals("2010-01-12T01:55:12", rs.getObject(2, LocalDateTime.class).toString());

rs.next();
assertEquals("2010-01-12T02:55:12Z", rs.getObject(2, OffsetDateTime.class).toString());
assertEquals("2010-01-12 02:55:12.0", rs.getTimestamp(2).toString());
assertEquals(1263264912000L, rs.getTimestamp(2).getTime());
assertEquals("2010-01-12 02:55:12.000000", rs.getString(2));
assertEquals("2010-01-12", rs.getDate(2).toString());

rs.next();
assertEquals("2010-01-12T01:55:12Z", rs.getObject(2, OffsetDateTime.class).toString());
assertEquals("2010-01-12 01:55:12.0", rs.getTimestamp(2).toString());
assertEquals(1263261312000L, rs.getTimestamp(2).getTime());
assertEquals("2010-01-12 01:55:12.000000", rs.getString(2));
assertEquals("2010-01-12", rs.getDate(2).toString());

rs.next();
assertEquals("2010-01-12T13:55:12Z", rs.getObject(2, OffsetDateTime.class).toString());
assertEquals("2010-01-12 13:55:12.0", rs.getTimestamp(2).toString());
assertEquals(1263304512000L, rs.getTimestamp(2).getTime());
assertEquals("2010-01-12 13:55:12.000000", rs.getString(2));
assertEquals("2010-01-12", rs.getDate(2).toString());

rs.next();
assertEquals("2010-01-12T17:55:13.152Z", rs.getObject(2, Instant.class).toString());
}
conGmt8.rollback();
}
Expand Down

0 comments on commit b831488

Please sign in to comment.