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