diff --git a/sql/api/src/main/scala/org/apache/spark/sql/types/TimestampType.scala b/sql/api/src/main/scala/org/apache/spark/sql/types/TimestampType.scala index 7d6c683df3347..43bd2793ecd7a 100644 --- a/sql/api/src/main/scala/org/apache/spark/sql/types/TimestampType.scala +++ b/sql/api/src/main/scala/org/apache/spark/sql/types/TimestampType.scala @@ -18,6 +18,7 @@ package org.apache.spark.sql.types import org.apache.spark.annotation.Stable +import org.apache.spark.sql.internal.SqlApiConf /** * The timestamp type represents a time instant in microsecond precision. Valid range is @@ -35,6 +36,11 @@ class TimestampType private () extends DatetimeType { */ override def defaultSize: Int = 8 + // A bare `TIMESTAMP` resolves to the session default timestamp type, so render this type + // explicitly when that default is not this type, keeping the generated DDL round-trippable. + override def sql: String = + if (SqlApiConf.get.timestampType == TimestampNTZType) "TIMESTAMP_LTZ" else "TIMESTAMP" + override def equals(obj: Any): Boolean = obj.isInstanceOf[TimestampType] override def hashCode(): Int = classOf[TimestampType].getSimpleName.hashCode diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala index b0cdbcc321c1d..c6757b615e520 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala @@ -691,7 +691,7 @@ case class Literal (value: Any, dataType: DataType) extends LeafExpression { case (_: Long, _: TimeType) => s"TIME '$toString'" case (v: Long, TimestampType) => - s"TIMESTAMP '$toString'" + s"${dataType.sql} '$toString'" case (v: Long, TimestampNTZType) => s"TIMESTAMP_NTZ '$toString'" // toString strips trailing zeros (display-only); pad back to exactly `precision` digits diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/LiteralExpressionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/LiteralExpressionSuite.scala index 85784579ad6d2..ca92b7dd64fd7 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/LiteralExpressionSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/LiteralExpressionSuite.scala @@ -528,6 +528,18 @@ class LiteralExpressionSuite extends SparkFunSuite with ExpressionEvalHelper { } } + test("SPARK-59433: format timestamp literal respects the default timestamp type") { + withTimeZones(sessionTimeZone = "GMT+01:00", systemTimeZone = "GMT-08:00") { + val timestamp = LocalDateTime.of(2019, 3, 21, 0, 2, 3, 456000000) + .atZone(ZoneOffset.UTC) + .toInstant + assert(Literal.create(timestamp).sql === "TIMESTAMP '2019-03-21 01:02:03.456'") + withSQLConf(SQLConf.TIMESTAMP_TYPE.key -> SQLConf.TimestampTypes.TIMESTAMP_NTZ.toString) { + assert(Literal.create(timestamp).sql === "TIMESTAMP_LTZ '2019-03-21 01:02:03.456'") + } + } + } + test("format date literal independently from time zone") { withTimeZones(sessionTimeZone = "GMT-11:00", systemTimeZone = "GMT-10:00") { val date = LocalDate.of(2019, 3, 21) diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/timestampNTZ/timestamp-ltz.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/timestampNTZ/timestamp-ltz.sql.out new file mode 100644 index 0000000000000..cc6ff0da5f791 --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/timestampNTZ/timestamp-ltz.sql.out @@ -0,0 +1,215 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +select timestamp_ltz'2016-12-31 00:12:00', timestamp_ltz'2016-12-31' +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select to_timestamp_ltz(null), to_timestamp_ltz('2016-12-31 00:12:00'), to_timestamp_ltz('2016-12-31', 'yyyy-MM-dd') +-- !query analysis +Project [to_timestamp_ltz(cast(null as string), None, TimestampType, Some(America/Los_Angeles), true) AS to_timestamp_ltz(NULL)#x, to_timestamp_ltz(2016-12-31 00:12:00, None, TimestampType, Some(America/Los_Angeles), true) AS to_timestamp_ltz(2016-12-31 00:12:00)#x, to_timestamp_ltz(2016-12-31, Some(yyyy-MM-dd), TimestampType, Some(America/Los_Angeles), true) AS to_timestamp_ltz(2016-12-31, yyyy-MM-dd)#x] ++- OneRowRelation + + +-- !query +select to_timestamp_ltz(to_date(null)), to_timestamp_ltz(to_date('2016-12-31')) +-- !query analysis +Project [to_timestamp_ltz(to_date(cast(null as string), None, Some(America/Los_Angeles), true), None, TimestampType, Some(America/Los_Angeles), true) AS to_timestamp_ltz(to_date(NULL))#x, to_timestamp_ltz(to_date(2016-12-31, None, Some(America/Los_Angeles), true), None, TimestampType, Some(America/Los_Angeles), true) AS to_timestamp_ltz(to_date(2016-12-31))#x] ++- OneRowRelation + + +-- !query +select to_timestamp_ltz(to_timestamp_ntz(null)), to_timestamp_ltz(to_timestamp_ntz('2016-12-31 00:12:00')) +-- !query analysis +Project [to_timestamp_ltz(to_timestamp_ntz(cast(null as string), None, TimestampNTZType, Some(America/Los_Angeles), true), None, TimestampType, Some(America/Los_Angeles), true) AS to_timestamp_ltz(to_timestamp_ntz(NULL))#x, to_timestamp_ltz(to_timestamp_ntz(2016-12-31 00:12:00, None, TimestampNTZType, Some(America/Los_Angeles), true), None, TimestampType, Some(America/Los_Angeles), true) AS to_timestamp_ltz(to_timestamp_ntz(2016-12-31 00:12:00))#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ltz(2021, 07, 11, 6, 30, 45.678) +-- !query analysis +Project [make_timestamp_ltz(2021, 7, 11, 6, 30, cast(45.678 as decimal(16,6)), None, Some(America/Los_Angeles), true, TimestampType) AS make_timestamp_ltz(2021, 7, 11, 6, 30, 45.678)#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ltz(2021, 07, 11, 6, 30, 45.678, 'CET') +-- !query analysis +Project [make_timestamp_ltz(2021, 7, 11, 6, 30, cast(45.678 as decimal(16,6)), Some(CET), Some(America/Los_Angeles), true, TimestampType) AS make_timestamp_ltz(2021, 7, 11, 6, 30, 45.678, CET)#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ltz(2021, 07, 11, 6, 30, 60.007) +-- !query analysis +Project [make_timestamp_ltz(2021, 7, 11, 6, 30, cast(60.007 as decimal(16,6)), None, Some(America/Los_Angeles), true, TimestampType) AS make_timestamp_ltz(2021, 7, 11, 6, 30, 60.007)#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678)) +-- !query analysis +Project [make_timestamp(make_date(2021, 7, 11, true), Some(make_time(6, 30, cast(45.678 as decimal(16,6)))), None, Some(America/Los_Angeles)) AS make_timestamp(make_date(2021, 7, 11), make_time(6, 30, 45.678))#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ltz(NULL, TIME'00:00:00') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT make_timestamp_ltz(DATE'1970-01-01', NULL) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT make_timestamp_ltz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0') +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "first", + "requiredType" : "\"DATE\"", + "sqlExpr" : "\"make_timestamp(TIMESTAMP_NTZ '2018-11-17 13:33:33', TIME '00:00:00')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 74, + "fragment" : "make_timestamp_ltz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0')" + } ] +} + + +-- !query +SELECT make_timestamp_ltz(DATE'2025-06-20', timestamp_ntz'2018-11-17 13:33:33') +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "second", + "requiredType" : "\"TIME\"", + "sqlExpr" : "\"make_timestamp(DATE '2025-06-20', TIMESTAMP_NTZ '2018-11-17 13:33:33')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 79, + "fragment" : "make_timestamp_ltz(DATE'2025-06-20', timestamp_ntz'2018-11-17 13:33:33')" + } ] +} + + +-- !query +SELECT make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678), 'PST') +-- !query analysis +Project [make_timestamp(make_date(2021, 7, 11, true), Some(make_time(6, 30, cast(45.678 as decimal(16,6)))), Some(PST), Some(America/Los_Angeles)) AS make_timestamp(make_date(2021, 7, 11), make_time(6, 30, 45.678), PST)#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678), 'CET') +-- !query analysis +Project [make_timestamp(make_date(2021, 7, 11, true), Some(make_time(6, 30, cast(45.678 as decimal(16,6)))), Some(CET), Some(America/Los_Angeles)) AS make_timestamp(make_date(2021, 7, 11), make_time(6, 30, 45.678), CET)#x] ++- OneRowRelation + + +-- !query +SELECT convert_timezone('Europe/Brussels', timestamp_ltz'2022-03-23 00:00:00 America/Los_Angeles') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678)) +-- !query analysis +Project [make_timestamp(make_date(2021, 7, 11, true), Some(make_time(6, 30, cast(45.678 as decimal(16,6)))), None, Some(America/Los_Angeles)) AS make_timestamp(make_date(2021, 7, 11), make_time(6, 30, 45.678))#x] ++- OneRowRelation + + +-- !query +SELECT try_make_timestamp_ltz(NULL, TIME'00:00:00') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_make_timestamp_ltz(DATE'1970-01-01', NULL) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_make_timestamp_ltz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0') +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "first", + "requiredType" : "\"DATE\"", + "sqlExpr" : "\"make_timestamp(TIMESTAMP_NTZ '2018-11-17 13:33:33', TIME '00:00:00')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 78, + "fragment" : "try_make_timestamp_ltz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0')" + } ] +} + + +-- !query +SELECT try_make_timestamp_ltz(DATE'2025-06-20', timestamp_ntz'2018-11-17 13:33:33') +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "second", + "requiredType" : "\"TIME\"", + "sqlExpr" : "\"make_timestamp(DATE '2025-06-20', TIMESTAMP_NTZ '2018-11-17 13:33:33')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 83, + "fragment" : "try_make_timestamp_ltz(DATE'2025-06-20', timestamp_ntz'2018-11-17 13:33:33')" + } ] +} + + +-- !query +SELECT try_make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678), 'PST') +-- !query analysis +Project [make_timestamp(make_date(2021, 7, 11, true), Some(make_time(6, 30, cast(45.678 as decimal(16,6)))), Some(PST), Some(America/Los_Angeles)) AS make_timestamp(make_date(2021, 7, 11), make_time(6, 30, 45.678), PST)#x] ++- OneRowRelation + + +-- !query +SELECT try_make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678), 'CET') +-- !query analysis +Project [make_timestamp(make_date(2021, 7, 11, true), Some(make_time(6, 30, cast(45.678 as decimal(16,6)))), Some(CET), Some(America/Los_Angeles)) AS make_timestamp(make_date(2021, 7, 11), make_time(6, 30, 45.678), CET)#x] ++- OneRowRelation diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/timestampNTZ/timestamp-ntz.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/timestampNTZ/timestamp-ntz.sql.out new file mode 100644 index 0000000000000..0b7ba782643aa --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/timestampNTZ/timestamp-ntz.sql.out @@ -0,0 +1,310 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +select timestamp_ntz'2016-12-31 00:12:00', timestamp_ntz'2016-12-31' +-- !query analysis +Project [2016-12-31 00:12:00 AS TIMESTAMP_NTZ '2016-12-31 00:12:00'#x, 2016-12-31 00:00:00 AS TIMESTAMP_NTZ '2016-12-31 00:00:00'#x] ++- OneRowRelation + + +-- !query +select to_timestamp_ntz(null), to_timestamp_ntz('2016-12-31 00:12:00'), to_timestamp_ntz('2016-12-31', 'yyyy-MM-dd') +-- !query analysis +Project [to_timestamp_ntz(cast(null as string), None, TimestampNTZType, Some(America/Los_Angeles), true) AS to_timestamp_ntz(NULL)#x, to_timestamp_ntz(2016-12-31 00:12:00, None, TimestampNTZType, Some(America/Los_Angeles), true) AS to_timestamp_ntz(2016-12-31 00:12:00)#x, to_timestamp_ntz(2016-12-31, Some(yyyy-MM-dd), TimestampNTZType, Some(America/Los_Angeles), true) AS to_timestamp_ntz(2016-12-31, yyyy-MM-dd)#x] ++- OneRowRelation + + +-- !query +select to_timestamp_ntz(to_date(null)), to_timestamp_ntz(to_date('2016-12-31')) +-- !query analysis +Project [to_timestamp_ntz(to_date(cast(null as string), None, Some(America/Los_Angeles), true), None, TimestampNTZType, Some(America/Los_Angeles), true) AS to_timestamp_ntz(to_date(NULL))#x, to_timestamp_ntz(to_date(2016-12-31, None, Some(America/Los_Angeles), true), None, TimestampNTZType, Some(America/Los_Angeles), true) AS to_timestamp_ntz(to_date(2016-12-31))#x] ++- OneRowRelation + + +-- !query +select to_timestamp_ntz(to_timestamp_ltz(null)), to_timestamp_ntz(to_timestamp_ltz('2016-12-31 00:12:00')) +-- !query analysis +Project [to_timestamp_ntz(to_timestamp_ltz(cast(null as string), None, TimestampType, Some(America/Los_Angeles), true), None, TimestampNTZType, Some(America/Los_Angeles), true) AS to_timestamp_ntz(to_timestamp_ltz(NULL))#x, to_timestamp_ntz(to_timestamp_ltz(2016-12-31 00:12:00, None, TimestampType, Some(America/Los_Angeles), true), None, TimestampNTZType, Some(America/Los_Angeles), true) AS to_timestamp_ntz(to_timestamp_ltz(2016-12-31 00:12:00))#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ntz(2021, 07, 11, 6, 30, 45.678) +-- !query analysis +Project [make_timestamp_ntz(2021, 7, 11, 6, 30, cast(45.678 as decimal(16,6)), None, Some(America/Los_Angeles), true, TimestampNTZType) AS make_timestamp_ntz(2021, 7, 11, 6, 30, 45.678)#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ntz(2021, 07, 11, 6, 30, 45.678, 'CET') +-- !query analysis +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION", + "sqlState" : "42605", + "messageParameters" : { + "actualNum" : "7", + "docroot" : "https://spark.apache.org/docs/latest", + "expectedNum" : "[2, 6]", + "functionName" : "`make_timestamp_ntz`" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 61, + "fragment" : "make_timestamp_ntz(2021, 07, 11, 6, 30, 45.678, 'CET')" + } ] +} + + +-- !query +SELECT make_timestamp_ntz(2021, 07, 11, 6, 30, 60.007) +-- !query analysis +Project [make_timestamp_ntz(2021, 7, 11, 6, 30, cast(60.007 as decimal(16,6)), None, Some(America/Los_Angeles), true, TimestampNTZType) AS make_timestamp_ntz(2021, 7, 11, 6, 30, 60.007)#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ntz(make_date(2021, 07, 11), make_time(6, 30, 45.678)) +-- !query analysis +Project [make_timestamp_ntz(make_date(2021, 7, 11, true), make_time(6, 30, cast(45.678 as decimal(16,6)))) AS make_timestamp_ntz(make_date(2021, 7, 11), make_time(6, 30, 45.678))#x] ++- OneRowRelation + + +-- !query +SELECT make_timestamp_ntz(NULL, TIME'00:00:00') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT make_timestamp_ntz(DATE'1970-01-01', NULL) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT make_timestamp_ntz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0') +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "first", + "requiredType" : "\"DATE\"", + "sqlExpr" : "\"make_timestamp_ntz(TIMESTAMP_NTZ '2018-11-17 13:33:33', TIME '00:00:00')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 74, + "fragment" : "make_timestamp_ntz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0')" + } ] +} + + +-- !query +SELECT make_timestamp_ntz(DATE'2025-06-20', '0:0:0') +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"0:0:0\"", + "inputType" : "\"STRING\"", + "paramIndex" : "second", + "requiredType" : "\"TIME\"", + "sqlExpr" : "\"make_timestamp_ntz(DATE '2025-06-20', 0:0:0)\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 52, + "fragment" : "make_timestamp_ntz(DATE'2025-06-20', '0:0:0')" + } ] +} + + +-- !query +SELECT try_make_timestamp_ntz(make_date(2025, 6, 27), make_time(16, 08, 45.123456)) +-- !query analysis +Project [try_make_timestamp_ntz(make_timestamp_ntz(make_date(2025, 6, 27, true), make_time(16, 8, cast(45.123456 as decimal(16,6))))) AS try_make_timestamp_ntz(make_timestamp_ntz(make_date(2025, 6, 27), make_time(16, 8, 45.123456)))#x] ++- OneRowRelation + + +-- !query +SELECT try_make_timestamp_ntz(NULL, TIME'23:59:59.00001') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_make_timestamp_ntz(DATE'0001-01-01', NULL) +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT try_make_timestamp_ntz('2018-11-17 13:33:33', TIME'0:0:0') +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"2018-11-17 13:33:33\"", + "inputType" : "\"STRING\"", + "paramIndex" : "first", + "requiredType" : "\"DATE\"", + "sqlExpr" : "\"make_timestamp_ntz(2018-11-17 13:33:33, TIME '00:00:00')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 65, + "fragment" : "try_make_timestamp_ntz('2018-11-17 13:33:33', TIME'0:0:0')" + } ] +} + + +-- !query +SELECT try_make_timestamp_ntz(DATE'2025-06-20', 10D) +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"10.0\"", + "inputType" : "\"DOUBLE\"", + "paramIndex" : "second", + "requiredType" : "\"TIME\"", + "sqlExpr" : "\"make_timestamp_ntz(DATE '2025-06-20', 10.0)\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 52, + "fragment" : "try_make_timestamp_ntz(DATE'2025-06-20', 10D)" + } ] +} + + +-- !query +SELECT convert_timezone('Europe/Moscow', 'America/Los_Angeles', timestamp_ntz'2022-01-01 00:00:00') +-- !query analysis +Project [convert_timezone(Europe/Moscow, America/Los_Angeles, 2022-01-01 00:00:00) AS convert_timezone(Europe/Moscow, America/Los_Angeles, TIMESTAMP_NTZ '2022-01-01 00:00:00')#x] ++- OneRowRelation + + +-- !query +SELECT convert_timezone('Europe/Brussels', timestamp_ntz'2022-03-23 00:00:00') +-- !query analysis +Project [convert_timezone(current_timezone(), Europe/Brussels, 2022-03-23 00:00:00) AS convert_timezone(current_timezone(), Europe/Brussels, TIMESTAMP_NTZ '2022-03-23 00:00:00')#x] ++- OneRowRelation + + +-- !query +select timestampdiff(QUARTER, timestamp_ntz'2022-01-01 01:02:03', timestamp_ntz'2022-05-02 05:06:07') +-- !query analysis +Project [timestampdiff(QUARTER, cast(2022-01-01 01:02:03 as timestamp), cast(2022-05-02 05:06:07 as timestamp), Some(America/Los_Angeles)) AS timestampdiff(QUARTER, TIMESTAMP_NTZ '2022-01-01 01:02:03', TIMESTAMP_NTZ '2022-05-02 05:06:07')#xL] ++- OneRowRelation + + +-- !query +select timestampdiff(HOUR, timestamp_ntz'2022-02-14 01:02:03', timestamp_ltz'2022-02-14 02:03:04') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select timestampdiff(YEAR, date'2022-02-15', timestamp_ntz'2023-02-15 10:11:12') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select timestampdiff(MILLISECOND, timestamp_ntz'2022-02-14 23:59:59.123', date'2022-02-15') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' = date'2022-01-01' +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' > date'2022-01-01' +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' < date'2022-01-01' +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' = timestamp_ltz'2022-01-01 00:00:00' +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' > timestamp_ltz'2022-01-01 00:00:00' +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' < timestamp_ltz'2022-01-01 00:00:00' +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +CREATE TABLE a (a timestamp_ntz, b int) using parquet PARTITIONED BY(a) +-- !query analysis +CreateDataSourceTableCommand `spark_catalog`.`default`.`a`, false + + +-- !query +INSERT INTO a PARTITION(a=timestamp_ntz'2018-11-17 13:33:33') VALUES (1) +-- !query analysis +InsertIntoHadoopFsRelationCommand file:[not included in comparison]/{warehouse_dir}/a, [a=2018-11-17 13:33:33], false, [a#x], Parquet, [path=file:[not included in comparison]/{warehouse_dir}/a], Append, `spark_catalog`.`default`.`a`, org.apache.spark.sql.execution.datasources.CatalogFileIndex(file:[not included in comparison]/{warehouse_dir}/a), [b, a] ++- Project [b#x, cast(2018-11-17 13:33:33 as timestamp_ntz) AS a#x] + +- Project [col1#x AS b#x] + +- LocalRelation [col1#x] + + +-- !query +DESC FORMATTED a +-- !query analysis +DescribeTableCommand `spark_catalog`.`default`.`a`, true, [col_name#x, data_type#x, comment#x] ++- ResolvedTable V2SessionCatalog(spark_catalog), default.a, V1Table(default.a), [b#x, a#x] + + +-- !query +SELECT * FROM a +-- !query analysis +Project [b#x, a#x] ++- SubqueryAlias spark_catalog.default.a + +- Relation spark_catalog.default.a[b#x,a#x] parquet + + +-- !query +DROP TABLE a +-- !query analysis +DropTable false, false ++- ResolvedIdentifier V2SessionCatalog(spark_catalog), default.a diff --git a/sql/core/src/test/resources/sql-tests/inputs/timestamp-ltz.sql b/sql/core/src/test/resources/sql-tests/inputs/timestamp-ltz.sql index 6484383eabc02..bf20b4abab362 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/timestamp-ltz.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/timestamp-ltz.sql @@ -1,6 +1,4 @@ -- timestamp_ltz literals and constructors ---CONFIG_DIM1 spark.sql.timestampType=TIMESTAMP_LTZ ---CONFIG_DIM2 spark.sql.timestampType=TIMESTAMP_NTZ select timestamp_ltz'2016-12-31 00:12:00', timestamp_ltz'2016-12-31'; diff --git a/sql/core/src/test/resources/sql-tests/inputs/timestamp-ntz.sql b/sql/core/src/test/resources/sql-tests/inputs/timestamp-ntz.sql index 0f9902cc4fee6..318867fa89b24 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/timestamp-ntz.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/timestamp-ntz.sql @@ -1,6 +1,4 @@ -- timestamp_ntz literals and constructors ---CONFIG_DIM1 spark.sql.timestampType=TIMESTAMP_LTZ ---CONFIG_DIM2 spark.sql.timestampType=TIMESTAMP_NTZ select timestamp_ntz'2016-12-31 00:12:00', timestamp_ntz'2016-12-31'; diff --git a/sql/core/src/test/resources/sql-tests/inputs/timestampNTZ/timestamp-ltz.sql b/sql/core/src/test/resources/sql-tests/inputs/timestampNTZ/timestamp-ltz.sql new file mode 100644 index 0000000000000..9e826bc792305 --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/inputs/timestampNTZ/timestamp-ltz.sql @@ -0,0 +1,2 @@ +-- timestamp_ltz literals and constructors with the default timestamp type as TIMESTAMP_NTZ +--IMPORT timestamp-ltz.sql diff --git a/sql/core/src/test/resources/sql-tests/inputs/timestampNTZ/timestamp-ntz.sql b/sql/core/src/test/resources/sql-tests/inputs/timestampNTZ/timestamp-ntz.sql new file mode 100644 index 0000000000000..7d8e394192236 --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/inputs/timestampNTZ/timestamp-ntz.sql @@ -0,0 +1,2 @@ +-- timestamp_ntz literals and constructors with the default timestamp type as TIMESTAMP_NTZ +--IMPORT timestamp-ntz.sql diff --git a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out index f04353680b238..1998d010cc247 100644 --- a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ansi.sql.out @@ -741,7 +741,7 @@ struct -- !query select UNIX_SECONDS(timestamp'2020-12-01 14:30:08Z'), UNIX_SECONDS(timestamp'2020-12-01 14:30:08.999999Z'), UNIX_SECONDS(null) -- !query schema -struct +struct -- !query output 1606833008 1606833008 NULL @@ -749,7 +749,7 @@ struct +struct -- !query output 1606833008000 1606833008999 NULL @@ -757,7 +757,7 @@ struct +struct -- !query output 1606833008000000 1606833008999999 NULL diff --git a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ltz.sql.out b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ltz.sql.out new file mode 100644 index 0000000000000..1c764e185bc80 --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ltz.sql.out @@ -0,0 +1,254 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +select timestamp_ltz'2016-12-31 00:12:00', timestamp_ltz'2016-12-31' +-- !query schema +struct +-- !query output +2016-12-31 00:12:00 2016-12-31 00:00:00 + + +-- !query +select to_timestamp_ltz(null), to_timestamp_ltz('2016-12-31 00:12:00'), to_timestamp_ltz('2016-12-31', 'yyyy-MM-dd') +-- !query schema +struct +-- !query output +NULL 2016-12-31 00:12:00 2016-12-31 00:00:00 + + +-- !query +select to_timestamp_ltz(to_date(null)), to_timestamp_ltz(to_date('2016-12-31')) +-- !query schema +struct +-- !query output +NULL 2016-12-31 00:00:00 + + +-- !query +select to_timestamp_ltz(to_timestamp_ntz(null)), to_timestamp_ltz(to_timestamp_ntz('2016-12-31 00:12:00')) +-- !query schema +struct +-- !query output +NULL 2016-12-31 00:12:00 + + +-- !query +SELECT make_timestamp_ltz(2021, 07, 11, 6, 30, 45.678) +-- !query schema +struct +-- !query output +2021-07-11 06:30:45.678 + + +-- !query +SELECT make_timestamp_ltz(2021, 07, 11, 6, 30, 45.678, 'CET') +-- !query schema +struct +-- !query output +2021-07-10 21:30:45.678 + + +-- !query +SELECT make_timestamp_ltz(2021, 07, 11, 6, 30, 60.007) +-- !query schema +struct<> +-- !query output +org.apache.spark.SparkDateTimeException +{ + "errorClass" : "INVALID_FRACTION_OF_SECOND", + "sqlState" : "22023", + "messageParameters" : { + "secAndMicros" : "60.007" + } +} + + +-- !query +SELECT make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678)) +-- !query schema +struct +-- !query output +2021-07-11 06:30:45.678 + + +-- !query +SELECT make_timestamp_ltz(NULL, TIME'00:00:00') +-- !query schema +struct +-- !query output +NULL + + +-- !query +SELECT make_timestamp_ltz(DATE'1970-01-01', NULL) +-- !query schema +struct +-- !query output +NULL + + +-- !query +SELECT make_timestamp_ltz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0') +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "first", + "requiredType" : "\"DATE\"", + "sqlExpr" : "\"make_timestamp(TIMESTAMP_NTZ '2018-11-17 13:33:33', TIME '00:00:00')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 74, + "fragment" : "make_timestamp_ltz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0')" + } ] +} + + +-- !query +SELECT make_timestamp_ltz(DATE'2025-06-20', timestamp_ntz'2018-11-17 13:33:33') +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "second", + "requiredType" : "\"TIME\"", + "sqlExpr" : "\"make_timestamp(DATE '2025-06-20', TIMESTAMP_NTZ '2018-11-17 13:33:33')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 79, + "fragment" : "make_timestamp_ltz(DATE'2025-06-20', timestamp_ntz'2018-11-17 13:33:33')" + } ] +} + + +-- !query +SELECT make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678), 'PST') +-- !query schema +struct +-- !query output +2021-07-11 06:30:45.678 + + +-- !query +SELECT make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678), 'CET') +-- !query schema +struct +-- !query output +2021-07-10 21:30:45.678 + + +-- !query +SELECT convert_timezone('Europe/Brussels', timestamp_ltz'2022-03-23 00:00:00 America/Los_Angeles') +-- !query schema +struct +-- !query output +2022-03-23 08:00:00 + + +-- !query +SELECT try_make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678)) +-- !query schema +struct +-- !query output +2021-07-11 06:30:45.678 + + +-- !query +SELECT try_make_timestamp_ltz(NULL, TIME'00:00:00') +-- !query schema +struct +-- !query output +NULL + + +-- !query +SELECT try_make_timestamp_ltz(DATE'1970-01-01', NULL) +-- !query schema +struct +-- !query output +NULL + + +-- !query +SELECT try_make_timestamp_ltz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0') +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "first", + "requiredType" : "\"DATE\"", + "sqlExpr" : "\"make_timestamp(TIMESTAMP_NTZ '2018-11-17 13:33:33', TIME '00:00:00')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 78, + "fragment" : "try_make_timestamp_ltz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0')" + } ] +} + + +-- !query +SELECT try_make_timestamp_ltz(DATE'2025-06-20', timestamp_ntz'2018-11-17 13:33:33') +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "second", + "requiredType" : "\"TIME\"", + "sqlExpr" : "\"make_timestamp(DATE '2025-06-20', TIMESTAMP_NTZ '2018-11-17 13:33:33')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 83, + "fragment" : "try_make_timestamp_ltz(DATE'2025-06-20', timestamp_ntz'2018-11-17 13:33:33')" + } ] +} + + +-- !query +SELECT try_make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678), 'PST') +-- !query schema +struct +-- !query output +2021-07-11 06:30:45.678 + + +-- !query +SELECT try_make_timestamp_ltz(make_date(2021, 07, 11), make_time(6, 30, 45.678), 'CET') +-- !query schema +struct +-- !query output +2021-07-10 21:30:45.678 diff --git a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ntz.sql.out b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ntz.sql.out new file mode 100644 index 0000000000000..058cee282d3ff --- /dev/null +++ b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp-ntz.sql.out @@ -0,0 +1,383 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +select timestamp_ntz'2016-12-31 00:12:00', timestamp_ntz'2016-12-31' +-- !query schema +struct +-- !query output +2016-12-31 00:12:00 2016-12-31 00:00:00 + + +-- !query +select to_timestamp_ntz(null), to_timestamp_ntz('2016-12-31 00:12:00'), to_timestamp_ntz('2016-12-31', 'yyyy-MM-dd') +-- !query schema +struct +-- !query output +NULL 2016-12-31 00:12:00 2016-12-31 00:00:00 + + +-- !query +select to_timestamp_ntz(to_date(null)), to_timestamp_ntz(to_date('2016-12-31')) +-- !query schema +struct +-- !query output +NULL 2016-12-31 00:00:00 + + +-- !query +select to_timestamp_ntz(to_timestamp_ltz(null)), to_timestamp_ntz(to_timestamp_ltz('2016-12-31 00:12:00')) +-- !query schema +struct +-- !query output +NULL 2016-12-31 00:12:00 + + +-- !query +SELECT make_timestamp_ntz(2021, 07, 11, 6, 30, 45.678) +-- !query schema +struct +-- !query output +2021-07-11 06:30:45.678 + + +-- !query +SELECT make_timestamp_ntz(2021, 07, 11, 6, 30, 45.678, 'CET') +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "WRONG_NUM_ARGS.WITHOUT_SUGGESTION", + "sqlState" : "42605", + "messageParameters" : { + "actualNum" : "7", + "docroot" : "https://spark.apache.org/docs/latest", + "expectedNum" : "[2, 6]", + "functionName" : "`make_timestamp_ntz`" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 61, + "fragment" : "make_timestamp_ntz(2021, 07, 11, 6, 30, 45.678, 'CET')" + } ] +} + + +-- !query +SELECT make_timestamp_ntz(2021, 07, 11, 6, 30, 60.007) +-- !query schema +struct<> +-- !query output +org.apache.spark.SparkDateTimeException +{ + "errorClass" : "INVALID_FRACTION_OF_SECOND", + "sqlState" : "22023", + "messageParameters" : { + "secAndMicros" : "60.007" + } +} + + +-- !query +SELECT make_timestamp_ntz(make_date(2021, 07, 11), make_time(6, 30, 45.678)) +-- !query schema +struct +-- !query output +2021-07-11 06:30:45.678 + + +-- !query +SELECT make_timestamp_ntz(NULL, TIME'00:00:00') +-- !query schema +struct +-- !query output +NULL + + +-- !query +SELECT make_timestamp_ntz(DATE'1970-01-01', NULL) +-- !query schema +struct +-- !query output +NULL + + +-- !query +SELECT make_timestamp_ntz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0') +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"TIMESTAMP_NTZ '2018-11-17 13:33:33'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", + "paramIndex" : "first", + "requiredType" : "\"DATE\"", + "sqlExpr" : "\"make_timestamp_ntz(TIMESTAMP_NTZ '2018-11-17 13:33:33', TIME '00:00:00')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 74, + "fragment" : "make_timestamp_ntz(timestamp_ntz'2018-11-17 13:33:33', TIME'0:0:0')" + } ] +} + + +-- !query +SELECT make_timestamp_ntz(DATE'2025-06-20', '0:0:0') +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"0:0:0\"", + "inputType" : "\"STRING\"", + "paramIndex" : "second", + "requiredType" : "\"TIME\"", + "sqlExpr" : "\"make_timestamp_ntz(DATE '2025-06-20', 0:0:0)\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 52, + "fragment" : "make_timestamp_ntz(DATE'2025-06-20', '0:0:0')" + } ] +} + + +-- !query +SELECT try_make_timestamp_ntz(make_date(2025, 6, 27), make_time(16, 08, 45.123456)) +-- !query schema +struct +-- !query output +2025-06-27 16:08:45.123456 + + +-- !query +SELECT try_make_timestamp_ntz(NULL, TIME'23:59:59.00001') +-- !query schema +struct +-- !query output +NULL + + +-- !query +SELECT try_make_timestamp_ntz(DATE'0001-01-01', NULL) +-- !query schema +struct +-- !query output +NULL + + +-- !query +SELECT try_make_timestamp_ntz('2018-11-17 13:33:33', TIME'0:0:0') +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"2018-11-17 13:33:33\"", + "inputType" : "\"STRING\"", + "paramIndex" : "first", + "requiredType" : "\"DATE\"", + "sqlExpr" : "\"make_timestamp_ntz(2018-11-17 13:33:33, TIME '00:00:00')\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 65, + "fragment" : "try_make_timestamp_ntz('2018-11-17 13:33:33', TIME'0:0:0')" + } ] +} + + +-- !query +SELECT try_make_timestamp_ntz(DATE'2025-06-20', 10D) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", + "sqlState" : "42K09", + "messageParameters" : { + "inputSql" : "\"10.0\"", + "inputType" : "\"DOUBLE\"", + "paramIndex" : "second", + "requiredType" : "\"TIME\"", + "sqlExpr" : "\"make_timestamp_ntz(DATE '2025-06-20', 10.0)\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 8, + "stopIndex" : 52, + "fragment" : "try_make_timestamp_ntz(DATE'2025-06-20', 10D)" + } ] +} + + +-- !query +SELECT convert_timezone('Europe/Moscow', 'America/Los_Angeles', timestamp_ntz'2022-01-01 00:00:00') +-- !query schema +struct +-- !query output +2021-12-31 13:00:00 + + +-- !query +SELECT convert_timezone('Europe/Brussels', timestamp_ntz'2022-03-23 00:00:00') +-- !query schema +struct +-- !query output +2022-03-23 08:00:00 + + +-- !query +select timestampdiff(QUARTER, timestamp_ntz'2022-01-01 01:02:03', timestamp_ntz'2022-05-02 05:06:07') +-- !query schema +struct +-- !query output +1 + + +-- !query +select timestampdiff(HOUR, timestamp_ntz'2022-02-14 01:02:03', timestamp_ltz'2022-02-14 02:03:04') +-- !query schema +struct +-- !query output +1 + + +-- !query +select timestampdiff(YEAR, date'2022-02-15', timestamp_ntz'2023-02-15 10:11:12') +-- !query schema +struct +-- !query output +1 + + +-- !query +select timestampdiff(MILLISECOND, timestamp_ntz'2022-02-14 23:59:59.123', date'2022-02-15') +-- !query schema +struct +-- !query output +877 + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' = date'2022-01-01' +-- !query schema +struct<(TIMESTAMP_NTZ '2022-01-01 00:00:00' = DATE '2022-01-01'):boolean> +-- !query output +true + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' > date'2022-01-01' +-- !query schema +struct<(TIMESTAMP_NTZ '2022-01-01 00:00:00' > DATE '2022-01-01'):boolean> +-- !query output +false + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' < date'2022-01-01' +-- !query schema +struct<(TIMESTAMP_NTZ '2022-01-01 00:00:00' < DATE '2022-01-01'):boolean> +-- !query output +false + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' = timestamp_ltz'2022-01-01 00:00:00' +-- !query schema +struct<(TIMESTAMP_NTZ '2022-01-01 00:00:00' = TIMESTAMP_LTZ '2022-01-01 00:00:00'):boolean> +-- !query output +true + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' > timestamp_ltz'2022-01-01 00:00:00' +-- !query schema +struct<(TIMESTAMP_NTZ '2022-01-01 00:00:00' > TIMESTAMP_LTZ '2022-01-01 00:00:00'):boolean> +-- !query output +false + + +-- !query +select timestamp_ntz'2022-01-01 00:00:00' < timestamp_ltz'2022-01-01 00:00:00' +-- !query schema +struct<(TIMESTAMP_NTZ '2022-01-01 00:00:00' < TIMESTAMP_LTZ '2022-01-01 00:00:00'):boolean> +-- !query output +false + + +-- !query +CREATE TABLE a (a timestamp_ntz, b int) using parquet PARTITIONED BY(a) +-- !query schema +struct<> +-- !query output + + + +-- !query +INSERT INTO a PARTITION(a=timestamp_ntz'2018-11-17 13:33:33') VALUES (1) +-- !query schema +struct<> +-- !query output + + + +-- !query +DESC FORMATTED a +-- !query schema +struct +-- !query output +b int +a timestamp_ntz +# Partition Information +# col_name data_type comment +a timestamp_ntz + +# Detailed Table Information +Catalog spark_catalog +Database default +Table a +Created Time [not included in comparison] +Last Access [not included in comparison] +Created By [not included in comparison] +Type MANAGED +Provider parquet +Location [not included in comparison]/{warehouse_dir}/a +Partition Provider Catalog + + +-- !query +SELECT * FROM a +-- !query schema +struct +-- !query output +1 2018-11-17 13:33:33 + + +-- !query +DROP TABLE a +-- !query schema +struct<> +-- !query output + diff --git a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp.sql.out b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp.sql.out index c0a154facec2b..d328b47eecbbe 100644 --- a/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/timestampNTZ/timestamp.sql.out @@ -713,7 +713,7 @@ struct -- !query select UNIX_SECONDS(timestamp'2020-12-01 14:30:08Z'), UNIX_SECONDS(timestamp'2020-12-01 14:30:08.999999Z'), UNIX_SECONDS(null) -- !query schema -struct +struct -- !query output 1606833008 1606833008 NULL @@ -721,7 +721,7 @@ struct +struct -- !query output 1606833008000 1606833008999 NULL @@ -729,7 +729,7 @@ struct +struct -- !query output 1606833008000000 1606833008999999 NULL diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/ShowCreateTableSuiteBase.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/ShowCreateTableSuiteBase.scala index e796909e30d5b..3b9e87e3687c0 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/command/ShowCreateTableSuiteBase.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/command/ShowCreateTableSuiteBase.scala @@ -18,6 +18,7 @@ package org.apache.spark.sql.execution.command import org.apache.spark.sql.QueryTest +import org.apache.spark.sql.internal.SQLConf import org.apache.spark.sql.sources.SimpleInsertSource import org.apache.spark.util.Utils @@ -184,6 +185,27 @@ trait ShowCreateTableSuiteBase extends QueryTest with DDLCommandTestUtils { } } + test("SPARK-59433: SHOW CREATE TABLE keeps TIMESTAMP_LTZ columns when the default timestamp " + + "type is TIMESTAMP_NTZ") { + withSQLConf(SQLConf.TIMESTAMP_TYPE.key -> SQLConf.TimestampTypes.TIMESTAMP_NTZ.toString) { + withNamespaceAndTable(ns, table) { t => + sql( + s""" + |CREATE TABLE $t ( + | ltz TIMESTAMP_LTZ, + | ntz TIMESTAMP_NTZ, + | arr ARRAY + |) + |USING ${classOf[SimpleInsertSource].getName} + """.stripMargin) + val showDDL = getShowCreateDDL(t) + assert(showDDL(1) == "ltz TIMESTAMP_LTZ,") + assert(showDDL(2) == "ntz TIMESTAMP_NTZ,") + assert(showDDL(3) == "arr ARRAY)") + } + } + } + def getShowCreateDDL(table: String, serde: Boolean = false): Array[String] = { val result = if (serde) { sql(s"SHOW CREATE TABLE $table AS SERDE")