diff --git a/vertx-mysql-client/src/main/java/io/vertx/mysqlclient/impl/datatype/DataTypeCodec.java b/vertx-mysql-client/src/main/java/io/vertx/mysqlclient/impl/datatype/DataTypeCodec.java index d153e4cd5..543e3f4db 100644 --- a/vertx-mysql-client/src/main/java/io/vertx/mysqlclient/impl/datatype/DataTypeCodec.java +++ b/vertx-mysql-client/src/main/java/io/vertx/mysqlclient/impl/datatype/DataTypeCodec.java @@ -387,17 +387,17 @@ private static void binaryEncodeTime(LocalTime value, ByteBuf buffer) { } private static void binaryEncodeTime(Duration value, ByteBuf buffer) { - long secondsOfDuration = value.getSeconds(); - int nanosOfDuration = value.getNano(); - if (secondsOfDuration == 0 && nanosOfDuration == 0) { + if (value.isZero()) { buffer.writeByte(0); return; } byte isNegative = 0; - if (secondsOfDuration < 0) { + if (value.isNegative()) { isNegative = 1; - secondsOfDuration = -secondsOfDuration; + value = value.negated(); } + long secondsOfDuration = value.getSeconds(); + int nanosOfDuration = value.getNano(); int days = (int) (secondsOfDuration / 86400); int secondsOfADay = (int) (secondsOfDuration % 86400); @@ -415,13 +415,7 @@ private static void binaryEncodeTime(Duration value, ByteBuf buffer) { return; } - int microSecond; - if (isNegative == 1 && nanosOfDuration > 0) { - second = second - 1; - microSecond = (1000_000_000 - nanosOfDuration) / 1000; - } else { - microSecond = nanosOfDuration / 1000; - } + int microSecond = nanosOfDuration / 1000; buffer.writeByte(12); buffer.writeByte(isNegative); diff --git a/vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/data/DateTimeBinaryCodecTest.java b/vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/data/DateTimeBinaryCodecTest.java index 0d17f3bc2..9f01927ef 100644 --- a/vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/data/DateTimeBinaryCodecTest.java +++ b/vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/data/DateTimeBinaryCodecTest.java @@ -82,6 +82,11 @@ public void testEncodeFractionalSecondsPart(TestContext ctx) { testEncodeTime(ctx, Duration.ofHours(11).plusMinutes(12).plusNanos(123456000), Duration.ofHours(11).plusMinutes(12).plusNanos(123456000)); } + @Test + public void testEncodeNegativeFractionalSecondsPart(TestContext ctx) { + testEncodeTime(ctx, Duration.ofSeconds(-59).minusMillis(500), Duration.ofSeconds(-59).minusMillis(500)); + } + @Test public void testEncodeTimeFromLocalTimeWithFractionalSecondsPart(TestContext ctx) { testEncodeTime(ctx, LocalTime.of(11, 12, 0, 123456000), Duration.ofHours(11).plusMinutes(12).plusNanos(123456000), LocalTime.of(11, 12, 0, 123456000));