diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala index 18cc648e57d71..dbc477fe37923 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala @@ -1058,10 +1058,12 @@ trait ComplexTypeMergingExpression extends Expression { s" The input types found are\n\t${inputTypesForMerging.mkString("\n\t")}") } - override def dataType: DataType = { + private lazy val internalDataType: DataType = { dataTypeCheck inputTypesForMerging.reduceLeft(TypeCoercion.findCommonTypeDifferentOnlyInNullFlags(_, _).get) } + + override def dataType: DataType = internalDataType } /** diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/ApproximatePercentile.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/ApproximatePercentile.scala index d06eeeef23936..f77936d0b5c53 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/ApproximatePercentile.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/ApproximatePercentile.scala @@ -185,10 +185,12 @@ case class ApproximatePercentile( override def nullable: Boolean = true // The result type is the same as the input type. - override def dataType: DataType = { + private lazy val internalDataType: DataType = { if (returnPercentileArray) ArrayType(child.dataType, false) else child.dataType } + override def dataType: DataType = internalDataType + override def prettyName: String = getTagValue(FunctionRegistry.FUNC_ALIAS).getOrElse("percentile_approx") diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala index d9de72e1b217b..e0ce084885e0a 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala @@ -368,7 +368,7 @@ case class MapEntries(child: Expression) @transient private lazy val childDataType: MapType = child.dataType.asInstanceOf[MapType] - override def dataType: DataType = { + private lazy val internalDataType: DataType = { ArrayType( StructType( StructField("key", childDataType.keyType, false) :: @@ -377,6 +377,8 @@ case class MapEntries(child: Expression) false) } + override def dataType: DataType = internalDataType + override protected def nullSafeEval(input: Any): Any = { val childMap = input.asInstanceOf[MapData] val keys = childMap.keyArray() @@ -3498,13 +3500,16 @@ object ArrayUnion { since = "2.4.0") case class ArrayIntersect(left: Expression, right: Expression) extends ArrayBinaryLike with ComplexTypeMergingExpression { - override def dataType: DataType = { + + private lazy val internalDataType: DataType = { dataTypeCheck ArrayType(elementType, left.dataType.asInstanceOf[ArrayType].containsNull && right.dataType.asInstanceOf[ArrayType].containsNull) } + override def dataType: DataType = internalDataType + @transient lazy val evalIntersect: (ArrayData, ArrayData) => ArrayData = { if (TypeUtils.typeWithProperEquals(elementType)) { (array1, array2) => @@ -3741,11 +3746,13 @@ case class ArrayIntersect(left: Expression, right: Expression) extends ArrayBina case class ArrayExcept(left: Expression, right: Expression) extends ArrayBinaryLike with ComplexTypeMergingExpression { - override def dataType: DataType = { + private lazy val internalDataType: DataType = { dataTypeCheck left.dataType } + override def dataType: DataType = internalDataType + @transient lazy val evalExcept: (ArrayData, ArrayData) => ArrayData = { if (TypeUtils.typeWithProperEquals(elementType)) { (array1, array2) =>