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

terrymanu 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 583271f4d45 Fix firebird result timestamp fraction (#40172)
583271f4d45 is described below

commit 583271f4d45c563b49c58cac94caeee861b4e697
Author: Maxim Igoshin <[email protected]>
AuthorDate: Sat Oct 17 04:59:02 2026 +0300

    Fix firebird result timestamp fraction (#40172)
    
    * Keep the fractions of a millisecond of Firebird TIMESTAMP result values
    
    * Retrigger CI
    
    * Fix CODE_OF_CONDUCT violations in Firebird result timestamp encoding
---
 .../protocol/FirebirdTimestampBinaryProtocolValue.java  | 14 +++++++++++++-
 .../FirebirdTimestampBinaryProtocolValueTest.java       | 17 +++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/FirebirdTimestampBinaryProtocolValue.java
 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/FirebirdTimestampBinaryProtocolValue.java
index 0b7f0a8903c..bcababaaf7f 100644
--- 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/FirebirdTimestampBinaryProtocolValue.java
+++ 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/FirebirdTimestampBinaryProtocolValue.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.database.protocol.firebird.packet.command.quer
 
 import 
org.apache.shardingsphere.database.protocol.firebird.packet.command.query.statement.execute.protocol.util.FirebirdDateTimeUtils;
 import 
org.apache.shardingsphere.database.protocol.firebird.payload.FirebirdPacketPayload;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
@@ -36,11 +37,22 @@ public final class FirebirdTimestampBinaryProtocolValue 
implements FirebirdBinar
     
     @Override
     public void write(final FirebirdPacketPayload payload, final Object value) 
{
-        LocalDateTime localDateTime = value instanceof LocalDateTime ? 
(LocalDateTime) value : new Timestamp(((Date) 
value).getTime()).toLocalDateTime();
+        LocalDateTime localDateTime = toLocalDateTime(value);
         payload.writeInt4(FirebirdDateTimeUtils.getEncodedDate(localDateTime));
         payload.writeInt4(new 
FirebirdDateTimeUtils(localDateTime).getEncodedTime());
     }
     
+    @HighFrequencyInvocation
+    private LocalDateTime toLocalDateTime(final Object value) {
+        if (value instanceof LocalDateTime) {
+            return (LocalDateTime) value;
+        }
+        if (value instanceof Timestamp) {
+            return ((Timestamp) value).toLocalDateTime();
+        }
+        return new Timestamp(((Date) value).getTime()).toLocalDateTime();
+    }
+    
     @Override
     public int getLength(final FirebirdPacketPayload payload) {
         return 8;
diff --git 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/FirebirdTimestampBinaryProtocolValueTest.java
 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/FirebirdTimestampBinaryProtocolValueTest.java
index a95fbce1234..39d79046fb2 100644
--- 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/FirebirdTimestampBinaryProtocolValueTest.java
+++ 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/FirebirdTimestampBinaryProtocolValueTest.java
@@ -26,6 +26,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
@@ -55,6 +56,22 @@ class FirebirdTimestampBinaryProtocolValueTest {
         verify(payload).writeInt4(new 
FirebirdDateTimeUtils(dateTime).getEncodedTime());
     }
     
+    @Test
+    void assertWriteWithSubMillisecondTimestamp() {
+        LocalDateTime dateTime = LocalDateTime.of(2024, 2, 29, 23, 59, 59, 
999_900_000);
+        new FirebirdTimestampBinaryProtocolValue().write(payload, 
Timestamp.valueOf(dateTime));
+        
verify(payload).writeInt4(FirebirdDateTimeUtils.getEncodedDate(dateTime));
+        verify(payload).writeInt4(new 
FirebirdDateTimeUtils(dateTime).getEncodedTime());
+    }
+    
+    @Test
+    void assertWriteWithJavaUtilDate() {
+        LocalDateTime dateTime = LocalDateTime.of(2024, 1, 3, 14, 0, 0, 
123_000_000);
+        new FirebirdTimestampBinaryProtocolValue().write(payload, new 
Date(Timestamp.valueOf(dateTime).getTime()));
+        
verify(payload).writeInt4(FirebirdDateTimeUtils.getEncodedDate(dateTime));
+        verify(payload).writeInt4(new 
FirebirdDateTimeUtils(dateTime).getEncodedTime());
+    }
+    
     @Test
     void assertWriteWithLocalDateTime() {
         LocalDateTime dateTime = LocalDateTime.parse("2024-01-02T13:00:00");

Reply via email to