Skip to content

Commit 7f3529d

Browse files
committed
fix
1 parent 81c38f8 commit 7f3529d

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/ReplaceNullWithFalseInPredicate.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,12 @@ object ReplaceNullWithFalseInPredicate extends Rule[LogicalPlan] {
9393
val newBranches = cw.branches.map { case (cond, value) =>
9494
replaceNullWithFalse(cond) -> replaceNullWithFalse(value)
9595
}
96-
val newElseValue = cw.elseValue.map(replaceNullWithFalse)
97-
.orElse(if (newBranches.forall(_._2 == FalseLiteral)) Some(FalseLiteral) else None)
98-
CaseWhen(newBranches, newElseValue)
96+
if (newBranches.forall(_._2 == FalseLiteral) && cw.elseValue.isEmpty) {
97+
FalseLiteral
98+
} else {
99+
val newElseValue = cw.elseValue.map(replaceNullWithFalse)
100+
CaseWhen(newBranches, newElseValue)
101+
}
99102
case i @ If(pred, trueVal, falseVal) if i.dataType == BooleanType =>
100103
If(replaceNullWithFalse(pred), replaceNullWithFalse(trueVal), replaceNullWithFalse(falseVal))
101104
case e if e.dataType == BooleanType =>

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/expressions.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,8 +526,8 @@ object SimplifyConditionals extends Rule[LogicalPlan] with PredicateHelper {
526526
e.copy(branches = branches.take(i).map(branch => (branch._1, elseValue)))
527527
}
528528

529-
case e @ CaseWhen(branches, elseOpt)
530-
if elseOpt.isEmpty && branches.forall(_._2.semanticEquals(Literal(null, e.dataType))) =>
529+
case e @ CaseWhen(branches, None)
530+
if branches.forall(_._2.semanticEquals(Literal(null, e.dataType))) =>
531531
Literal(null, e.dataType)
532532
}
533533
}

sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/PushFoldableIntoBranchesSuite.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,22 @@ class PushFoldableIntoBranchesSuite
258258
EqualTo(CaseWhen(Seq((a, Literal(1)), (c, Literal(2))), None).cast(StringType), Literal("4")),
259259
CaseWhen(Seq((a, FalseLiteral), (c, FalseLiteral)), None))
260260
}
261+
262+
test("SPARK-33847: Remove the CaseWhen if elseValue is empty and other outputs are null") {
263+
assertEquivalent(
264+
EqualTo(CaseWhen(Seq((a, Literal.create(null, IntegerType)))), Literal(2)),
265+
Literal.create(null, BooleanType))
266+
assertEquivalent(
267+
EqualTo(CaseWhen(Seq((LessThan(Rand(1), Literal(0.5)), Literal.create(null, IntegerType)))),
268+
Literal(2)),
269+
Literal.create(null, BooleanType))
270+
271+
assertEquivalent(
272+
EqualTo(CaseWhen(Seq((a, Literal("str")))).cast(IntegerType), Literal(2)),
273+
Literal.create(null, BooleanType))
274+
assertEquivalent(
275+
EqualTo(CaseWhen(Seq((LessThan(Rand(1), Literal(0.5)), Literal("str")))).cast(IntegerType),
276+
Literal(2)),
277+
Literal.create(null, BooleanType))
278+
}
261279
}

0 commit comments

Comments
 (0)