From 5ad7538300ce7a15e0262846d89c0d274ed2db6c Mon Sep 17 00:00:00 2001 From: Liang-Chi Hsieh Date: Fri, 13 Sep 2019 09:03:03 -0700 Subject: [PATCH] Fix compilation error when input set is empty. --- .../sql/catalyst/expressions/predicates.scala | 18 +++++++++++++----- .../catalyst/expressions/PredicateSuite.scala | 6 ++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala index 7ce113120e4c6..4c0998412f729 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala @@ -457,17 +457,25 @@ case class InSet(child: Expression, hset: Set[Any]) extends UnaryExpression with break; """) + val switchCode = if (caseBranches.size > 0) { + code""" + switch (${valueGen.value}) { + ${caseBranches.mkString("\n")} + default: + ${ev.isNull} = $hasNull; + } + """ + } else { + s"${ev.isNull} = $hasNull;" + } + ev.copy(code = code""" ${valueGen.code} ${CodeGenerator.JAVA_BOOLEAN} ${ev.isNull} = ${valueGen.isNull}; ${CodeGenerator.JAVA_BOOLEAN} ${ev.value} = false; if (!${valueGen.isNull}) { - switch (${valueGen.value}) { - ${caseBranches.mkString("\n")} - default: - ${ev.isNull} = $hasNull; - } + $switchCode } """) } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/PredicateSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/PredicateSuite.scala index 7bff277c793ea..b05e49ea33015 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/PredicateSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/PredicateSuite.scala @@ -560,4 +560,10 @@ class PredicateSuite extends SparkFunSuite with ExpressionEvalHelper { assert(msg.contains("argument 1 requires boolean type")) } } + + test("SPARK-29100: InSet with empty input set") { + val row = create_row(1) + val inSet = InSet(BoundReference(0, IntegerType, true), Set.empty) + checkEvaluation(inSet, false, row) + } }