Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[CONJ-1057] wrong decoding for binary '00:00' TIME value when using L…
…ocalTime / LocalDateTime result-set getObject
  • Loading branch information
rusher committed Feb 27, 2023
1 parent 79592a0 commit 517d541
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 31 deletions.
34 changes: 18 additions & 16 deletions src/main/java/org/mariadb/jdbc/plugin/codec/LocalDateTimeCodec.java
Expand Up @@ -199,23 +199,25 @@ public LocalDateTime decodeBinary(

switch (column.getType()) {
case TIME:
// specific case for TIME, to handle value not in 00:00:00-23:59:59
boolean negate = buf.readByte() == 1;
int day = buf.readInt();
hour = buf.readByte();
minutes = buf.readByte();
seconds = buf.readByte();
if (length > 8) {
microseconds = buf.readUnsignedInt();
}
if (length > 0) {
// specific case for TIME, to handle value not in 00:00:00-23:59:59
boolean negate = buf.readByte() == 1;
int day = buf.readInt();
hour = buf.readByte();
minutes = buf.readByte();
seconds = buf.readByte();
if (length > 8) {
microseconds = buf.readUnsignedInt();
}

if (negate) {
return LocalDateTime.of(1970, 1, 1, 0, 0)
.minusDays(day)
.minusHours(hour)
.minusMinutes(minutes)
.minusSeconds(seconds)
.minusNanos(microseconds * 1000);
if (negate) {
return LocalDateTime.of(1970, 1, 1, 0, 0)
.minusDays(day)
.minusHours(hour)
.minusMinutes(minutes)
.minusSeconds(seconds)
.minusNanos(microseconds * 1000);
}
}
break;

Expand Down
30 changes: 16 additions & 14 deletions src/main/java/org/mariadb/jdbc/plugin/codec/LocalTimeCodec.java
Expand Up @@ -202,22 +202,24 @@ public LocalTime decodeBinary(ReadableByteBuf buf, int length, ColumnDecoder col
return LocalTime.of(hour, minutes, seconds).plusNanos(microseconds * 1000);

case TIME:
boolean negate = buf.readByte() == 1;
if (length > 4) {
buf.skip(4); // skip days
if (length > 7) {
hour = buf.readByte();
minutes = buf.readByte();
seconds = buf.readByte();
if (length > 8) {
microseconds = buf.readInt();
if (length > 0) {
boolean negate = buf.readByte() == 1;
if (length > 4) {
buf.skip(4); // skip days
if (length > 7) {
hour = buf.readByte();
minutes = buf.readByte();
seconds = buf.readByte();
if (length > 8) {
microseconds = buf.readInt();
}
}
}
}
if (negate) {
// negative
long nanos = (24 * 60 * 60 - (hour * 3600 + minutes * 60 + seconds));
return LocalTime.ofNanoOfDay(nanos * 1_000_000_000 - microseconds * 1000);
if (negate) {
// negative
long nanos = (24 * 60 * 60 - (hour * 3600 + minutes * 60 + seconds));
return LocalTime.ofNanoOfDay(nanos * 1_000_000_000 - microseconds * 1000);
}
}
return LocalTime.of(hour % 24, minutes, seconds, (int) microseconds * 1000);

Expand Down
Expand Up @@ -411,8 +411,10 @@ public void getDateTimezoneTest() throws SQLException {
TimeZone.setDefault(initialTz);
try (Connection conAuto = createCon("timezone=auto")) {
getDateTimezoneTestNormal(conAuto, getPrepare(conAuto));
} catch (SQLException e) {
assertTrue(e.getMessage().contains("Setting configured timezone 'auto' fail on server"));
assertTrue(e.getCause().getMessage().contains("Unknown or incorrect time zone:"));
}

} finally {
TimeZone.setDefault(initialTz);
}
Expand Down Expand Up @@ -787,6 +789,8 @@ public void getLocalDateTime(ResultSet rs) throws SQLException {
rs.next();
assertNull(rs.getTimestamp(1));
assertNull(rs.getTimestamp(2));
assertNull(rs.getObject(1, LocalDateTime.class));
assertNull(rs.getObject(2, LocalDateTime.class));
assertEquals(
LocalDateTime.parse("9999-12-31T00:00:00.00"), rs.getObject(3, LocalDateTime.class));
}
Expand Down
Expand Up @@ -461,6 +461,8 @@ public void getLocalTime(ResultSet rs) throws SQLException {
assertEquals(Duration.parse("PT838H59M58.999999S"), rs.getObject(2, Duration.class));
assertEquals(Duration.parse("PT838H59M58.999999S"), rs.getObject("t2alias", Duration.class));
assertFalse(rs.wasNull());
assertEquals(LocalTime.parse("00:00"), rs.getObject(3, LocalTime.class));
assertEquals(LocalTime.parse("00:00"), rs.getObject(4, LocalTime.class));
assertEquals(Duration.parse("PT0S"), rs.getObject(3, Duration.class));
assertEquals(Duration.parse("PT0S"), rs.getObject(4, Duration.class));
assertFalse(rs.wasNull());
Expand Down Expand Up @@ -519,6 +521,11 @@ public void getLocalDateTime(ResultSet rs) throws SQLException {
LocalDateTime.parse("1969-12-31T05:29:47.45"), rs.getObject(3, LocalDateTime.class));
assertNull(rs.getObject(4, LocalDateTime.class));
assertTrue(rs.wasNull());
if (isMariaDBServer()) {
rs.next();
assertEquals(LocalDateTime.parse("1970-01-01T00:00"), rs.getObject(3, LocalDateTime.class));
assertEquals(LocalDateTime.parse("1970-01-01T00:00"), rs.getObject(4, LocalDateTime.class));
}
}

@Test
Expand Down

0 comments on commit 517d541

Please sign in to comment.