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

Reply via email to