This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 51f05ce8375 Fix MySQL 8.0.20 driver returns LocalDateTime type 
conversion exception (#28153)
51f05ce8375 is described below

commit 51f05ce83757173e1032a96fdfac7ed5bb9efa21
Author: ZhangCheng <[email protected]>
AuthorDate: Fri Aug 18 15:19:23 2023 +0800

    Fix MySQL 8.0.20 driver returns LocalDateTime type conversion exception 
(#28153)
---
 .../protocol/MySQLDateBinaryProtocolValue.java     |  5 ++---
 .../protocol/MySQLDateBinaryProtocolValueTest.java | 23 ++++++++++++++++++++++
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git 
a/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValue.java
 
b/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValue.java
index 3e5304ea700..aa29c132d52 100644
--- 
a/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValue.java
+++ 
b/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValue.java
@@ -60,15 +60,14 @@ public final class MySQLDateBinaryProtocolValue implements 
MySQLBinaryProtocolVa
     
     @Override
     public void write(final MySQLPacketPayload payload, final Object value) {
-        Timestamp timestamp = new Timestamp(((Date) value).getTime());
-        LocalDateTime dateTime = timestamp.toLocalDateTime();
+        LocalDateTime dateTime = value instanceof LocalDateTime ? 
(LocalDateTime) value : new Timestamp(((Date) 
value).getTime()).toLocalDateTime();
         int year = dateTime.getYear();
         int month = dateTime.getMonthValue();
         int dayOfMonth = dateTime.getDayOfMonth();
         int hours = dateTime.getHour();
         int minutes = dateTime.getMinute();
         int seconds = dateTime.getSecond();
-        int nanos = timestamp.getNanos();
+        int nanos = dateTime.getNano();
         boolean isTimeAbsent = 0 == hours && 0 == minutes && 0 == seconds;
         boolean isNanosAbsent = 0 == nanos;
         if (isTimeAbsent && isNanosAbsent) {
diff --git 
a/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValueTest.java
 
b/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValueTest.java
index 7e7769d5df4..1d0bc9a0ece 100644
--- 
a/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValueTest.java
+++ 
b/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/packet/command/query/binary/execute/protocol/MySQLDateBinaryProtocolValueTest.java
@@ -91,6 +91,29 @@ class MySQLDateBinaryProtocolValueTest {
         assertThrows(SQLFeatureNotSupportedException.class, () -> new 
MySQLDateBinaryProtocolValue().read(payload, false));
     }
     
+    @Test
+    void assertWriteLocalDateTimeTypeFourBytes() {
+        MySQLDateBinaryProtocolValue actual = new 
MySQLDateBinaryProtocolValue();
+        actual.write(payload, LocalDateTime.of(1970, 1, 14, 0, 0, 0));
+        verify(payload).writeInt1(4);
+        verify(payload).writeInt2(1970);
+        verify(payload).writeInt1(1);
+        verify(payload).writeInt1(14);
+    }
+    
+    @Test
+    void assertWriteLocalDateTimeTypeSevenBytes() {
+        MySQLDateBinaryProtocolValue actual = new 
MySQLDateBinaryProtocolValue();
+        actual.write(payload, LocalDateTime.of(1970, 1, 14, 12, 10, 30));
+        verify(payload).writeInt1(7);
+        verify(payload).writeInt2(1970);
+        verify(payload).writeInt1(1);
+        verify(payload).writeInt1(14);
+        verify(payload).writeInt1(12);
+        verify(payload).writeInt1(10);
+        verify(payload).writeInt1(30);
+    }
+    
     @Test
     void assertWriteWithFourBytes() {
         MySQLDateBinaryProtocolValue actual = new 
MySQLDateBinaryProtocolValue();

Reply via email to