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 4bb736f4a0 [CALCITE-7559] SqlParserUtil.parseTimeTzLiteral should 
reject unknown time zones
4bb736f4a0 is described below

commit 4bb736f4a0b376f939956f34711e98248b6b7e7e
Author: OldTruckDriver <[email protected]>
AuthorDate: Wed Jun 3 17:10:15 2026 +1000

    [CALCITE-7559] SqlParserUtil.parseTimeTzLiteral should reject unknown time 
zones
---
 .../apache/calcite/sql/parser/SqlParserUtil.java   | 14 +++++++---
 .../calcite/sql/parser/SqlParserUtilTest.java      | 31 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java 
b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
index 1ba1933fc7..c48bb846fb 100644
--- a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
@@ -371,16 +371,24 @@ public static SqlTimeTzLiteral parseTimeTzLiteral(
       final String timeZone = s.substring(lastSpace + 1);
       final String time = s.substring(0, lastSpace);
 
-      final TimeZone tz = TimeZone.getTimeZone(timeZone);
-      if (tz != null) {
+      try {
+        ZoneId zoneId = ZoneId.of(timeZone);
+        TimeZone tz = TimeZone.getTimeZone(zoneId);
         pt =
             DateTimeUtils.parsePrecisionDateTimeLiteral(time, 
Format.get().time, tz, -1);
+      } catch (DateTimeException e) {
+        String message = e.getMessage();
+        if (message == null) {
+          message = "Error parsing TIME ZONE";
+        }
+        throw SqlUtil.newContextException(pos,
+            RESOURCE.illegalLiteral("TIME WITH TIME ZONE", s, message));
       }
     }
     if (pt == null) {
       throw SqlUtil.newContextException(pos,
           RESOURCE.illegalLiteral("TIME WITH TIME ZONE", s,
-              RESOURCE.badFormat(DateTimeUtils.TIME_FORMAT_STRING).str()));
+              RESOURCE.badFormat(DateTimeUtils.TIME_FORMAT_STRING + " 
zone").str()));
     }
     final TimeWithTimeZoneString t = 
TimeWithTimeZoneString.fromCalendarFields(pt.getCalendar())
         .withFraction(pt.getFraction());
diff --git 
a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserUtilTest.java 
b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserUtilTest.java
index 03de04f860..d4e9f30d48 100644
--- a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserUtilTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserUtilTest.java
@@ -19,6 +19,7 @@
 import org.apache.calcite.avatica.util.TimeUnit;
 import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.sql.SqlIntervalQualifier;
+import org.apache.calcite.sql.SqlTimeTzLiteral;
 import org.apache.calcite.sql.SqlTimestampTzLiteral;
 
 import org.junit.jupiter.api.Test;
@@ -94,6 +95,36 @@ public class SqlParserUtilTest {
     }
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7559";>[CALCITE-7559]
+   * SqlParserUtil.parseTimeTzLiteral should reject unknown time zones</a>. */
+  @Test void testTimeWithTimeZone() {
+    SqlParserPos pos = new SqlParserPos(2, 3);
+    SqlTimeTzLiteral lit =
+        SqlParserUtil.parseTimeTzLiteral("10:10:10 GMT", pos);
+    assertThat(lit, hasToString("TIME WITH TIME ZONE '10:10:10 UTC'"));
+
+    // Like parseTimestampTzLiteral, parseTimeTzLiteral should reject unknown
+    // time zones instead of silently falling back to GMT.
+    try {
+      SqlParserUtil.parseTimeTzLiteral("10:10:10 incorrect_zone", pos);
+      fail("Should be unreachable");
+    } catch (CalciteContextException ex) {
+      assertThat(
+          ex.getMessage(), is("At line 2, column 3: Illegal TIME WITH TIME 
ZONE literal "
+              + "'10:10:10 incorrect_zone': Unknown time-zone ID: 
incorrect_zone"));
+    }
+
+    try {
+      SqlParserUtil.parseTimeTzLiteral("10:10:10", pos);
+      fail("Should be unreachable");
+    } catch (CalciteContextException ex) {
+      assertThat(
+          ex.getMessage(), is("At line 2, column 3: Illegal TIME WITH TIME 
ZONE literal "
+              + "'10:10:10': not in format 'HH:mm:ss zone'"));
+    }
+  }
+
   @Test void testMinuteToSecondIntervalToMillis() {
     final SqlIntervalQualifier qualifier =
         new SqlIntervalQualifier(TimeUnit.MINUTE, TimeUnit.SECOND, POSITION);

Reply via email to