Skip to content

Commit 2e98677

Browse files
committed
fix code gen for divide 0
1 parent 85c28ba commit 2e98677

File tree

1 file changed

+18
-3
lines changed
  • sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen

1 file changed

+18
-3
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/CodeGenerator.scala

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -359,9 +359,24 @@ abstract class CodeGenerator[InType <: AnyRef, OutType <: AnyRef] extends Loggin
359359
case Add(e1, e2) => (e1, e2) evaluate { case (eval1, eval2) => q"$eval1 + $eval2" }
360360
case Subtract(e1, e2) => (e1, e2) evaluate { case (eval1, eval2) => q"$eval1 - $eval2" }
361361
case Multiply(e1, e2) => (e1, e2) evaluate { case (eval1, eval2) => q"$eval1 * $eval2" }
362-
case Divide(e1, e2) => (e1, e2) evaluate {
363-
case (eval1, eval2) => q"if ($eval2 == 0) null else $eval1 / $eval2"
364-
}
362+
case Divide(e1, e2) =>
363+
val eval1 = expressionEvaluator(e1)
364+
val eval2 = expressionEvaluator(e2)
365+
366+
eval1.code ++ eval2.code ++
367+
q"""
368+
var $nullTerm = false
369+
var $primitiveTerm: ${termForType(e1.dataType)} = 0
370+
371+
if (${eval1.nullTerm} || ${eval2.nullTerm} ) {
372+
$nullTerm = true
373+
} else if (${eval2.primitiveTerm} == 0)
374+
$nullTerm = true
375+
else {
376+
$nullTerm = false
377+
$primitiveTerm = ${eval1.primitiveTerm} / ${eval2.primitiveTerm}
378+
}
379+
""".children
365380

366381
case IsNotNull(e) =>
367382
val eval = expressionEvaluator(e)

0 commit comments

Comments
 (0)