diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/higherOrderFunctions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/higherOrderFunctions.scala index 9f2e84a23006..2bb6b20b944d 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/higherOrderFunctions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/higherOrderFunctions.scala @@ -90,6 +90,8 @@ object LambdaFunction { */ trait HigherOrderFunction extends Expression with ExpectsInputTypes { + override def nullable: Boolean = arguments.exists(_.nullable) + override def children: Seq[Expression] = arguments ++ functions /** @@ -217,8 +219,6 @@ case class ArrayTransform( function: Expression) extends ArrayBasedSimpleHigherOrderFunction with CodegenFallback { - override def nullable: Boolean = argument.nullable - override def dataType: ArrayType = ArrayType(function.dataType, function.nullable) override def bind(f: (Expression, Seq[(DataType, Boolean)]) => LambdaFunction): ArrayTransform = { @@ -287,8 +287,6 @@ case class MapFilter( copy(function = f(function, (keyType, false) :: (valueType, valueContainsNull) :: Nil)) } - override def nullable: Boolean = argument.nullable - override def nullSafeEval(inputRow: InternalRow, argumentValue: Any): Any = { val m = argumentValue.asInstanceOf[MapData] val f = functionForEval @@ -328,8 +326,6 @@ case class ArrayFilter( function: Expression) extends ArrayBasedSimpleHigherOrderFunction with CodegenFallback { - override def nullable: Boolean = argument.nullable - override def dataType: DataType = argument.dataType override def functionType: AbstractDataType = BooleanType @@ -375,8 +371,6 @@ case class ArrayExists( function: Expression) extends ArrayBasedSimpleHigherOrderFunction with CodegenFallback { - override def nullable: Boolean = argument.nullable - override def dataType: DataType = BooleanType override def functionType: AbstractDataType = BooleanType @@ -516,8 +510,6 @@ case class TransformKeys( function: Expression) extends MapBasedSimpleHigherOrderFunction with CodegenFallback { - override def nullable: Boolean = argument.nullable - @transient lazy val MapType(keyType, valueType, valueContainsNull) = argument.dataType override def dataType: DataType = MapType(function.dataType, valueType, valueContainsNull) @@ -568,8 +560,6 @@ case class TransformValues( function: Expression) extends MapBasedSimpleHigherOrderFunction with CodegenFallback { - override def nullable: Boolean = argument.nullable - @transient lazy val MapType(keyType, valueType, valueContainsNull) = argument.dataType override def dataType: DataType = MapType(keyType, function.dataType, function.nullable) @@ -638,8 +628,6 @@ case class MapZipWith(left: Expression, right: Expression, function: Expression) override def functionTypes: Seq[AbstractDataType] = AnyDataType :: Nil - override def nullable: Boolean = left.nullable || right.nullable - override def dataType: DataType = MapType(keyType, function.dataType, function.nullable) override def bind(f: (Expression, Seq[(DataType, Boolean)]) => LambdaFunction): MapZipWith = { @@ -810,8 +798,6 @@ case class ZipWith(left: Expression, right: Expression, function: Expression) override def functionTypes: Seq[AbstractDataType] = AnyDataType :: Nil - override def nullable: Boolean = left.nullable || right.nullable - override def dataType: ArrayType = ArrayType(function.dataType, function.nullable) override def bind(f: (Expression, Seq[(DataType, Boolean)]) => LambdaFunction): ZipWith = {