You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by ur...@apache.org on 2026/10/19 13:22:36 UTC
(spark) branch branch-4.x updated: [SPARK-60335][SQL] Do not implicitly narrow nanosecond-precision timestamps
This is an automated email from the ASF dual-hosted git repository.
uros-b pushed a commit to branch branch-4.x
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-4.x by this push:
new c2ac538a7b82 [SPARK-60335][SQL] Do not implicitly narrow nanosecond-precision timestamps
c2ac538a7b82 is described below
commit c2ac538a7b820b12c98966fc282ba1b1684071bb
Author: Stevo Mitric <st...@gmail.com>
AuthorDate: Mon Oct 19 13:22:13 2026 +0000
[SPARK-60335][SQL] Do not implicitly narrow nanosecond-precision timestamps
### What changes were proposed in this pull request?
Implicit type coercion no longer narrows a `TIMESTAMP_NTZ(p)` / `TIMESTAMP_LTZ(p)` value (p in 7..9) when a function does not support the nanosecond types:
- `TypeCoercion.implicitCast` (non-ANSI) no longer casts a nanos timestamp to a lower-precision timestamp (the microsecond `TIMESTAMP` / `TIMESTAMP_NTZ`, `AnyTimestampType`, or a nanos type of lower precision) or to `TIME`. Before, the `(DatetimeType, DatetimeType)` arm accepted any such pair, so a nanos input silently lost its sub-microsecond digits and an NTZ input became LTZ.
- `AnsiTypeCoercion.implicitCast` no longer casts a nanos timestamp to `TIME`, also when nested in an array, map or struct. `Cast.canANSIStoreAssign` allows it (store assignment keeps it), and the ANSI implicit-cast rule used that predicate directly. Precision narrowing was already blocked there by SPARK-57303.
- The `TypeCollection` fallback in both modes skips `DATE` for a nanos input (also nested), so it no longer picks the first `DATE` member and drops the time of day.
Both helpers live in `TypeCoercionHelper` (`isNanosNarrowing`, `pickTypeCollectionCast`) and are shared by the two modes. `DATE` as a direct expected type is unchanged, so date-valued functions (`last_day`, `next_day`, `datediff`, `add_months`, `trunc`, ...) still accept a nanos input. Widening (micro to nanos, p to a higher p, the NTZ/LTZ family rules), string promotion, explicit `CAST`, store assignment, and every microsecond type are unchanged.
### Why are the changes needed?
The SPIP (SPARK-56822) parity criterion says no function may silently downgrade a nanos timestamp; a clean error is acceptable, a less precise or wrong-typed result is not. Today:
- Non-ANSI: `timestampdiff(MICROSECOND, TIMESTAMP_NTZ '...00.000000999', TIMESTAMP_NTZ '...00.000001001')` returns `1` instead of `0`; `months_between`, `window`, `session_window` (and `window_time`) compute on microseconds. ANSI rejects the same calls, so the two modes disagree.
- Both modes: `percentile_approx` / `approx_percentile` / `histogram_numeric` over a nanos column return `DATE` (`2020-01-01`).
- ANSI: `percentile` / `median` / `percentile_cont` / `percentile_disc` return `TIME(6)` (`12:00:00.123456`), as do `time_trunc` and `time_diff` on a nanos input.
These now fail with `DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE` in both modes until the functions get native nanos support.
### Does this PR introduce _any_ user-facing change?
Yes, for the preview nanosecond timestamp types only (`spark.sql.timestampNanosTypes.enabled`): the calls above fail at analysis instead of returning a less precise or wrong-typed value. The same applies to every other implicit-cast site, so a Scala UDF or a procedure parameter typed as a microsecond timestamp or `TIME` now rejects a nanos argument in both modes, also nested (e.g. `Seq[LocalTime]`); before, the argument was silently truncated or cast to `TIME` (ANSI already rejected m [...]
### How was this patch tested?
- `TypeCoercionSuiteBase` (runs in `TypeCoercionSuite` and `AnsiTypeCoercionSuite`): the nanos cast matrix (micro / lower-precision / TIME targets rejected, DATE / string / widening kept, `TypeCollection` fallback skips DATE and TIME, the same inside arrays, maps and structs, micro unchanged) and rule tests for `months_between`, `time_trunc`, `percentile_approx` and `last_day`.
- `timestamp-ntz-nanos.sql` / `timestamp-ltz-nanos.sql`: the affected functions (incl. `time_trunc` / `time_diff`) plus date-valued controls, under ANSI on and off; `TimestampNanosFunctionsSuiteBase`: typed Scala UDFs reject nanos inputs in both modes.
- Existing `TimestampNanos*` suites, `CastWithAnsiOn/OffSuite`, `DateExpressionsSuite`, the catalyst analysis suites and `SQLQueryTestSuite` pass.
### Was this patch authored or co-authored using generative AI tooling?
Generated-by: Claude Code (Claude Opus 5.5)
Closes #59575 from stevomitric/stevomitric/nanos-implicit-narrowing.
Authored-by: Stevo Mitric <st...@gmail.com>
Signed-off-by: Uros Bojanic <22...@users.noreply.github.com>
(cherry picked from commit ec58b58440ac9acd14c2b9cb777028e032a20e5c)
Signed-off-by: Uros Bojanic <22...@users.noreply.github.com>
---
docs/sql-ref-datatypes.md | 2 +-
.../sql/catalyst/analysis/AnsiTypeCoercion.scala | 7 +-
.../spark/sql/catalyst/analysis/TypeCoercion.scala | 7 +-
.../sql/catalyst/analysis/TypeCoercionHelper.scala | 35 ++
.../sql/catalyst/analysis/TypeCoercionSuite.scala | 71 +++
.../analyzer-results/timestamp-ltz-nanos.sql.out | 630 +++++++++++++++++++
.../analyzer-results/timestamp-ntz-nanos.sql.out | 630 +++++++++++++++++++
.../sql-tests/inputs/timestamp-ltz-nanos.sql | 58 ++
.../sql-tests/inputs/timestamp-ntz-nanos.sql | 58 ++
.../sql-tests/results/timestamp-ltz-nanos.sql.out | 682 +++++++++++++++++++++
.../sql-tests/results/timestamp-ntz-nanos.sql.out | 682 +++++++++++++++++++++
.../sql/TimestampNanosFunctionsSuiteBase.scala | 36 +-
12 files changed, 2892 insertions(+), 6 deletions(-)
diff --git a/docs/sql-ref-datatypes.md b/docs/sql-ref-datatypes.md
index 7bfe4cf56c7d..3ab9685acc00 100644
--- a/docs/sql-ref-datatypes.md
+++ b/docs/sql-ref-datatypes.md
@@ -56,7 +56,7 @@ Spark SQL and DataFrames support the following data types:
hour, minute, and second. All operations are performed without taking any time zone into account.
- Note: TIMESTAMP in Spark is a user-specified alias associated with one of the TIMESTAMP_LTZ and TIMESTAMP_NTZ variations. Users can set the default timestamp type as `TIMESTAMP_LTZ`(default value) or `TIMESTAMP_NTZ` via the configuration `spark.sql.timestampType`.
- `TimestampNTZNanosType(precision)` / `TimestampLTZNanosType(precision)`: Preview nanosecond-capable variants of `TIMESTAMP_NTZ` and `TIMESTAMP_LTZ` with fractional seconds precision `precision` in `[7, 9]`. Unparameterized `TIMESTAMP`, `TIMESTAMP_NTZ`, and `TIMESTAMP_LTZ` remain microsecond types. In schema-driven Dataset/DataFrame conversion, Spark maps `TimestampNTZNanosType` to `java.time.LocalDateTime` and `TimestampLTZNanosType` to `java.time.Instant`; values with more sub-micro [...]
- - Note: Nanosecond precision is only available through the schema-driven APIs above. Typed encoders derived from `java.time.Instant`/`java.time.LocalDateTime` (for example `ds.as[T]` for a case class and `spark.createDataFrame(Seq(...))` without an explicit schema) bind these types to the microsecond `TIMESTAMP_LTZ`/`TIMESTAMP_NTZ` types, and typed Scala/Java UDFs such as `udf((i: java.time.Instant) => ...)` coerce their inputs to microsecond precision at the UDF boundary. Kryo encod [...]
+ - Note: Nanosecond precision is only available through the schema-driven APIs above. Typed encoders derived from `java.time.Instant`/`java.time.LocalDateTime` (for example `ds.as[T]` for a case class and `spark.createDataFrame(Seq(...))` without an explicit schema) bind these types to the microsecond `TIMESTAMP_LTZ`/`TIMESTAMP_NTZ` types, and typed Scala/Java UDFs such as `udf((i: java.time.Instant) => ...)` take microsecond inputs, so a nanosecond argument needs an explicit `CAST` t [...]
* Interval types
- `YearMonthIntervalType(startField, endField)`: Represents a year-month interval which is made up of a contiguous subset of the following fields:
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercion.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercion.scala
index d64f9d48bee2..ea054b03d5ff 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercion.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercion.scala
@@ -204,9 +204,12 @@ object AnsiTypeCoercion extends TypeCoercionBase {
// When the target type is `TypeCollection`, there is another branch to find the
// "closet convertible data type" below.
+ // Unlike store assignment, a nanos timestamp, also nested, is never implicitly narrowed to
+ // TIME.
case (_, target) if !target.isInstanceOf[TypeCollection] =>
val concreteType = target.defaultConcreteType
- if (Cast.canANSIStoreAssign(inType, concreteType)) {
+ if (Cast.canANSIStoreAssign(inType, concreteType) &&
+ !isNanosNarrowing(inType, concreteType)) {
Some(concreteType)
} else {
None
@@ -215,7 +218,7 @@ object AnsiTypeCoercion extends TypeCoercionBase {
// When we reach here, input type is not acceptable for any types in this type collection,
// try to find the first one we can implicitly cast.
case (_, TypeCollection(types)) =>
- types.flatMap(implicitCast(inType, _)).headOption
+ pickTypeCollectionCast(inType, types.flatMap(implicitCast(inType, _)))
case _ => None
}
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala
index 755882325939..5396782b211c 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercion.scala
@@ -231,7 +231,10 @@ object TypeCoercion extends TypeCoercionBase {
// For any other numeric types, implicitly cast to each other, e.g. long -> int, int -> long
case (_: NumericType, target: NumericType) => target
- // Implicit cast between date time types
+ // Implicit cast between date time types. A nanos timestamp is never implicitly cast to a
+ // lower-precision timestamp or to TIME; a direct DATE target is still allowed.
+ case (_: DatetimeType, d @ (_: DatetimeType | AnyTimestampType))
+ if isNanosNarrowing(inType, d.defaultConcreteType) => null
case (_: DatetimeType, d: DatetimeType) => d
case (_: DatetimeType, AnyTimestampType) => AnyTimestampType.defaultConcreteType
@@ -251,7 +254,7 @@ object TypeCoercion extends TypeCoercionBase {
// When we reach here, input type is not acceptable for any types in this type collection,
// try to find the first one we can implicitly cast.
case (_, TypeCollection(types)) =>
- types.flatMap(implicitCast(inType, _)).headOption.orNull
+ pickTypeCollectionCast(inType, types.flatMap(implicitCast(inType, _))).orNull
// Implicit cast between array types.
//
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionHelper.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionHelper.scala
index f67aa877c850..973c3788a4e1 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionHelper.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionHelper.scala
@@ -70,6 +70,7 @@ import org.apache.spark.sql.internal.types.{
import org.apache.spark.sql.types.{
AbstractDataType,
AnyDataType,
+ AnyTimestampNanoType,
AnyTimestampTypeExpression,
ArrayType,
BinaryType,
@@ -204,6 +205,40 @@ abstract class TypeCoercionHelper {
.getOrElse(implicitCast(e, StringType).getOrElse(e))
}
+ /**
+ * Whether an implicit cast of `from` to `to` narrows a nanosecond-precision timestamp, also
+ * inside an array, map or struct: a lower-precision timestamp drops sub-microsecond digits and
+ * TIME drops the date part.
+ */
+ protected def isNanosNarrowing(from: DataType, to: DataType): Boolean =
+ existsNanosPair(from, to) { (nanos, t) =>
+ t.isInstanceOf[TimeType] || TimestampFamily.fractionalPrecision(nanos).exists(fp =>
+ TimestampFamily.fractionalPrecision(t).exists(_ < fp))
+ }
+
+ /**
+ * Picks the implicit cast target for a [[TypeCollection]] from the castable member types, in
+ * member order. A nanosecond-precision timestamp, also nested, skips DATE, which drops the time
+ * of day.
+ */
+ protected def pickTypeCollectionCast(
+ inType: DataType,
+ castable: Seq[DataType]): Option[DataType] = {
+ castable.find(dt => !existsNanosPair(inType, dt)((_, t) => t == DateType))
+ }
+
+ /** Whether `p` holds for some nanos timestamp in `from` and its counterpart in `to`. */
+ private def existsNanosPair(from: DataType, to: DataType)(
+ p: (DataType, DataType) => Boolean): Boolean = (from, to) match {
+ case (_: AnyTimestampNanoType, _) => p(from, to)
+ case (ArrayType(f, _), ArrayType(t, _)) => existsNanosPair(f, t)(p)
+ case (MapType(fk, fv, _), MapType(tk, tv, _)) =>
+ existsNanosPair(fk, tk)(p) || existsNanosPair(fv, tv)(p)
+ case (StructType(ff), StructType(tf)) =>
+ ff.zip(tf).exists { case (f, t) => existsNanosPair(f.dataType, t.dataType)(p) }
+ case _ => false
+ }
+
/**
* Whether casting `from` as `to` is valid.
*/
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala
index 9c7832aae43c..7aecd76c0faf 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala
@@ -25,6 +25,7 @@ import org.apache.spark.sql.catalyst.analysis.TypeCoercion._
import org.apache.spark.sql.catalyst.dsl.expressions._
import org.apache.spark.sql.catalyst.dsl.plans._
import org.apache.spark.sql.catalyst.expressions._
+import org.apache.spark.sql.catalyst.expressions.aggregate.ApproximatePercentile
import org.apache.spark.sql.catalyst.plans.ReferenceAllColumns
import org.apache.spark.sql.catalyst.plans.logical._
import org.apache.spark.sql.catalyst.rules.{Rule, RuleExecutor}
@@ -356,6 +357,76 @@ abstract class TypeCoercionSuiteBase extends AnalysisTest {
shouldNotCast(IntegerType, TypeCollection(DateType, TimestampType))
}
+ test("implicit type cast - nanosecond-precision timestamps are not narrowed") {
+ Seq(
+ TimestampNTZNanosType(7),
+ TimestampNTZNanosType(9),
+ TimestampLTZNanosType(8),
+ TimestampLTZNanosType(9)).foreach { nanos =>
+ // Dropping sub-microsecond digits or the date needs an explicit CAST.
+ Seq(TimestampType, TimestampNTZType, AnyTimestampType, TimeType(), AnyTimeType).foreach {
+ shouldNotCast(nanos, _)
+ }
+ // DATE stays a direct target for date-valued functions.
+ shouldCast(nanos, DateType, DateType)
+ shouldCast(nanos, StringType, StringType)
+ // A TypeCollection fallback picks neither DATE nor TIME.
+ shouldNotCast(nanos, TypeCollection(NumericType, DateType, TimestampType, TimestampNTZType))
+ shouldNotCast(nanos, TypeCollection(NumericType, AnyTimeType))
+ shouldCast(nanos, TypeCollection(DateType, StringType), StringType)
+ shouldCast(nanos, TypeCollection(AnyTimestampType, AnyTimestampNanoType), nanos)
+ }
+
+ // Widening to a higher precision or the other family is kept.
+ shouldCast(TimestampType, TimestampLTZNanosType(9), TimestampLTZNanosType(9))
+ shouldCast(TimestampNTZNanosType(7), TimestampNTZNanosType(9), TimestampNTZNanosType(9))
+ shouldCast(TimestampNTZNanosType(9), TimestampLTZNanosType(9), TimestampLTZNanosType(9))
+ shouldCast(
+ TimestampLTZNanosType(8),
+ TypeCollection(DateType, TimestampLTZNanosType(9)),
+ TimestampLTZNanosType(9))
+ shouldNotCast(TimestampNTZNanosType(9), TimestampNTZNanosType(7))
+ shouldNotCast(TimestampLTZNanosType(9), TimestampNTZNanosType(8))
+
+ // The same holds inside arrays, maps and structs.
+ val ntz9 = TimestampNTZNanosType(9)
+ Seq(
+ ArrayType(TimeType()),
+ ArrayType(TimestampNTZType),
+ TypeCollection(ArrayType(DateType), ArrayType(TimeType()))).foreach {
+ shouldNotCast(ArrayType(ntz9), _)
+ }
+ shouldNotCast(MapType(StringType, ntz9), MapType(StringType, TimeType()))
+ shouldNotCast(MapType(ntz9, StringType), MapType(TimeType(), StringType))
+ shouldNotCast(new StructType().add("a", ntz9), new StructType().add("a", TimeType()))
+ shouldCast(ArrayType(ntz9), ArrayType(DateType), ArrayType(DateType))
+ shouldCast(
+ ArrayType(ntz9),
+ TypeCollection(ArrayType(DateType), ArrayType(StringType)),
+ ArrayType(StringType))
+ shouldCast(
+ MapType(ntz9, StringType),
+ TypeCollection(MapType(DateType, StringType), MapType(StringType, StringType)),
+ MapType(StringType, StringType))
+ shouldCast(ArrayType(TimestampNTZNanosType(7)), ArrayType(ntz9), ArrayType(ntz9))
+
+ // Micro timestamps are unchanged, including the DATE fallback.
+ shouldCast(TimestampType, AnyTimestampType, TimestampType)
+ shouldCast(TimestampNTZType, TypeCollection(NumericType, DateType), DateType)
+ }
+
+ test("implicit type cast - nanos arguments of functions without nanos support") {
+ val nanos = Literal.default(TimestampNTZNanosType(9))
+ Seq(
+ MonthsBetween(nanos, nanos, Literal(true)),
+ TimeTrunc(Literal("HOUR"), nanos),
+ new ApproximatePercentile(nanos, Literal(0.5))).foreach { e =>
+ ruleTest(implicitTypeCastsRule, e, e)
+ }
+ // A date-valued function still takes the nanos input as DATE.
+ ruleTest(implicitTypeCastsRule, LastDay(nanos), LastDay(Cast(nanos, DateType)))
+ }
+
test("type coercion for Concat") {
val rule = TypeCoercion.ConcatCoercion
diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/timestamp-ltz-nanos.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/timestamp-ltz-nanos.sql.out
index 7fc13a090b88..e72dbc89fb57 100644
--- a/sql/core/src/test/resources/sql-tests/analyzer-results/timestamp-ltz-nanos.sql.out
+++ b/sql/core/src/test/resources/sql-tests/analyzer-results/timestamp-ltz-nanos.sql.out
@@ -1730,3 +1730,633 @@ Project [timestampadd(NANOSECOND, cast(900 as bigint), 2019-12-31 16:00:00.00000
SELECT timestampadd(NANOSECOND, 1, TIMESTAMP_LTZ '2020-01-01 00:00:00 UTC')
-- !query analysis
[Analyzer test output redacted due to nondeterminism]
+
+
+-- !query
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999'\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999', TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 131,
+ "fragment" : "timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',\n TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')"
+ } ]
+}
+
+
+-- !query
+SELECT months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001'\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001', TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001', true)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 119,
+ "fragment" : "months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',\n TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001')"
+ } ]
+}
+
+
+-- !query
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"window(c, 1000000, 1000000, 0)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"sessionwindow(c, 1 second)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 36,
+ "fragment" : "session_window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT approx_percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"approx_percentile(c, 0.5, 10000)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 32,
+ "fragment" : "approx_percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"histogram_numeric(c, 2)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 30,
+ "fragment" : "histogram_numeric(c, 2)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile(c, 0.5, 1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 25,
+ "fragment" : "percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"median(c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 16,
+ "fragment" : "median(c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_cont(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_cont(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_disc(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_disc(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "second",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_trunc(HOUR, c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "time_trunc('HOUR', c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "third",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_diff(SECOND, TIME '12:00:00', c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 46,
+ "fragment" : "time_diff('SECOND', TIME '12:00:00', c)"
+ } ]
+}
+
+
+-- !query
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+Project [last_day(cast(c#x as date)) AS last_day(c)#x, next_day(cast(c#x as date), MO, true) AS next_day(c, MO)#x, datediff(cast(c#x as date), cast(2019-12-31 as date)) AS datediff(c, 2019-12-31)#x, add_months(cast(c#x as date), 1) AS add_months(c, 1)#x]
++- SubqueryAlias t
+ +- LocalRelation [c#x]
+
+
+-- !query
+SET spark.sql.ansi.enabled=false
+-- !query analysis
+SetCommand (spark.sql.ansi.enabled,Some(false))
+
+
+-- !query
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999'\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999', TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 131,
+ "fragment" : "timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',\n TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')"
+ } ]
+}
+
+
+-- !query
+SELECT months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001'\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001', TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001', true)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 119,
+ "fragment" : "months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',\n TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001')"
+ } ]
+}
+
+
+-- !query
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"window(c, 1000000, 1000000, 0)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"sessionwindow(c, 1 second)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 36,
+ "fragment" : "session_window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT approx_percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"approx_percentile(c, 0.5, 10000)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 32,
+ "fragment" : "approx_percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"histogram_numeric(c, 2)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 30,
+ "fragment" : "histogram_numeric(c, 2)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile(c, 0.5, 1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 25,
+ "fragment" : "percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"median(c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 16,
+ "fragment" : "median(c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_cont(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_cont(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_disc(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_disc(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "second",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_trunc(HOUR, c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "time_trunc('HOUR', c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "third",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_diff(SECOND, TIME '12:00:00', c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 46,
+ "fragment" : "time_diff('SECOND', TIME '12:00:00', c)"
+ } ]
+}
+
+
+-- !query
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+Project [last_day(cast(c#x as date)) AS last_day(c)#x, next_day(cast(c#x as date), MO, false) AS next_day(c, MO)#x, datediff(cast(c#x as date), cast(2019-12-31 as date)) AS datediff(c, 2019-12-31)#x, add_months(cast(c#x as date), 1) AS add_months(c, 1)#x]
++- SubqueryAlias t
+ +- LocalRelation [c#x]
+
+
+-- !query
+SET spark.sql.ansi.enabled=true
+-- !query analysis
+SetCommand (spark.sql.ansi.enabled,Some(true))
diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/timestamp-ntz-nanos.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/timestamp-ntz-nanos.sql.out
index 486c39e15c58..fbd770fea6f6 100644
--- a/sql/core/src/test/resources/sql-tests/analyzer-results/timestamp-ntz-nanos.sql.out
+++ b/sql/core/src/test/resources/sql-tests/analyzer-results/timestamp-ntz-nanos.sql.out
@@ -1699,3 +1699,633 @@ SELECT timestampadd(NANOSECOND, 50, '2020-01-01 00:00:00.0000001' :: timestamp_n
-- !query analysis
Project [timestampadd(NANOSECOND, cast(50 as bigint), cast(2020-01-01 00:00:00.0000001 as timestamp_ntz(7)), Some(America/Los_Angeles)) AS timestampadd(NANOSECOND, 50, CAST(2020-01-01 00:00:00.0000001 AS TIMESTAMP_NTZ(7)))#x]
+- OneRowRelation
+
+
+-- !query
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999'\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999', TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 131,
+ "fragment" : "timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',\n TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')"
+ } ]
+}
+
+
+-- !query
+SELECT months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001'\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001', TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001', true)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 119,
+ "fragment" : "months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',\n TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001')"
+ } ]
+}
+
+
+-- !query
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"window(c, 1000000, 1000000, 0)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"sessionwindow(c, 1 second)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 36,
+ "fragment" : "session_window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_approx(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"percentile_approx(c, 0.5, 10000)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 32,
+ "fragment" : "percentile_approx(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"histogram_numeric(c, 2)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 30,
+ "fragment" : "histogram_numeric(c, 2)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile(c, 0.5, 1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 25,
+ "fragment" : "percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"median(c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 16,
+ "fragment" : "median(c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_cont(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_cont(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_disc(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_disc(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "second",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_trunc(HOUR, c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "time_trunc('HOUR', c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "third",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_diff(SECOND, TIME '12:00:00', c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 46,
+ "fragment" : "time_diff('SECOND', TIME '12:00:00', c)"
+ } ]
+}
+
+
+-- !query
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+Project [last_day(cast(c#x as date)) AS last_day(c)#x, next_day(cast(c#x as date), MO, true) AS next_day(c, MO)#x, datediff(cast(c#x as date), cast(2019-12-31 as date)) AS datediff(c, 2019-12-31)#x, add_months(cast(c#x as date), 1) AS add_months(c, 1)#x]
++- SubqueryAlias t
+ +- LocalRelation [c#x]
+
+
+-- !query
+SET spark.sql.ansi.enabled=false
+-- !query analysis
+SetCommand (spark.sql.ansi.enabled,Some(false))
+
+
+-- !query
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999'\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999', TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 131,
+ "fragment" : "timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',\n TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')"
+ } ]
+}
+
+
+-- !query
+SELECT months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001')
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001'\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001', TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001', true)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 119,
+ "fragment" : "months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',\n TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001')"
+ } ]
+}
+
+
+-- !query
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"window(c, 1000000, 1000000, 0)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"sessionwindow(c, 1 second)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 36,
+ "fragment" : "session_window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_approx(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"percentile_approx(c, 0.5, 10000)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 32,
+ "fragment" : "percentile_approx(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"histogram_numeric(c, 2)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 30,
+ "fragment" : "histogram_numeric(c, 2)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile(c, 0.5, 1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 25,
+ "fragment" : "percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"median(c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 16,
+ "fragment" : "median(c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_cont(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_cont(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_disc(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_disc(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "second",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_trunc(HOUR, c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "time_trunc('HOUR', c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "third",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_diff(SECOND, TIME '12:00:00', c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 46,
+ "fragment" : "time_diff('SECOND', TIME '12:00:00', c)"
+ } ]
+}
+
+
+-- !query
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query analysis
+Project [last_day(cast(c#x as date)) AS last_day(c)#x, next_day(cast(c#x as date), MO, false) AS next_day(c, MO)#x, datediff(cast(c#x as date), cast(2019-12-31 as date)) AS datediff(c, 2019-12-31)#x, add_months(cast(c#x as date), 1) AS add_months(c, 1)#x]
++- SubqueryAlias t
+ +- LocalRelation [c#x]
+
+
+-- !query
+SET spark.sql.ansi.enabled=true
+-- !query analysis
+SetCommand (spark.sql.ansi.enabled,Some(true))
diff --git a/sql/core/src/test/resources/sql-tests/inputs/timestamp-ltz-nanos.sql b/sql/core/src/test/resources/sql-tests/inputs/timestamp-ltz-nanos.sql
index bab7bff9bdfd..44ac3ba021af 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/timestamp-ltz-nanos.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/timestamp-ltz-nanos.sql
@@ -602,3 +602,61 @@ SELECT timestampadd(NANOSECOND, -300, TIMESTAMP_LTZ '2020-01-01 00:00:00.0000001
SELECT timestampadd(NANOSECOND, 900, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000200 UTC');
-- NANOSECOND is rejected on a microsecond-precision timestamp (nanoseconds are unrepresentable).
SELECT timestampadd(NANOSECOND, 1, TIMESTAMP_LTZ '2020-01-01 00:00:00 UTC');
+
+-- Functions without TIMESTAMP_LTZ(p) support reject it in both ANSI modes instead of implicitly
+-- narrowing it to a microsecond timestamp, DATE or TIME. Date-valued functions still take it
+-- as DATE.
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001');
+SELECT months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001');
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT approx_percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SET spark.sql.ansi.enabled=false;
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001');
+SELECT months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001');
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT approx_percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SET spark.sql.ansi.enabled=true;
diff --git a/sql/core/src/test/resources/sql-tests/inputs/timestamp-ntz-nanos.sql b/sql/core/src/test/resources/sql-tests/inputs/timestamp-ntz-nanos.sql
index 0c61ac654fb7..4f3b03e50103 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/timestamp-ntz-nanos.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/timestamp-ntz-nanos.sql
@@ -595,3 +595,61 @@ SELECT timestampadd(NANOSECOND, 1, TIMESTAMP_NTZ '2020-01-01 00:00:00');
-- .0000001 value lands on .0000002, and a sub-step +50ns is truncated back to .0000001.
SELECT timestampadd(NANOSECOND, 150, '2020-01-01 00:00:00.0000001' :: timestamp_ntz(7));
SELECT timestampadd(NANOSECOND, 50, '2020-01-01 00:00:00.0000001' :: timestamp_ntz(7));
+
+-- Functions without TIMESTAMP_NTZ(p) support reject it in both ANSI modes instead of implicitly
+-- narrowing it to a microsecond timestamp, DATE or TIME. Date-valued functions still take it
+-- as DATE.
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001');
+SELECT months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001');
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_approx(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SET spark.sql.ansi.enabled=false;
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001');
+SELECT months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001');
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_approx(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c);
+SET spark.sql.ansi.enabled=true;
diff --git a/sql/core/src/test/resources/sql-tests/results/timestamp-ltz-nanos.sql.out b/sql/core/src/test/resources/sql-tests/results/timestamp-ltz-nanos.sql.out
index f1f6d75fac84..7cc84025007f 100644
--- a/sql/core/src/test/resources/sql-tests/results/timestamp-ltz-nanos.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/timestamp-ltz-nanos.sql.out
@@ -1869,3 +1869,685 @@ org.apache.spark.SparkIllegalArgumentException
"parameter" : "`unit`"
}
}
+
+
+-- !query
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999'\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999', TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 131,
+ "fragment" : "timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',\n TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')"
+ } ]
+}
+
+
+-- !query
+SELECT months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001'\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001', TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001', true)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 119,
+ "fragment" : "months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',\n TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001')"
+ } ]
+}
+
+
+-- !query
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"window(c, 1000000, 1000000, 0)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"sessionwindow(c, 1 second)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 36,
+ "fragment" : "session_window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT approx_percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"approx_percentile(c, 0.5, 10000)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 32,
+ "fragment" : "approx_percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"histogram_numeric(c, 2)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 30,
+ "fragment" : "histogram_numeric(c, 2)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile(c, 0.5, 1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 25,
+ "fragment" : "percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"median(c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 16,
+ "fragment" : "median(c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_cont(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_cont(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_disc(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_disc(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "second",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_trunc(HOUR, c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "time_trunc('HOUR', c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "third",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_diff(SECOND, TIME '12:00:00', c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 46,
+ "fragment" : "time_diff('SECOND', TIME '12:00:00', c)"
+ } ]
+}
+
+
+-- !query
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<last_day(c):date,next_day(c, MO):date,datediff(c, 2019-12-31):int,add_months(c, 1):date>
+-- !query output
+2020-01-31 2020-01-06 1 2020-02-01
+
+
+-- !query
+SET spark.sql.ansi.enabled=false
+-- !query schema
+struct<key:string,value:string>
+-- !query output
+spark.sql.ansi.enabled false
+
+
+-- !query
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999'\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999', TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 131,
+ "fragment" : "timestampdiff(MICROSECOND, TIMESTAMP_LTZ '2020-01-01 00:00:00.000000999',\n TIMESTAMP_LTZ '2020-01-01 00:00:00.000001001')"
+ } ]
+}
+
+
+-- !query
+SELECT months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001'\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001', TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001', true)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 119,
+ "fragment" : "months_between(TIMESTAMP_LTZ '2020-02-01 00:00:00.000000001',\n TIMESTAMP_LTZ '2020-01-01 00:00:00.000000001')"
+ } ]
+}
+
+
+-- !query
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"window(c, 1000000, 1000000, 0)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"sessionwindow(c, 1 second)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 36,
+ "fragment" : "session_window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT approx_percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"approx_percentile(c, 0.5, 10000)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 32,
+ "fragment" : "approx_percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"histogram_numeric(c, 2)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 30,
+ "fragment" : "histogram_numeric(c, 2)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile(c, 0.5, 1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 25,
+ "fragment" : "percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"median(c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 16,
+ "fragment" : "median(c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_cont(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_cont(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_disc(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_disc(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "second",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_trunc(HOUR, c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "time_trunc('HOUR', c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_LTZ(9)\"",
+ "paramIndex" : "third",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_diff(SECOND, TIME '12:00:00', c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 46,
+ "fragment" : "time_diff('SECOND', TIME '12:00:00', c)"
+ } ]
+}
+
+
+-- !query
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_LTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<last_day(c):date,next_day(c, MO):date,datediff(c, 2019-12-31):int,add_months(c, 1):date>
+-- !query output
+2020-01-31 2020-01-06 1 2020-02-01
+
+
+-- !query
+SET spark.sql.ansi.enabled=true
+-- !query schema
+struct<key:string,value:string>
+-- !query output
+spark.sql.ansi.enabled true
diff --git a/sql/core/src/test/resources/sql-tests/results/timestamp-ntz-nanos.sql.out b/sql/core/src/test/resources/sql-tests/results/timestamp-ntz-nanos.sql.out
index 738afcfe081b..b40f4f3a0107 100644
--- a/sql/core/src/test/resources/sql-tests/results/timestamp-ntz-nanos.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/timestamp-ntz-nanos.sql.out
@@ -1759,3 +1759,685 @@ SELECT timestampadd(NANOSECOND, 50, '2020-01-01 00:00:00.0000001' :: timestamp_n
struct<timestampadd(NANOSECOND, 50, CAST(2020-01-01 00:00:00.0000001 AS TIMESTAMP_NTZ(7))):timestamp_ntz(7)>
-- !query output
2020-01-01 00:00:00.0000001
+
+
+-- !query
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999'\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999', TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 131,
+ "fragment" : "timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',\n TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')"
+ } ]
+}
+
+
+-- !query
+SELECT months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001'\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001', TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001', true)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 119,
+ "fragment" : "months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',\n TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001')"
+ } ]
+}
+
+
+-- !query
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"window(c, 1000000, 1000000, 0)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"sessionwindow(c, 1 second)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 36,
+ "fragment" : "session_window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_approx(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"percentile_approx(c, 0.5, 10000)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 32,
+ "fragment" : "percentile_approx(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"histogram_numeric(c, 2)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 30,
+ "fragment" : "histogram_numeric(c, 2)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile(c, 0.5, 1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 25,
+ "fragment" : "percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"median(c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 16,
+ "fragment" : "median(c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_cont(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_cont(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_disc(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_disc(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "second",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_trunc(HOUR, c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "time_trunc('HOUR', c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "third",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_diff(SECOND, TIME '12:00:00', c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 46,
+ "fragment" : "time_diff('SECOND', TIME '12:00:00', c)"
+ } ]
+}
+
+
+-- !query
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<last_day(c):date,next_day(c, MO):date,datediff(c, 2019-12-31):int,add_months(c, 1):date>
+-- !query output
+2020-01-31 2020-01-06 1 2020-02-01
+
+
+-- !query
+SET spark.sql.ansi.enabled=false
+-- !query schema
+struct<key:string,value:string>
+-- !query output
+spark.sql.ansi.enabled false
+
+
+-- !query
+SELECT timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999'\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999', TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 131,
+ "fragment" : "timestampdiff(MICROSECOND, TIMESTAMP_NTZ '2020-01-01 00:00:00.000000999',\n TIMESTAMP_NTZ '2020-01-01 00:00:00.000001001')"
+ } ]
+}
+
+
+-- !query
+SELECT months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',
+ TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001')
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001'\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "\"TIMESTAMP\"",
+ "sqlExpr" : "\"months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001', TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001', true)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 119,
+ "fragment" : "months_between(TIMESTAMP_NTZ '2020-02-01 00:00:00.000000001',\n TIMESTAMP_NTZ '2020-01-01 00:00:00.000000001')"
+ } ]
+}
+
+
+-- !query
+SELECT window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"window(c, 1000000, 1000000, 0)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT session_window(c, '1 second')
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"STRUCT<start: TIMESTAMP, end: TIMESTAMP>\" or \"STRUCT<start: TIMESTAMP_NTZ, end: TIMESTAMP_NTZ>\")",
+ "sqlExpr" : "\"sessionwindow(c, 1 second)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 36,
+ "fragment" : "session_window(c, '1 second')"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_approx(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"percentile_approx(c, 0.5, 10000)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 32,
+ "fragment" : "percentile_approx(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT histogram_numeric(c, 2)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "(\"NUMERIC\" or \"DATE\" or \"TIMESTAMP\" or \"TIMESTAMP_NTZ\" or \"INTERVAL YEAR TO MONTH\" or \"INTERVAL DAY TO SECOND\" or \"TIME\")",
+ "sqlExpr" : "\"histogram_numeric(c, 2)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 30,
+ "fragment" : "histogram_numeric(c, 2)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile(c, 0.5)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile(c, 0.5, 1)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 25,
+ "fragment" : "percentile(c, 0.5)"
+ } ]
+}
+
+
+-- !query
+SELECT median(c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"median(c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 16,
+ "fragment" : "median(c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_cont(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_cont(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "first",
+ "requiredType" : "((\"NUMERIC\" or \"INTERVAL DAY TO SECOND\" or \"INTERVAL YEAR TO MONTH\") or \"TIME\")",
+ "sqlExpr" : "\"percentile_disc(c, 0.5)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 53,
+ "fragment" : "percentile_disc(0.5) WITHIN GROUP (ORDER BY c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_trunc('HOUR', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "second",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_trunc(HOUR, c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 28,
+ "fragment" : "time_trunc('HOUR', c)"
+ } ]
+}
+
+
+-- !query
+SELECT time_diff('SECOND', TIME '12:00:00', c)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<>
+-- !query output
+org.apache.spark.sql.catalyst.ExtendedAnalysisException
+{
+ "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE",
+ "sqlState" : "42K09",
+ "messageParameters" : {
+ "inputSql" : "\"c\"",
+ "inputType" : "\"TIMESTAMP_NTZ(9)\"",
+ "paramIndex" : "third",
+ "requiredType" : "\"TIME\"",
+ "sqlExpr" : "\"time_diff(SECOND, TIME '12:00:00', c)\""
+ },
+ "queryContext" : [ {
+ "objectType" : "",
+ "objectName" : "",
+ "startIndex" : 8,
+ "stopIndex" : 46,
+ "fragment" : "time_diff('SECOND', TIME '12:00:00', c)"
+ } ]
+}
+
+
+-- !query
+SELECT last_day(c), next_day(c, 'MO'), datediff(c, '2019-12-31'), add_months(c, 1)
+ FROM VALUES (TIMESTAMP_NTZ '2020-01-01 12:00:00.123456789') AS t(c)
+-- !query schema
+struct<last_day(c):date,next_day(c, MO):date,datediff(c, 2019-12-31):int,add_months(c, 1):date>
+-- !query output
+2020-01-31 2020-01-06 1 2020-02-01
+
+
+-- !query
+SET spark.sql.ansi.enabled=true
+-- !query schema
+struct<key:string,value:string>
+-- !query output
+spark.sql.ansi.enabled true
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/TimestampNanosFunctionsSuiteBase.scala b/sql/core/src/test/scala/org/apache/spark/sql/TimestampNanosFunctionsSuiteBase.scala
index a997c8362a1d..8de2e73c8dd8 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/TimestampNanosFunctionsSuiteBase.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/TimestampNanosFunctionsSuiteBase.scala
@@ -17,7 +17,7 @@
package org.apache.spark.sql
-import java.time.{Instant, LocalDateTime}
+import java.time.{Instant, LocalDateTime, LocalTime}
import org.apache.spark.{SparkConf, SparkException, SparkRuntimeException, SparkUnsupportedOperationException}
import org.apache.spark.sql.functions._
@@ -1046,6 +1046,40 @@ abstract class TimestampNanosFunctionsSuiteBase extends SharedSparkSession {
LocalDateTime.parse("2020-01-01T00:00:00.000000900"),
LocalDateTime.parse("2020-01-01T00:00:01.000000900"))))
}
+
+ test("typed Scala UDFs reject nanosecond inputs instead of narrowing them") {
+ val ldt = LocalDateTime.parse("2020-01-01T12:00:00.123456789")
+ val df = spark.createDataFrame(
+ spark.sparkContext.parallelize(Seq(Row(ldt, Seq(ldt)))),
+ new StructType()
+ .add("c", TimestampNTZNanosType(9))
+ .add("a", ArrayType(TimestampNTZNanosType(9))))
+ val toStr = udf((t: LocalDateTime) => t.toString)
+ val timesToStr = udf((ts: Seq[LocalTime]) => ts.mkString(","))
+ Seq(
+ (toStr(col("c")), "input", "\"TIMESTAMP_NTZ\"",
+ "- root class: \"java.time.LocalDateTime\""),
+ (timesToStr(col("a")), "array element", "\"TIME(6)\"",
+ "- array element class: \"java.time.LocalTime\"\n" +
+ "- root class: \"scala.collection.immutable.Seq\"")).foreach {
+ case (c, expression, to, typePath) =>
+ checkError(
+ exception = intercept[AnalysisException] {
+ df.select(c)
+ },
+ condition = "CANNOT_UP_CAST_DATATYPE",
+ parameters = Map(
+ "expression" -> expression,
+ "sourceType" -> "\"TIMESTAMP_NTZ(9)\"",
+ "targetType" -> to,
+ "details" -> (s"The type path of the target object is:\n$typePath\nYou can either " +
+ "add an explicit cast to the input data or choose a higher precision type of the " +
+ "field in the target object")))
+ }
+ // An explicit CAST still narrows.
+ checkAnswer(
+ df.select(toStr(col("c").cast(TimestampNTZType))), Row("2020-01-01T12:00:00.123456"))
+ }
}
// Runs the nanosecond timestamp function tests with ANSI mode enabled explicitly.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org