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 3be29fba0cd Decode Firebird DATE, TIME and TIMESTAMP parameter values 
as the server does (#40180)
3be29fba0cd is described below

commit 3be29fba0cde107b23729036fcf6ccb089a8bcb0
Author: Maxim Igoshin <[email protected]>
AuthorDate: Thu Oct 15 19:10:39 2026 +0300

    Decode Firebird DATE, TIME and TIMESTAMP parameter values as the server 
does (#40180)
---
 .../protocol/util/FirebirdDateTimeUtils.java       | 20 +++++++-----
 .../protocol/util/FirebirdDateTimeUtilsTest.java   | 36 +++++++++-------------
 2 files changed, 27 insertions(+), 29 deletions(-)

diff --git 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/util/FirebirdDateTimeUtils.java
 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/util/FirebirdDateTimeUtils.java
index 371ebd02b6e..495c8ea6f14 100644
--- 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/util/FirebirdDateTimeUtils.java
+++ 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/util/FirebirdDateTimeUtils.java
@@ -22,6 +22,7 @@ import lombok.Setter;
 
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 
 /**
  * Firebird date and time utility class.
@@ -123,12 +124,17 @@ public final class FirebirdDateTimeUtils {
         day = sqlDate / 4;
         sqlDate = (4 * day + 3) / 1461;
         day = 4 * day + 3 - 1461 * sqlDate;
-        day = (day + 5) / 5;
+        day = (day + 4) / 4;
         month = (5 * day - 3) / 153;
         day = 5 * day - 3 - 153 * month;
         day = (day + 5) / 5;
         year = 100 * century + sqlDate;
-        month += 3;
+        if (month < 10) {
+            month += 3;
+        } else {
+            month -= 9;
+            year += 1;
+        }
         return this;
     }
     
@@ -162,7 +168,7 @@ public final class FirebirdDateTimeUtils {
      * @return timestamp representation of the current date-time fields
      */
     public Timestamp asTimestamp() {
-        return Timestamp.valueOf(LocalDateTime.of(year, month, day, hour, 
minute, second, fractions));
+        return Timestamp.valueOf(LocalDateTime.of(year, month, day, hour, 
minute, second, fractions * NANOSECONDS_PER_FRACTION));
     }
     
     /**
@@ -176,13 +182,13 @@ public final class FirebirdDateTimeUtils {
     }
     
     /**
-     * Convert encoded time value to {@link Timestamp}.
+     * Convert encoded time value to {@link LocalTime}.
      *
      * @param encodedTime encoded time as integer
-     * @return timestamp representation of the encoded time
+     * @return local time representation of the encoded time
      */
-    public static Timestamp getTime(final int encodedTime) {
-        return new FirebirdDateTimeUtils().setTime(encodedTime).asTimestamp();
+    public static LocalTime getTime(final int encodedTime) {
+        return LocalTime.ofNanoOfDay((long) encodedTime * 
NANOSECONDS_PER_FRACTION);
     }
     
     /**
diff --git 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/util/FirebirdDateTimeUtilsTest.java
 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/util/FirebirdDateTimeUtilsTest.java
index 1f0caf40214..fd9e9b767da 100644
--- 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/util/FirebirdDateTimeUtilsTest.java
+++ 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/statement/execute/protocol/util/FirebirdDateTimeUtilsTest.java
@@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test;
 
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
@@ -36,7 +37,7 @@ class FirebirdDateTimeUtilsTest {
         FirebirdDateTimeUtils decoded = new 
FirebirdDateTimeUtils().setDate(actualEncodedDate);
         assertThat(decoded.getYear(), is(2024));
         assertThat(decoded.getMonth(), is(4));
-        assertThat(decoded.getDay(), is(6));
+        assertThat(decoded.getDay(), is(15));
     }
     
     @Test
@@ -45,9 +46,9 @@ class FirebirdDateTimeUtilsTest {
         int actualEncodedDate = 
FirebirdDateTimeUtils.getEncodedDate(sourceDateTime);
         assertThat(actualEncodedDate, is(60341));
         FirebirdDateTimeUtils decoded = new 
FirebirdDateTimeUtils().setDate(actualEncodedDate);
-        assertThat(decoded.getYear(), is(2023));
-        assertThat(decoded.getMonth(), is(11));
-        assertThat(decoded.getDay(), is(25));
+        assertThat(decoded.getYear(), is(2024));
+        assertThat(decoded.getMonth(), is(2));
+        assertThat(decoded.getDay(), is(1));
     }
     
     @Test
@@ -74,28 +75,19 @@ class FirebirdDateTimeUtilsTest {
         LocalDateTime sourceDateTime = LocalDateTime.of(2023, 7, 1, 0, 0);
         int encodedDate = FirebirdDateTimeUtils.getEncodedDate(sourceDateTime);
         Timestamp actualDate = FirebirdDateTimeUtils.getDate(encodedDate);
-        LocalDateTime expectedDateTime = LocalDateTime.of(2023, 6, 6, 0, 0);
+        LocalDateTime expectedDateTime = LocalDateTime.of(2023, 7, 1, 0, 0);
         assertThat(actualDate.toLocalDateTime(), is(expectedDateTime));
     }
     
     @Test
     void assertGetTime() {
-        LocalDateTime sourceDateTime = LocalDateTime.of(2024, 1, 1, 5, 6, 7, 
100_000);
-        int encodedTime = new 
FirebirdDateTimeUtils(sourceDateTime).getEncodedTime();
-        Timestamp actualTime = FirebirdDateTimeUtils.getTime(encodedTime);
-        LocalDateTime expectedDateTime = LocalDateTime.of(1, 1, 1, 
sourceDateTime.getHour(), sourceDateTime.getMinute(), 
sourceDateTime.getSecond(),
-                (sourceDateTime.getNano() / 
FirebirdDateTimeUtils.NANOSECONDS_PER_FRACTION) % 
FirebirdDateTimeUtils.FRACTIONS_PER_SECOND);
-        assertThat(actualTime.toLocalDateTime(), is(expectedDateTime));
+        assertThat(FirebirdDateTimeUtils.getTime(452967891), 
is(LocalTime.of(12, 34, 56, 789_100_000)));
     }
     
     @Test
     void assertGetDateTime() {
-        LocalDateTime sourceDateTime = LocalDateTime.of(2024, 12, 31, 23, 59, 
58);
-        int encodedDate = FirebirdDateTimeUtils.getEncodedDate(sourceDateTime);
-        int encodedTime = new 
FirebirdDateTimeUtils(sourceDateTime).getEncodedTime();
-        Timestamp actualDateTime = 
FirebirdDateTimeUtils.getDateTime(encodedDate, encodedTime);
-        LocalDateTime expectedDateTime = LocalDateTime.of(2024, 10, 31, 
sourceDateTime.getHour(), sourceDateTime.getMinute(), 
sourceDateTime.getSecond(), 0);
-        assertThat(actualDateTime.toLocalDateTime(), is(expectedDateTime));
+        Timestamp actualDateTime = FirebirdDateTimeUtils.getDateTime(61315, 
452967890);
+        assertThat(actualDateTime.toLocalDateTime(), is(LocalDateTime.of(2026, 
10, 2, 12, 34, 56, 789_000_000)));
     }
     
     @Test
@@ -104,15 +96,15 @@ class FirebirdDateTimeUtilsTest {
         int encodedDate = FirebirdDateTimeUtils.getEncodedDate(sourceDateTime);
         int encodedTime = new 
FirebirdDateTimeUtils(sourceDateTime).getEncodedTime();
         Timestamp actualDateTime = 
FirebirdDateTimeUtils.getDateTimeWithOffset(encodedDate, encodedTime, 60);
-        LocalDateTime expectedDateTime = LocalDateTime.of(2024, 11, 1, 
sourceDateTime.getHour(), sourceDateTime.getMinute(), 
sourceDateTime.getSecond(), 0);
+        LocalDateTime expectedDateTime = LocalDateTime.of(2025, 1, 1, 
sourceDateTime.getHour(), sourceDateTime.getMinute(), 
sourceDateTime.getSecond(), 0);
         assertThat(actualDateTime.toLocalDateTime(), is(expectedDateTime));
     }
     
     @Test
     void assertDecodeDateForJanFebBranch() {
-        FirebirdDateTimeUtils decoded = new 
FirebirdDateTimeUtils().setDate(-1999715);
-        assertThat(decoded.getMonth(), is(1));
-        assertThat(decoded.getYear(), is(-3616));
-        assertThat(decoded.getDay(), is(-29));
+        FirebirdDateTimeUtils decoded = new 
FirebirdDateTimeUtils().setDate(60369);
+        assertThat(decoded.getYear(), is(2024));
+        assertThat(decoded.getMonth(), is(2));
+        assertThat(decoded.getDay(), is(29));
     }
 }

Reply via email to