This is an automated email from the ASF dual-hosted git repository.
mihaibudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new fda2874d73 [CALCITE-7560]
SqlFunctions.DateParseFunction.parseTimestamp(..., timeZone) accepts unknown
time zones and silently falls back to GMT
fda2874d73 is described below
commit fda2874d73250c373f1e74b445547f1c0b0debd8
Author: OldTruckDriver <[email protected]>
AuthorDate: Thu Jun 4 19:14:10 2026 +1000
[CALCITE-7560] SqlFunctions.DateParseFunction.parseTimestamp(..., timeZone)
accepts unknown time zones and silently falls back to GMT
---
.../java/org/apache/calcite/runtime/SqlFunctions.java | 4 +++-
.../org/apache/calcite/test/SqlFunctionsTest.java | 19 +++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
index c1ebafe8ed..7211f78de3 100644
--- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
+++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
@@ -5604,7 +5604,9 @@ public long parseTimestamp(String fmtString, String
timestamp) {
public long parseTimestamp(String fmtString, String timestamp,
String timeZone) {
- TimeZone tz = TimeZone.getTimeZone(timeZone);
+ // Validate the zone id (rejecting unknown ids) rather than letting
+ // TimeZone.getTimeZone silently fall back to GMT.
+ TimeZone tz = TimeZone.getTimeZone(ZoneId.of(timeZone));
final long millisSinceEpoch =
internalParseDatetime(fmtString, timestamp, timeZone);
return toLong(new java.sql.Timestamp(millisSinceEpoch), tz);
diff --git a/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java
b/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java
index 9c7f4b4a21..96c111bd39 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java
@@ -90,6 +90,7 @@
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.fail;
import static java.nio.charset.StandardCharsets.UTF_8;
@@ -2093,4 +2094,22 @@ private long sqlTimestamp(String str) {
assertArrayEquals(new Object[]{null, 100}, result.get(0));
assertArrayEquals(new Object[]{null, 200}, result.get(1));
}
+
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7560">[CALCITE-7560]
+ * SqlFunctions.DateParseFunction.parseTimestamp(..., timeZone) accepts
unknown
+ * time zones and silently falls back to GMT</a>. */
+ @Test void testParseTimestampRejectsUnknownTimeZone() {
+ final SqlFunctions.DateParseFunction parse = new
SqlFunctions.DateParseFunction();
+
+ // A valid time zone is accepted.
+ assertThat(
+ parse.parseTimestamp("%Y-%m-%d %H:%M:%S", "2024-01-01 00:00:00",
"UTC"),
+ is(parse.parseTimestamp("%Y-%m-%d %H:%M:%S", "2024-01-01 00:00:00")));
+
+ // An unknown time zone is rejected rather than silently reinterpreted as
GMT.
+ assertThrows(RuntimeException.class,
+ () -> parse.parseTimestamp("%Y-%m-%d %H:%M:%S",
+ "2024-01-01 00:00:00", "Asia/Sanghai"));
+ }
}