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();