From a67db05d2c1223af7d920cdcef0cd1aaf8bd329b Mon Sep 17 00:00:00 2001 From: Marco Gaido Date: Mon, 5 Mar 2018 17:47:26 +0100 Subject: [PATCH 1/2] [SPARK-23586][SQL] Add interpreted execution to WrapOption --- .../sql/catalyst/expressions/objects/objects.scala | 3 +-- .../expressions/ObjectExpressionsSuite.scala | 12 +++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects/objects.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects/objects.scala index 03cc8eaceb4e..d832fe0a6857 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects/objects.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects/objects.scala @@ -422,8 +422,7 @@ case class WrapOption(child: Expression, optType: DataType) override def inputTypes: Seq[AbstractDataType] = optType :: Nil - override def eval(input: InternalRow): Any = - throw new UnsupportedOperationException("Only code-generated evaluation is supported") + override def eval(input: InternalRow): Any = Option(child.eval(input)) override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = { val inputObject = child.genCode(ctx) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ObjectExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ObjectExpressionsSuite.scala index d95db5867b19..1c0cd798c5cc 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ObjectExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ObjectExpressionsSuite.scala @@ -20,7 +20,7 @@ package org.apache.spark.sql.catalyst.expressions import org.apache.spark.SparkFunSuite import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder -import org.apache.spark.sql.catalyst.expressions.objects.{Invoke, UnwrapOption} +import org.apache.spark.sql.catalyst.expressions.objects._ import org.apache.spark.sql.catalyst.util.{ArrayBasedMapData, GenericArrayData} import org.apache.spark.sql.types.{IntegerType, ObjectType} @@ -75,4 +75,14 @@ class ObjectExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper { checkEvaluation(unwrapObject, expected, InternalRow.fromSeq(Seq(input))) } } + + test("SPARK-23586: WrapOption should support interpreted execution") { + val cls = ObjectType(classOf[java.lang.Integer]) + val inputObject = BoundReference(0, cls, nullable = true) + val unwrapObject = WrapOption(inputObject, cls) + unwrapObject.resolved + Seq((1, Some(1)), (null, None)).foreach { case (input, expected) => + checkEvaluation(unwrapObject, expected, InternalRow.fromSeq(Seq(input))) + } + } } From 28e349e3fb2575ce4a44830521eaa7591ccb72c4 Mon Sep 17 00:00:00 2001 From: Marco Gaido Date: Mon, 5 Mar 2018 22:39:47 +0100 Subject: [PATCH 2/2] fix typo --- .../sql/catalyst/expressions/ObjectExpressionsSuite.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ObjectExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ObjectExpressionsSuite.scala index 1c0cd798c5cc..d535578a7eb0 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ObjectExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/ObjectExpressionsSuite.scala @@ -79,10 +79,9 @@ class ObjectExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper { test("SPARK-23586: WrapOption should support interpreted execution") { val cls = ObjectType(classOf[java.lang.Integer]) val inputObject = BoundReference(0, cls, nullable = true) - val unwrapObject = WrapOption(inputObject, cls) - unwrapObject.resolved + val wrapObject = WrapOption(inputObject, cls) Seq((1, Some(1)), (null, None)).foreach { case (input, expected) => - checkEvaluation(unwrapObject, expected, InternalRow.fromSeq(Seq(input))) + checkEvaluation(wrapObject, expected, InternalRow.fromSeq(Seq(input))) } } }