This is an automated email from the ASF dual-hosted git repository. wenchen 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 26d668d6ec27 [SPARK-51462][SPARK-51564][SQL][FOLLOWUP][TESTS] Add E2E SQL tests for TIME literals in 24hr and 12hr formats 26d668d6ec27 is described below commit 26d668d6ec276b7e2dc83b5e6f9f852d46e42430 Author: Uros Bojanic <uros.boja...@databricks.com> AuthorDate: Tue Aug 5 21:42:36 2025 +0800 [SPARK-51462][SPARK-51564][SQL][FOLLOWUP][TESTS] Add E2E SQL tests for TIME literals in 24hr and 12hr formats ### What changes were proposed in this pull request? Add end-to-end SQL tests for TIME literals. ### Why are the changes needed? Improve testing for TIME type, both in 24hr and 12hr format. ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? Updated golden files for TIME. ### Was this patch authored or co-authored using generative AI tooling? No. Closes #51827 from uros-db/time_literals. Authored-by: Uros Bojanic <uros.boja...@databricks.com> Signed-off-by: Wenchen Fan <wenc...@databricks.com> --- .../sql-tests/analyzer-results/time.sql.out | 385 +++++++++++++++++++ .../src/test/resources/sql-tests/inputs/time.sql | 33 ++ .../test/resources/sql-tests/results/time.sql.out | 427 +++++++++++++++++++++ 3 files changed, 845 insertions(+) diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/time.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/time.sql.out index 807087a92c02..7ac37e447066 100644 --- a/sql/core/src/test/resources/sql-tests/analyzer-results/time.sql.out +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/time.sql.out @@ -417,6 +417,391 @@ Project [extract(SECOND, cast(09:08:01.987654 as time(6))) AS extract(SECOND FRO +- OneRowRelation +-- !query +SELECT TIME'0:0:0' +-- !query analysis +Project [00:00:00 AS TIME '00:00:00'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'01:02:03' +-- !query analysis +Project [01:02:03 AS TIME '01:02:03'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'12:34:56' +-- !query analysis +Project [12:34:56 AS TIME '12:34:56'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'23:59:59' +-- !query analysis +Project [23:59:59 AS TIME '23:59:59'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'23:59:59.9' +-- !query analysis +Project [23:59:59.9 AS TIME '23:59:59.9'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'23:59:59.99' +-- !query analysis +Project [23:59:59.99 AS TIME '23:59:59.99'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'23:59:59.999' +-- !query analysis +Project [23:59:59.999 AS TIME '23:59:59.999'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'23:59:59.9999' +-- !query analysis +Project [23:59:59.9999 AS TIME '23:59:59.9999'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'23:59:59.99999' +-- !query analysis +Project [23:59:59.99999 AS TIME '23:59:59.99999'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'23:59:59.999999' +-- !query analysis +Project [23:59:59.999999 AS TIME '23:59:59.999999'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'01:02:03 AM' +-- !query analysis +Project [01:02:03 AS TIME '01:02:03'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'01:02:03 am' +-- !query analysis +Project [01:02:03 AS TIME '01:02:03'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'01:02:03 Am' +-- !query analysis +Project [01:02:03 AS TIME '01:02:03'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'01:02:03 PM' +-- !query analysis +Project [13:02:03 AS TIME '13:02:03'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'01:02:03 pm' +-- !query analysis +Project [13:02:03 AS TIME '13:02:03'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'01:02:03 pM' +-- !query analysis +Project [13:02:03 AS TIME '13:02:03'#x] ++- OneRowRelation + + +-- !query +SELECT TIME'00:00:60' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'00:00:60'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 21, + "fragment" : "TIME'00:00:60'" + } ] +} + + +-- !query +SELECT TIME'00:60:00' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'00:60:00'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 21, + "fragment" : "TIME'00:60:00'" + } ] +} + + +-- !query +SELECT TIME'24:00:00' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'24:00:00'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 21, + "fragment" : "TIME'24:00:00'" + } ] +} + + +-- !query +SELECT TIME'00:00:00 AM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'00:00:00 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'00:00:00 AM'" + } ] +} + + +-- !query +SELECT TIME'00:00:00 PM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'00:00:00 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'00:00:00 PM'" + } ] +} + + +-- !query +SELECT TIME'12:00:60 AM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'12:00:60 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'12:00:60 AM'" + } ] +} + + +-- !query +SELECT TIME'12:00:60 PM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'12:00:60 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'12:00:60 PM'" + } ] +} + + +-- !query +SELECT TIME'12:60:00 AM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'12:60:00 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'12:60:00 AM'" + } ] +} + + +-- !query +SELECT TIME'12:60:00 PM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'12:60:00 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'12:60:00 PM'" + } ] +} + + +-- !query +SELECT TIME'13:00:00 AM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'13:00:00 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'13:00:00 AM'" + } ] +} + + +-- !query +SELECT TIME'13:00:00 PM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'13:00:00 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'13:00:00 PM'" + } ] +} + + +-- !query +SELECT TIME'24:00:00 AM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'24:00:00 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'24:00:00 AM'" + } ] +} + + +-- !query +SELECT TIME'24:00:00 PM' +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'24:00:00 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'24:00:00 PM'" + } ] +} + + -- !query SELECT cast("12:34:56" as time) -- !query analysis diff --git a/sql/core/src/test/resources/sql-tests/inputs/time.sql b/sql/core/src/test/resources/sql-tests/inputs/time.sql index 0c9eda1eb4af..b46f74c65767 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/time.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/time.sql @@ -72,6 +72,39 @@ select extract(SECOND FROM cast('09:08:01.987654' as time(4))); select extract(SECOND FROM cast('09:08:01.987654' as time(5))); select extract(SECOND FROM cast('09:08:01.987654' as time(6))); +-- valid time literals +SELECT TIME'0:0:0'; +SELECT TIME'01:02:03'; +SELECT TIME'12:34:56'; +SELECT TIME'23:59:59'; +SELECT TIME'23:59:59.9'; +SELECT TIME'23:59:59.99'; +SELECT TIME'23:59:59.999'; +SELECT TIME'23:59:59.9999'; +SELECT TIME'23:59:59.99999'; +SELECT TIME'23:59:59.999999'; +SELECT TIME'01:02:03 AM'; +SELECT TIME'01:02:03 am'; +SELECT TIME'01:02:03 Am'; +SELECT TIME'01:02:03 PM'; +SELECT TIME'01:02:03 pm'; +SELECT TIME'01:02:03 pM'; + +-- invalid time literals +SELECT TIME'00:00:60'; +SELECT TIME'00:60:00'; +SELECT TIME'24:00:00'; +SELECT TIME'00:00:00 AM'; +SELECT TIME'00:00:00 PM'; +SELECT TIME'12:00:60 AM'; +SELECT TIME'12:00:60 PM'; +SELECT TIME'12:60:00 AM'; +SELECT TIME'12:60:00 PM'; +SELECT TIME'13:00:00 AM'; +SELECT TIME'13:00:00 PM'; +SELECT TIME'24:00:00 AM'; +SELECT TIME'24:00:00 PM'; + -- cast string to time SELECT cast("12:34:56" as time); SELECT cast("12:34:56.789" as time(3)); diff --git a/sql/core/src/test/resources/sql-tests/results/time.sql.out b/sql/core/src/test/resources/sql-tests/results/time.sql.out index 4ae979579e4e..2908f266dc9c 100644 --- a/sql/core/src/test/resources/sql-tests/results/time.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/time.sql.out @@ -516,6 +516,433 @@ struct<extract(SECOND FROM CAST(09:08:01.987654 AS TIME(6))):decimal(8,6)> 1.987654 +-- !query +SELECT TIME'0:0:0' +-- !query schema +struct<TIME '00:00:00':time(6)> +-- !query output +00:00:00 + + +-- !query +SELECT TIME'01:02:03' +-- !query schema +struct<TIME '01:02:03':time(6)> +-- !query output +01:02:03 + + +-- !query +SELECT TIME'12:34:56' +-- !query schema +struct<TIME '12:34:56':time(6)> +-- !query output +12:34:56 + + +-- !query +SELECT TIME'23:59:59' +-- !query schema +struct<TIME '23:59:59':time(6)> +-- !query output +23:59:59 + + +-- !query +SELECT TIME'23:59:59.9' +-- !query schema +struct<TIME '23:59:59.9':time(6)> +-- !query output +23:59:59.9 + + +-- !query +SELECT TIME'23:59:59.99' +-- !query schema +struct<TIME '23:59:59.99':time(6)> +-- !query output +23:59:59.99 + + +-- !query +SELECT TIME'23:59:59.999' +-- !query schema +struct<TIME '23:59:59.999':time(6)> +-- !query output +23:59:59.999 + + +-- !query +SELECT TIME'23:59:59.9999' +-- !query schema +struct<TIME '23:59:59.9999':time(6)> +-- !query output +23:59:59.9999 + + +-- !query +SELECT TIME'23:59:59.99999' +-- !query schema +struct<TIME '23:59:59.99999':time(6)> +-- !query output +23:59:59.99999 + + +-- !query +SELECT TIME'23:59:59.999999' +-- !query schema +struct<TIME '23:59:59.999999':time(6)> +-- !query output +23:59:59.999999 + + +-- !query +SELECT TIME'01:02:03 AM' +-- !query schema +struct<TIME '01:02:03':time(6)> +-- !query output +01:02:03 + + +-- !query +SELECT TIME'01:02:03 am' +-- !query schema +struct<TIME '01:02:03':time(6)> +-- !query output +01:02:03 + + +-- !query +SELECT TIME'01:02:03 Am' +-- !query schema +struct<TIME '01:02:03':time(6)> +-- !query output +01:02:03 + + +-- !query +SELECT TIME'01:02:03 PM' +-- !query schema +struct<TIME '13:02:03':time(6)> +-- !query output +13:02:03 + + +-- !query +SELECT TIME'01:02:03 pm' +-- !query schema +struct<TIME '13:02:03':time(6)> +-- !query output +13:02:03 + + +-- !query +SELECT TIME'01:02:03 pM' +-- !query schema +struct<TIME '13:02:03':time(6)> +-- !query output +13:02:03 + + +-- !query +SELECT TIME'00:00:60' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'00:00:60'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 21, + "fragment" : "TIME'00:00:60'" + } ] +} + + +-- !query +SELECT TIME'00:60:00' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'00:60:00'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 21, + "fragment" : "TIME'00:60:00'" + } ] +} + + +-- !query +SELECT TIME'24:00:00' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'24:00:00'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 21, + "fragment" : "TIME'24:00:00'" + } ] +} + + +-- !query +SELECT TIME'00:00:00 AM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'00:00:00 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'00:00:00 AM'" + } ] +} + + +-- !query +SELECT TIME'00:00:00 PM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'00:00:00 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'00:00:00 PM'" + } ] +} + + +-- !query +SELECT TIME'12:00:60 AM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'12:00:60 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'12:00:60 AM'" + } ] +} + + +-- !query +SELECT TIME'12:00:60 PM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'12:00:60 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'12:00:60 PM'" + } ] +} + + +-- !query +SELECT TIME'12:60:00 AM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'12:60:00 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'12:60:00 AM'" + } ] +} + + +-- !query +SELECT TIME'12:60:00 PM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'12:60:00 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'12:60:00 PM'" + } ] +} + + +-- !query +SELECT TIME'13:00:00 AM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'13:00:00 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'13:00:00 AM'" + } ] +} + + +-- !query +SELECT TIME'13:00:00 PM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'13:00:00 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'13:00:00 PM'" + } ] +} + + +-- !query +SELECT TIME'24:00:00 AM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'24:00:00 AM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'24:00:00 AM'" + } ] +} + + +-- !query +SELECT TIME'24:00:00 PM' +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "INVALID_TYPED_LITERAL", + "sqlState" : "42604", + "messageParameters" : { + "value" : "'24:00:00 PM'", + "valueType" : "\"TIME\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 24, + "fragment" : "TIME'24:00:00 PM'" + } ] +} + + -- !query SELECT cast("12:34:56" as time) -- !query schema --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org