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