This is an automated email from the ASF dual-hosted git repository.
MaxGekk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new ffddfb11732b [SPARK-57563][SQL][TEST] Add SQL golden-file test
coverage for TIME to match DATE/TIMESTAMP
ffddfb11732b is described below
commit ffddfb11732b1cef800a30c40b228e9dc92e766f
Author: Vaibhav Garg <[email protected]>
AuthorDate: Thu Jun 25 10:34:30 2026 +0200
[SPARK-57563][SQL][TEST] Add SQL golden-file test coverage for TIME to
match DATE/TIMESTAMP
### What changes were proposed in this pull request?
Add TIME data type coverage to the SQL golden-file test suites
(`sql-tests`) where DATE and TIMESTAMP already have coverage but TIME did not.
This brings TIME to parity with the other temporal types for these suites. No
engine or logic changes are included. SQL inputs were added and the `results/`
and `analyzer-results/` files were regenerated via `SQLQueryTestSuite`
(generated `.out` files are not hand-edited).
Per-file changes:
- `try_cast.sql` — add `TRY_CAST(... AS TIME)`, valid and invalid cases
(invalid returns NULL)
- `try_datetime_functions.sql` — add `try_to_time`, mirroring the existing
`try_to_timestamp` cases
- `datetime-parsing.sql` / `datetime-parsing-invalid.sql` /
`datetime-parsing-legacy.sql` — add `to_time` parsing including invalid inputs;
the legacy file inherits the cases through its existing `--IMPORT` of
`datetime-parsing.sql`
- `typeCoercion/native/dateTimeOperations.sql` — add TIME +/- day-time
interval and TIME - TIME (which yields INTERVAL HOUR TO SECOND)
TIME formatting parity in `datetime-formatting.sql` /
`datetime-formatting-invalid.sql` / `datetime-formatting-legacy.sql` is
intentionally left out of this PR. It depends on the `time_format` function
(SPARK-54588), which has not landed yet, and `date_format` / `to_char` do not
accept the TIME type, so there is currently no pattern-based way to format a
TIME. It will be added as a follow-up once SPARK-54588 merges.
### Why are the changes needed?
The TIME type was added by SPIP SPARK-51162 (shipped in Spark 4.1.0) and
works in the engine, but it lacked the shared golden-file coverage that DATE
and TIMESTAMP have. Adding it locks in correctness for these suites so future
changes that regress TIME casting, parsing, or arithmetic are caught
automatically. This is a sub-task of the TIME umbrella SPARK-57550.
### Does this PR introduce _any_ user-facing change?
No. Test-only change.
### How was this patch tested?
Regenerated golden files with `SPARK_GENERATE_GOLDEN_FILES=1 build/sbt
"sql/testOnly org.apache.spark.sql.SQLQueryTestSuite"`, then confirmed the
suite passes in verify mode (without the regenerate flag) for all touched
files: `try_cast.sql`, `try_datetime_functions.sql`, `datetime-parsing*.sql`,
`typeCoercion/native/dateTimeOperations.sql`, and `postgreSQL/time.sql`. All
passed.
### Was this patch authored or co-authored using generative AI tooling?
Yes. Generated using Kiro (Claude Opus 4.8)
Closes #56690 from vboo123/SPARK-57563.
Lead-authored-by: Vaibhav Garg <[email protected]>
Co-authored-by: Vaibhav Garg <[email protected]>
Signed-off-by: Max Gekk <[email protected]>
---
.../datetime-parsing-invalid.sql.out | 35 +++++++++
.../datetime-parsing-legacy.sql.out | 42 ++++++++++
.../analyzer-results/datetime-parsing.sql.out | 42 ++++++++++
.../nonansi/datetime-parsing-invalid.sql.out | 35 +++++++++
.../nonansi/try_datetime_functions.sql.out | 52 +++++++++++++
.../sql-tests/analyzer-results/try_cast.sql.out | 28 +++++++
.../try_datetime_functions.sql.out | 52 +++++++++++++
.../typeCoercion/native/dateTimeOperations.sql.out | 28 +++++++
.../sql-tests/inputs/datetime-parsing-invalid.sql | 7 ++
.../sql-tests/inputs/datetime-parsing.sql | 8 ++
.../test/resources/sql-tests/inputs/try_cast.sql | 8 +-
.../sql-tests/inputs/try_datetime_functions.sql | 6 ++
.../typeCoercion/native/dateTimeOperations.sql | 6 ++
.../results/datetime-parsing-invalid.sql.out | 89 ++++++++++++++++++++++
.../results/datetime-parsing-legacy.sql.out | 48 ++++++++++++
.../sql-tests/results/datetime-parsing.sql.out | 48 ++++++++++++
.../nonansi/datetime-parsing-invalid.sql.out | 72 +++++++++++++++++
.../results/nonansi/try_datetime_functions.sql.out | 58 ++++++++++++++
.../resources/sql-tests/results/try_cast.sql.out | 32 ++++++++
.../results/try_datetime_functions.sql.out | 58 ++++++++++++++
.../typeCoercion/native/dateTimeOperations.sql.out | 32 ++++++++
21 files changed, 785 insertions(+), 1 deletion(-)
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing-invalid.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing-invalid.sql.out
index 74146ab17a4d..4312ae9a2554 100644
---
a/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing-invalid.sql.out
+++
b/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing-invalid.sql.out
@@ -200,3 +200,38 @@ select cast("Unparseable" as date)
-- !query analysis
Project [cast(Unparseable as date) AS CAST(Unparseable AS DATE)#x]
+- OneRowRelation
+
+
+-- !query
+select to_time("24", "HH")
+-- !query analysis
+Project [to_time(24, Some(HH)) AS to_time(24, HH)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time("12:60", "HH:mm")
+-- !query analysis
+Project [to_time(12:60, Some(HH:mm)) AS to_time(12:60, HH:mm)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time("12:00:60", "HH:mm:ss")
+-- !query analysis
+Project [to_time(12:00:60, Some(HH:mm:ss)) AS to_time(12:00:60, HH:mm:ss)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time("Unparseable", "HH:mm:ss")
+-- !query analysis
+Project [to_time(Unparseable, Some(HH:mm:ss)) AS to_time(Unparseable,
HH:mm:ss)#x]
++- OneRowRelation
+
+
+-- !query
+select cast("Unparseable" as time)
+-- !query analysis
+Project [cast(Unparseable as time(6)) AS CAST(Unparseable AS TIME(6))#x]
++- OneRowRelation
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing-legacy.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing-legacy.sql.out
index 7907279fb020..559d65326766 100644
---
a/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing-legacy.sql.out
+++
b/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing-legacy.sql.out
@@ -179,3 +179,45 @@ select to_timestamp('2020-12-31-366', 'yyyy-MM-dd-DDD')
-- !query analysis
Project [to_timestamp(2020-12-31-366, Some(yyyy-MM-dd-DDD), TimestampType,
Some(America/Los_Angeles), true) AS to_timestamp(2020-12-31-366,
yyyy-MM-dd-DDD)#x]
+- OneRowRelation
+
+
+-- !query
+select to_time('00:00:00')
+-- !query analysis
+Project [to_time(00:00:00, None) AS to_time(00:00:00)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('12', 'HH')
+-- !query analysis
+Project [to_time(12, Some(HH)) AS to_time(12, HH)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('12:34', 'HH:mm')
+-- !query analysis
+Project [to_time(12:34, Some(HH:mm)) AS to_time(12:34, HH:mm)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('12:34:56', 'HH:mm:ss')
+-- !query analysis
+Project [to_time(12:34:56, Some(HH:mm:ss)) AS to_time(12:34:56, HH:mm:ss)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('12:34:56.123456', 'HH:mm:ss.SSSSSS')
+-- !query analysis
+Project [to_time(12:34:56.123456, Some(HH:mm:ss.SSSSSS)) AS
to_time(12:34:56.123456, HH:mm:ss.SSSSSS)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('01:02:03 PM', 'hh:mm:ss a')
+-- !query analysis
+Project [to_time(01:02:03 PM, Some(hh:mm:ss a)) AS to_time(01:02:03 PM,
hh:mm:ss a)#x]
++- OneRowRelation
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing.sql.out
index 7907279fb020..559d65326766 100644
---
a/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing.sql.out
+++
b/sql/core/src/test/resources/sql-tests/analyzer-results/datetime-parsing.sql.out
@@ -179,3 +179,45 @@ select to_timestamp('2020-12-31-366', 'yyyy-MM-dd-DDD')
-- !query analysis
Project [to_timestamp(2020-12-31-366, Some(yyyy-MM-dd-DDD), TimestampType,
Some(America/Los_Angeles), true) AS to_timestamp(2020-12-31-366,
yyyy-MM-dd-DDD)#x]
+- OneRowRelation
+
+
+-- !query
+select to_time('00:00:00')
+-- !query analysis
+Project [to_time(00:00:00, None) AS to_time(00:00:00)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('12', 'HH')
+-- !query analysis
+Project [to_time(12, Some(HH)) AS to_time(12, HH)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('12:34', 'HH:mm')
+-- !query analysis
+Project [to_time(12:34, Some(HH:mm)) AS to_time(12:34, HH:mm)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('12:34:56', 'HH:mm:ss')
+-- !query analysis
+Project [to_time(12:34:56, Some(HH:mm:ss)) AS to_time(12:34:56, HH:mm:ss)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('12:34:56.123456', 'HH:mm:ss.SSSSSS')
+-- !query analysis
+Project [to_time(12:34:56.123456, Some(HH:mm:ss.SSSSSS)) AS
to_time(12:34:56.123456, HH:mm:ss.SSSSSS)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time('01:02:03 PM', 'hh:mm:ss a')
+-- !query analysis
+Project [to_time(01:02:03 PM, Some(hh:mm:ss a)) AS to_time(01:02:03 PM,
hh:mm:ss a)#x]
++- OneRowRelation
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/nonansi/datetime-parsing-invalid.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/nonansi/datetime-parsing-invalid.sql.out
index ad4a2feb9661..993f37faa6fd 100644
---
a/sql/core/src/test/resources/sql-tests/analyzer-results/nonansi/datetime-parsing-invalid.sql.out
+++
b/sql/core/src/test/resources/sql-tests/analyzer-results/nonansi/datetime-parsing-invalid.sql.out
@@ -200,3 +200,38 @@ select cast("Unparseable" as date)
-- !query analysis
Project [cast(Unparseable as date) AS CAST(Unparseable AS DATE)#x]
+- OneRowRelation
+
+
+-- !query
+select to_time("24", "HH")
+-- !query analysis
+Project [to_time(24, Some(HH)) AS to_time(24, HH)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time("12:60", "HH:mm")
+-- !query analysis
+Project [to_time(12:60, Some(HH:mm)) AS to_time(12:60, HH:mm)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time("12:00:60", "HH:mm:ss")
+-- !query analysis
+Project [to_time(12:00:60, Some(HH:mm:ss)) AS to_time(12:00:60, HH:mm:ss)#x]
++- OneRowRelation
+
+
+-- !query
+select to_time("Unparseable", "HH:mm:ss")
+-- !query analysis
+Project [to_time(Unparseable, Some(HH:mm:ss)) AS to_time(Unparseable,
HH:mm:ss)#x]
++- OneRowRelation
+
+
+-- !query
+select cast("Unparseable" as time)
+-- !query analysis
+Project [cast(Unparseable as time(6)) AS CAST(Unparseable AS TIME(6))#x]
++- OneRowRelation
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/nonansi/try_datetime_functions.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/nonansi/try_datetime_functions.sql.out
index 27751e0503a6..d518b88d966f 100644
---
a/sql/core/src/test/resources/sql-tests/analyzer-results/nonansi/try_datetime_functions.sql.out
+++
b/sql/core/src/test/resources/sql-tests/analyzer-results/nonansi/try_datetime_functions.sql.out
@@ -39,3 +39,55 @@ select try_to_timestamp('22 05 2020 Friday', 'dd MM yyyy
EEEEEE')
-- !query analysis
Project [try_to_timestamp(22 05 2020 Friday, Some(dd MM yyyy EEEEEE),
TimestampType, Some(America/Los_Angeles), false) AS try_to_timestamp(22 05 2020
Friday, dd MM yyyy EEEEEE)#x]
+- OneRowRelation
+
+
+-- !query
+select try_to_time(null), try_to_time('00:12:00'), try_to_time('01:02:03',
'HH:mm:ss')
+-- !query analysis
+Project [try_to_time(to_time(null, None)) AS try_to_time(to_time(NULL))#x,
try_to_time(to_time(00:12:00, None)) AS try_to_time(to_time(00:12:00))#x,
try_to_time(to_time(01:02:03, Some(HH:mm:ss))) AS try_to_time(to_time(01:02:03,
HH:mm:ss))#x]
++- OneRowRelation
+
+
+-- !query
+select try_to_time(1)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"1\"",
+ "inputType" : "\"INT\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"STRING\"",
+ "sqlExpr" : "\"to_time(1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 21,
+ "fragment" : "try_to_time(1)"
+ } ]
+}
+
+
+-- !query
+select try_to_time('12:00:00 abc')
+-- !query analysis
+Project [try_to_time(to_time(12:00:00 abc, None)) AS
try_to_time(to_time(12:00:00 abc))#x]
++- OneRowRelation
+
+
+-- !query
+select try_to_time('10:11:12.', 'HH:mm:ss.SSSSSS')
+-- !query analysis
+Project [try_to_time(to_time(10:11:12., Some(HH:mm:ss.SSSSSS))) AS
try_to_time(to_time(10:11:12., HH:mm:ss.SSSSSS))#x]
++- OneRowRelation
+
+
+-- !query
+select try_to_time('24-00', 'HH-mm')
+-- !query analysis
+Project [try_to_time(to_time(24-00, Some(HH-mm))) AS
try_to_time(to_time(24-00, HH-mm))#x]
++- OneRowRelation
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/try_cast.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/try_cast.sql.out
index 5b3d7b7e702b..7d0784737e1d 100644
--- a/sql/core/src/test/resources/sql-tests/analyzer-results/try_cast.sql.out
+++ b/sql/core/src/test/resources/sql-tests/analyzer-results/try_cast.sql.out
@@ -200,3 +200,31 @@ SELECT TRY_CAST("2021-101-01 00:00:00" AS timestamp)
-- !query analysis
Project [try_cast(2021-101-01 00:00:00 as timestamp) AS TRY_CAST(2021-101-01
00:00:00 AS TIMESTAMP)#x]
+- OneRowRelation
+
+
+-- !query
+SELECT TRY_CAST("12:34:56" AS time)
+-- !query analysis
+Project [try_cast(12:34:56 as time(6)) AS TRY_CAST(12:34:56 AS TIME(6))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT TRY_CAST("12:34:56.789012" AS time(6))
+-- !query analysis
+Project [try_cast(12:34:56.789012 as time(6)) AS TRY_CAST(12:34:56.789012 AS
TIME(6))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT TRY_CAST("24:00:00" AS time)
+-- !query analysis
+Project [try_cast(24:00:00 as time(6)) AS TRY_CAST(24:00:00 AS TIME(6))#x]
++- OneRowRelation
+
+
+-- !query
+SELECT TRY_CAST("12:34:56 abc" AS time)
+-- !query analysis
+Project [try_cast(12:34:56 abc as time(6)) AS TRY_CAST(12:34:56 abc AS
TIME(6))#x]
++- OneRowRelation
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/try_datetime_functions.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/try_datetime_functions.sql.out
index 27751e0503a6..d518b88d966f 100644
---
a/sql/core/src/test/resources/sql-tests/analyzer-results/try_datetime_functions.sql.out
+++
b/sql/core/src/test/resources/sql-tests/analyzer-results/try_datetime_functions.sql.out
@@ -39,3 +39,55 @@ select try_to_timestamp('22 05 2020 Friday', 'dd MM yyyy
EEEEEE')
-- !query analysis
Project [try_to_timestamp(22 05 2020 Friday, Some(dd MM yyyy EEEEEE),
TimestampType, Some(America/Los_Angeles), false) AS try_to_timestamp(22 05 2020
Friday, dd MM yyyy EEEEEE)#x]
+- OneRowRelation
+
+
+-- !query
+select try_to_time(null), try_to_time('00:12:00'), try_to_time('01:02:03',
'HH:mm:ss')
+-- !query analysis
+Project [try_to_time(to_time(null, None)) AS try_to_time(to_time(NULL))#x,
try_to_time(to_time(00:12:00, None)) AS try_to_time(to_time(00:12:00))#x,
try_to_time(to_time(01:02:03, Some(HH:mm:ss))) AS try_to_time(to_time(01:02:03,
HH:mm:ss))#x]
++- OneRowRelation
+
+
+-- !query
+select try_to_time(1)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"1\"",
+ "inputType" : "\"INT\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"STRING\"",
+ "sqlExpr" : "\"to_time(1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 21,
+ "fragment" : "try_to_time(1)"
+ } ]
+}
+
+
+-- !query
+select try_to_time('12:00:00 abc')
+-- !query analysis
+Project [try_to_time(to_time(12:00:00 abc, None)) AS
try_to_time(to_time(12:00:00 abc))#x]
++- OneRowRelation
+
+
+-- !query
+select try_to_time('10:11:12.', 'HH:mm:ss.SSSSSS')
+-- !query analysis
+Project [try_to_time(to_time(10:11:12., Some(HH:mm:ss.SSSSSS))) AS
try_to_time(to_time(10:11:12., HH:mm:ss.SSSSSS))#x]
++- OneRowRelation
+
+
+-- !query
+select try_to_time('24-00', 'HH-mm')
+-- !query analysis
+Project [try_to_time(to_time(24-00, Some(HH-mm))) AS
try_to_time(to_time(24-00, HH-mm))#x]
++- OneRowRelation
diff --git
a/sql/core/src/test/resources/sql-tests/analyzer-results/typeCoercion/native/dateTimeOperations.sql.out
b/sql/core/src/test/resources/sql-tests/analyzer-results/typeCoercion/native/dateTimeOperations.sql.out
index 3277ff0acd94..624f4af5c112 100644
---
a/sql/core/src/test/resources/sql-tests/analyzer-results/typeCoercion/native/dateTimeOperations.sql.out
+++
b/sql/core/src/test/resources/sql-tests/analyzer-results/typeCoercion/native/dateTimeOperations.sql.out
@@ -737,3 +737,31 @@ select cast('2017-12-11 09:30:00' as date) - interval 2 day
-- !query analysis
Project [date_add(cast(2017-12-11 09:30:00 as date),
-extractansiintervaldays(INTERVAL '2' DAY)) AS date_add(CAST(2017-12-11
09:30:00 AS DATE), (- extractansiintervaldays(INTERVAL '2' DAY)))#x]
+- OneRowRelation
+
+
+-- !query
+select cast('12:34:56' as time) + interval '02:00:00' hour to second
+-- !query analysis
+Project [cast(12:34:56 as time(6)) + INTERVAL '02:00:00' HOUR TO SECOND AS
CAST(12:34:56 AS TIME(6)) + INTERVAL '02:00:00' HOUR TO SECOND#x]
++- OneRowRelation
+
+
+-- !query
+select interval '02:00:00' hour to second + cast('12:34:56' as time)
+-- !query analysis
+Project [cast(12:34:56 as time(6)) + INTERVAL '02:00:00' HOUR TO SECOND AS
CAST(12:34:56 AS TIME(6)) + INTERVAL '02:00:00' HOUR TO SECOND#x]
++- OneRowRelation
+
+
+-- !query
+select cast('12:34:56' as time) - interval '02:00:00' hour to second
+-- !query analysis
+Project [cast(12:34:56 as time(6)) - INTERVAL '02:00:00' HOUR TO SECOND AS
CAST(12:34:56 AS TIME(6)) - INTERVAL '02:00:00' HOUR TO SECOND#x]
++- OneRowRelation
+
+
+-- !query
+select cast('12:34:56' as time) - cast('10:00:00' as time)
+-- !query analysis
+Project [cast(12:34:56 as time(6)) - cast(10:00:00 as time(6)) AS
CAST(12:34:56 AS TIME(6)) - CAST(10:00:00 AS TIME(6))#x]
++- OneRowRelation
diff --git
a/sql/core/src/test/resources/sql-tests/inputs/datetime-parsing-invalid.sql
b/sql/core/src/test/resources/sql-tests/inputs/datetime-parsing-invalid.sql
index 1f5a9b117ca2..6355367b2de7 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/datetime-parsing-invalid.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/datetime-parsing-invalid.sql
@@ -37,3 +37,10 @@ select to_unix_timestamp("2020-01-27T20:06:11.847",
"yyyy-MM-dd HH:mm:ss.SSS");
select to_unix_timestamp("Unparseable", "yyyy-MM-dd HH:mm:ss.SSS");
select cast("Unparseable" as timestamp);
select cast("Unparseable" as date);
+
+-- TIME parse errors with `to_time`
+select to_time("24", "HH");
+select to_time("12:60", "HH:mm");
+select to_time("12:00:60", "HH:mm:ss");
+select to_time("Unparseable", "HH:mm:ss");
+select cast("Unparseable" as time);
diff --git a/sql/core/src/test/resources/sql-tests/inputs/datetime-parsing.sql
b/sql/core/src/test/resources/sql-tests/inputs/datetime-parsing.sql
index f87ae556867b..a684001ef5ac 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/datetime-parsing.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/datetime-parsing.sql
@@ -43,3 +43,11 @@ select to_timestamp('12-31-365', 'MM-dd-DDD');
select to_timestamp('2020-30-365', 'yyyy-dd-DDD');
select to_timestamp('2020-12-350', 'yyyy-MM-DDD');
select to_timestamp('2020-12-31-366', 'yyyy-MM-dd-DDD');
+
+-- parsing TIME with `to_time`
+select to_time('00:00:00');
+select to_time('12', 'HH');
+select to_time('12:34', 'HH:mm');
+select to_time('12:34:56', 'HH:mm:ss');
+select to_time('12:34:56.123456', 'HH:mm:ss.SSSSSS');
+select to_time('01:02:03 PM', 'hh:mm:ss a');
diff --git a/sql/core/src/test/resources/sql-tests/inputs/try_cast.sql
b/sql/core/src/test/resources/sql-tests/inputs/try_cast.sql
index 2d584843ada3..f61b6d29b00f 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/try_cast.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/try_cast.sql
@@ -51,4 +51,10 @@ SELECT TRY_CAST("2021-101-01" AS date);
-- TRY_CAST string to timestamp
SELECT TRY_CAST("2021-01-01 00:00:00" AS timestamp);
-SELECT TRY_CAST("2021-101-01 00:00:00" AS timestamp);
\ No newline at end of file
+SELECT TRY_CAST("2021-101-01 00:00:00" AS timestamp);
+
+-- TRY_CAST string to time
+SELECT TRY_CAST("12:34:56" AS time);
+SELECT TRY_CAST("12:34:56.789012" AS time(6));
+SELECT TRY_CAST("24:00:00" AS time);
+SELECT TRY_CAST("12:34:56 abc" AS time);
diff --git
a/sql/core/src/test/resources/sql-tests/inputs/try_datetime_functions.sql
b/sql/core/src/test/resources/sql-tests/inputs/try_datetime_functions.sql
index 7cf67dce2ae0..3d43b943c5f9 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/try_datetime_functions.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/try_datetime_functions.sql
@@ -4,3 +4,9 @@ select try_to_timestamp('2016-12-31 abc');
select try_to_timestamp('2019-10-06 10:11:12.', 'yyyy-MM-dd
HH:mm:ss.SSSSSS[zzz]');
select try_to_timestamp("02-29", "MM-dd");
select try_to_timestamp('22 05 2020 Friday', 'dd MM yyyy EEEEEE');
+
+select try_to_time(null), try_to_time('00:12:00'), try_to_time('01:02:03',
'HH:mm:ss');
+select try_to_time(1);
+select try_to_time('12:00:00 abc');
+select try_to_time('10:11:12.', 'HH:mm:ss.SSSSSS');
+select try_to_time('24-00', 'HH-mm');
diff --git
a/sql/core/src/test/resources/sql-tests/inputs/typeCoercion/native/dateTimeOperations.sql
b/sql/core/src/test/resources/sql-tests/inputs/typeCoercion/native/dateTimeOperations.sql
index 1e9822186796..5159861fc231 100644
---
a/sql/core/src/test/resources/sql-tests/inputs/typeCoercion/native/dateTimeOperations.sql
+++
b/sql/core/src/test/resources/sql-tests/inputs/typeCoercion/native/dateTimeOperations.sql
@@ -58,3 +58,9 @@ select cast('1' as binary) - interval 2 day;
select cast(1 as boolean) - interval 2 day;
select cast('2017-12-11 09:30:00.0' as timestamp) - interval 2 day;
select cast('2017-12-11 09:30:00' as date) - interval 2 day;
+
+-- TIME +/- day-time interval and TIME - TIME
+select cast('12:34:56' as time) + interval '02:00:00' hour to second;
+select interval '02:00:00' hour to second + cast('12:34:56' as time);
+select cast('12:34:56' as time) - interval '02:00:00' hour to second;
+select cast('12:34:56' as time) - cast('10:00:00' as time);
diff --git
a/sql/core/src/test/resources/sql-tests/results/datetime-parsing-invalid.sql.out
b/sql/core/src/test/resources/sql-tests/results/datetime-parsing-invalid.sql.out
index e03bd33b0715..c03b524e6c4d 100644
---
a/sql/core/src/test/resources/sql-tests/results/datetime-parsing-invalid.sql.out
+++
b/sql/core/src/test/resources/sql-tests/results/datetime-parsing-invalid.sql.out
@@ -465,3 +465,92 @@ org.apache.spark.SparkDateTimeException
"fragment" : "cast(\"Unparseable\" as date)"
} ]
}
+
+
+-- !query
+select to_time("24", "HH")
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CANNOT_PARSE_TIME",
+ "sqlState" : "22010",
+ "messageParameters" : {
+ "format" : "'HH'",
+ "input" : "'24'"
+ }
+}
+
+
+-- !query
+select to_time("12:60", "HH:mm")
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CANNOT_PARSE_TIME",
+ "sqlState" : "22010",
+ "messageParameters" : {
+ "format" : "'HH:mm'",
+ "input" : "'12:60'"
+ }
+}
+
+
+-- !query
+select to_time("12:00:60", "HH:mm:ss")
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CANNOT_PARSE_TIME",
+ "sqlState" : "22010",
+ "messageParameters" : {
+ "format" : "'HH:mm:ss'",
+ "input" : "'12:00:60'"
+ }
+}
+
+
+-- !query
+select to_time("Unparseable", "HH:mm:ss")
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CANNOT_PARSE_TIME",
+ "sqlState" : "22010",
+ "messageParameters" : {
+ "format" : "'HH:mm:ss'",
+ "input" : "'Unparseable'"
+ }
+}
+
+
+-- !query
+select cast("Unparseable" as time)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CAST_INVALID_INPUT",
+ "sqlState" : "22018",
+ "messageParameters" : {
+ "ansiConfig" : "\"spark.sql.ansi.enabled\"",
+ "expression" : "'Unparseable'",
+ "sourceType" : "\"STRING\"",
+ "targetType" : "\"TIME(6)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 34,
+ "fragment" : "cast(\"Unparseable\" as time)"
+ } ]
+}
diff --git
a/sql/core/src/test/resources/sql-tests/results/datetime-parsing-legacy.sql.out
b/sql/core/src/test/resources/sql-tests/results/datetime-parsing-legacy.sql.out
index b041c96bf287..cfc29701ac92 100644
---
a/sql/core/src/test/resources/sql-tests/results/datetime-parsing-legacy.sql.out
+++
b/sql/core/src/test/resources/sql-tests/results/datetime-parsing-legacy.sql.out
@@ -205,3 +205,51 @@ select to_timestamp('2020-12-31-366', 'yyyy-MM-dd-DDD')
struct<to_timestamp(2020-12-31-366, yyyy-MM-dd-DDD):timestamp>
-- !query output
2020-12-31 00:00:00
+
+
+-- !query
+select to_time('00:00:00')
+-- !query schema
+struct<to_time(00:00:00):time(6)>
+-- !query output
+00:00:00
+
+
+-- !query
+select to_time('12', 'HH')
+-- !query schema
+struct<to_time(12, HH):time(6)>
+-- !query output
+12:00:00
+
+
+-- !query
+select to_time('12:34', 'HH:mm')
+-- !query schema
+struct<to_time(12:34, HH:mm):time(6)>
+-- !query output
+12:34:00
+
+
+-- !query
+select to_time('12:34:56', 'HH:mm:ss')
+-- !query schema
+struct<to_time(12:34:56, HH:mm:ss):time(6)>
+-- !query output
+12:34:56
+
+
+-- !query
+select to_time('12:34:56.123456', 'HH:mm:ss.SSSSSS')
+-- !query schema
+struct<to_time(12:34:56.123456, HH:mm:ss.SSSSSS):time(6)>
+-- !query output
+12:34:56.123456
+
+
+-- !query
+select to_time('01:02:03 PM', 'hh:mm:ss a')
+-- !query schema
+struct<to_time(01:02:03 PM, hh:mm:ss a):time(6)>
+-- !query output
+13:02:03
diff --git
a/sql/core/src/test/resources/sql-tests/results/datetime-parsing.sql.out
b/sql/core/src/test/resources/sql-tests/results/datetime-parsing.sql.out
index d45154f97005..acb1e8c1d314 100644
--- a/sql/core/src/test/resources/sql-tests/results/datetime-parsing.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/datetime-parsing.sql.out
@@ -205,3 +205,51 @@ select to_timestamp('2020-12-31-366', 'yyyy-MM-dd-DDD')
struct<to_timestamp(2020-12-31-366, yyyy-MM-dd-DDD):timestamp>
-- !query output
2020-12-31 00:00:00
+
+
+-- !query
+select to_time('00:00:00')
+-- !query schema
+struct<to_time(00:00:00):time(6)>
+-- !query output
+00:00:00
+
+
+-- !query
+select to_time('12', 'HH')
+-- !query schema
+struct<to_time(12, HH):time(6)>
+-- !query output
+12:00:00
+
+
+-- !query
+select to_time('12:34', 'HH:mm')
+-- !query schema
+struct<to_time(12:34, HH:mm):time(6)>
+-- !query output
+12:34:00
+
+
+-- !query
+select to_time('12:34:56', 'HH:mm:ss')
+-- !query schema
+struct<to_time(12:34:56, HH:mm:ss):time(6)>
+-- !query output
+12:34:56
+
+
+-- !query
+select to_time('12:34:56.123456', 'HH:mm:ss.SSSSSS')
+-- !query schema
+struct<to_time(12:34:56.123456, HH:mm:ss.SSSSSS):time(6)>
+-- !query output
+12:34:56.123456
+
+
+-- !query
+select to_time('01:02:03 PM', 'hh:mm:ss a')
+-- !query schema
+struct<to_time(01:02:03 PM, hh:mm:ss a):time(6)>
+-- !query output
+13:02:03
diff --git
a/sql/core/src/test/resources/sql-tests/results/nonansi/datetime-parsing-invalid.sql.out
b/sql/core/src/test/resources/sql-tests/results/nonansi/datetime-parsing-invalid.sql.out
index fffbb2a4e017..384e78e06595 100644
---
a/sql/core/src/test/resources/sql-tests/results/nonansi/datetime-parsing-invalid.sql.out
+++
b/sql/core/src/test/resources/sql-tests/results/nonansi/datetime-parsing-invalid.sql.out
@@ -239,3 +239,75 @@ select cast("Unparseable" as date)
struct<CAST(Unparseable AS DATE):date>
-- !query output
NULL
+
+
+-- !query
+select to_time("24", "HH")
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CANNOT_PARSE_TIME",
+ "sqlState" : "22010",
+ "messageParameters" : {
+ "format" : "'HH'",
+ "input" : "'24'"
+ }
+}
+
+
+-- !query
+select to_time("12:60", "HH:mm")
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CANNOT_PARSE_TIME",
+ "sqlState" : "22010",
+ "messageParameters" : {
+ "format" : "'HH:mm'",
+ "input" : "'12:60'"
+ }
+}
+
+
+-- !query
+select to_time("12:00:60", "HH:mm:ss")
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CANNOT_PARSE_TIME",
+ "sqlState" : "22010",
+ "messageParameters" : {
+ "format" : "'HH:mm:ss'",
+ "input" : "'12:00:60'"
+ }
+}
+
+
+-- !query
+select to_time("Unparseable", "HH:mm:ss")
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.SparkDateTimeException
+{
+ "errorClass" : "CANNOT_PARSE_TIME",
+ "sqlState" : "22010",
+ "messageParameters" : {
+ "format" : "'HH:mm:ss'",
+ "input" : "'Unparseable'"
+ }
+}
+
+
+-- !query
+select cast("Unparseable" as time)
+-- !query schema
+struct<CAST(Unparseable AS TIME(6)):time(6)>
+-- !query output
+NULL
diff --git
a/sql/core/src/test/resources/sql-tests/results/nonansi/try_datetime_functions.sql.out
b/sql/core/src/test/resources/sql-tests/results/nonansi/try_datetime_functions.sql.out
index 75a6f15bd363..d3095f6e978a 100644
---
a/sql/core/src/test/resources/sql-tests/results/nonansi/try_datetime_functions.sql.out
+++
b/sql/core/src/test/resources/sql-tests/results/nonansi/try_datetime_functions.sql.out
@@ -54,3 +54,61 @@ org.apache.spark.SparkUpgradeException
"pattern" : "'dd MM yyyy EEEEEE'"
}
}
+
+
+-- !query
+select try_to_time(null), try_to_time('00:12:00'), try_to_time('01:02:03',
'HH:mm:ss')
+-- !query schema
+struct<try_to_time(to_time(NULL)):time(6),try_to_time(to_time(00:12:00)):time(6),try_to_time(to_time(01:02:03,
HH:mm:ss)):time(6)>
+-- !query output
+NULL 00:12:00 01:02:03
+
+
+-- !query
+select try_to_time(1)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"1\"",
+ "inputType" : "\"INT\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"STRING\"",
+ "sqlExpr" : "\"to_time(1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 21,
+ "fragment" : "try_to_time(1)"
+ } ]
+}
+
+
+-- !query
+select try_to_time('12:00:00 abc')
+-- !query schema
+struct<try_to_time(to_time(12:00:00 abc)):time(6)>
+-- !query output
+NULL
+
+
+-- !query
+select try_to_time('10:11:12.', 'HH:mm:ss.SSSSSS')
+-- !query schema
+struct<try_to_time(to_time(10:11:12., HH:mm:ss.SSSSSS)):time(6)>
+-- !query output
+NULL
+
+
+-- !query
+select try_to_time('24-00', 'HH-mm')
+-- !query schema
+struct<try_to_time(to_time(24-00, HH-mm)):time(6)>
+-- !query output
+NULL
diff --git a/sql/core/src/test/resources/sql-tests/results/try_cast.sql.out
b/sql/core/src/test/resources/sql-tests/results/try_cast.sql.out
index ff11bf29e735..744a229ff0e4 100644
--- a/sql/core/src/test/resources/sql-tests/results/try_cast.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/try_cast.sql.out
@@ -229,3 +229,35 @@ SELECT TRY_CAST("2021-101-01 00:00:00" AS timestamp)
struct<TRY_CAST(2021-101-01 00:00:00 AS TIMESTAMP):timestamp>
-- !query output
NULL
+
+
+-- !query
+SELECT TRY_CAST("12:34:56" AS time)
+-- !query schema
+struct<TRY_CAST(12:34:56 AS TIME(6)):time(6)>
+-- !query output
+12:34:56
+
+
+-- !query
+SELECT TRY_CAST("12:34:56.789012" AS time(6))
+-- !query schema
+struct<TRY_CAST(12:34:56.789012 AS TIME(6)):time(6)>
+-- !query output
+12:34:56.789012
+
+
+-- !query
+SELECT TRY_CAST("24:00:00" AS time)
+-- !query schema
+struct<TRY_CAST(24:00:00 AS TIME(6)):time(6)>
+-- !query output
+NULL
+
+
+-- !query
+SELECT TRY_CAST("12:34:56 abc" AS time)
+-- !query schema
+struct<TRY_CAST(12:34:56 abc AS TIME(6)):time(6)>
+-- !query output
+NULL
diff --git
a/sql/core/src/test/resources/sql-tests/results/try_datetime_functions.sql.out
b/sql/core/src/test/resources/sql-tests/results/try_datetime_functions.sql.out
index 75a6f15bd363..d3095f6e978a 100644
---
a/sql/core/src/test/resources/sql-tests/results/try_datetime_functions.sql.out
+++
b/sql/core/src/test/resources/sql-tests/results/try_datetime_functions.sql.out
@@ -54,3 +54,61 @@ org.apache.spark.SparkUpgradeException
"pattern" : "'dd MM yyyy EEEEEE'"
}
}
+
+
+-- !query
+select try_to_time(null), try_to_time('00:12:00'), try_to_time('01:02:03',
'HH:mm:ss')
+-- !query schema
+struct<try_to_time(to_time(NULL)):time(6),try_to_time(to_time(00:12:00)):time(6),try_to_time(to_time(01:02:03,
HH:mm:ss)):time(6)>
+-- !query output
+NULL 00:12:00 01:02:03
+
+
+-- !query
+select try_to_time(1)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"1\"",
+ "inputType" : "\"INT\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"STRING\"",
+ "sqlExpr" : "\"to_time(1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 21,
+ "fragment" : "try_to_time(1)"
+ } ]
+}
+
+
+-- !query
+select try_to_time('12:00:00 abc')
+-- !query schema
+struct<try_to_time(to_time(12:00:00 abc)):time(6)>
+-- !query output
+NULL
+
+
+-- !query
+select try_to_time('10:11:12.', 'HH:mm:ss.SSSSSS')
+-- !query schema
+struct<try_to_time(to_time(10:11:12., HH:mm:ss.SSSSSS)):time(6)>
+-- !query output
+NULL
+
+
+-- !query
+select try_to_time('24-00', 'HH-mm')
+-- !query schema
+struct<try_to_time(to_time(24-00, HH-mm)):time(6)>
+-- !query output
+NULL
diff --git
a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/dateTimeOperations.sql.out
b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/dateTimeOperations.sql.out
index ad8ca4688962..4f80a5e91a21 100644
---
a/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/dateTimeOperations.sql.out
+++
b/sql/core/src/test/resources/sql-tests/results/typeCoercion/native/dateTimeOperations.sql.out
@@ -803,3 +803,35 @@ select cast('2017-12-11 09:30:00' as date) - interval 2 day
struct<date_add(CAST(2017-12-11 09:30:00 AS DATE), (-
extractansiintervaldays(INTERVAL '2' DAY))):date>
-- !query output
2017-12-09
+
+
+-- !query
+select cast('12:34:56' as time) + interval '02:00:00' hour to second
+-- !query schema
+struct<CAST(12:34:56 AS TIME(6)) + INTERVAL '02:00:00' HOUR TO SECOND:time(6)>
+-- !query output
+14:34:56
+
+
+-- !query
+select interval '02:00:00' hour to second + cast('12:34:56' as time)
+-- !query schema
+struct<CAST(12:34:56 AS TIME(6)) + INTERVAL '02:00:00' HOUR TO SECOND:time(6)>
+-- !query output
+14:34:56
+
+
+-- !query
+select cast('12:34:56' as time) - interval '02:00:00' hour to second
+-- !query schema
+struct<CAST(12:34:56 AS TIME(6)) - INTERVAL '02:00:00' HOUR TO SECOND:time(6)>
+-- !query output
+10:34:56
+
+
+-- !query
+select cast('12:34:56' as time) - cast('10:00:00' as time)
+-- !query schema
+struct<CAST(12:34:56 AS TIME(6)) - CAST(10:00:00 AS TIME(6)):interval hour to
second>
+-- !query output
+0 02:34:56.000000000
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]