Skip to content
Prev Previous commit
Next Next commit
Bug fix
  • Loading branch information
wankunde committed May 9, 2023
commit f152b2aaa64cd2f0803cbd8f27a2190414314678
Original file line number Diff line number Diff line change
Expand Up @@ -196,30 +196,36 @@ abstract class Expression extends TreeNode[Expression] {
}.getOrElse {
val isNull = ctx.freshName("isNull")
val value = ctx.freshName("value")
val exprKey = ExpressionEquals(this)
val eval = ctx.commonExpressions.get(exprKey) match {
case Some(stats) =>
// We should reuse the currentVar references which code is not empty
val nonEmptyRefs = this.exists {
case BoundReference(ordinal, _, _) =>
ctx.currentVars != null && ctx.currentVars(ordinal) != null &&
ctx.currentVars(ordinal).code != EmptyBlock
case _ => false
}
val eval = doGenCode(ctx, ExprCode(
JavaCode.isNullVariable(isNull),
JavaCode.variable(value, dataType)))
if (eval.code != EmptyBlock && !nonEmptyRefs) {
ctx.genReusedCode(stats, eval)
} else {
eval
}
val eval =
if (EquivalentExpressions.supportedExpression(this)) {
ctx.commonExpressions.get(ExpressionEquals(this)) match {
case Some(stats) =>
// We should reuse the currentVar references which code is not empty
val nonEmptyRefs = this.exists {
case BoundReference(ordinal, _, _) =>
ctx.currentVars != null && ctx.currentVars(ordinal) != null &&
ctx.currentVars(ordinal).code != EmptyBlock
case _ => false
}
val eval = doGenCode(ctx, ExprCode(
JavaCode.isNullVariable(isNull),
JavaCode.variable(value, dataType)))
if (eval.code != EmptyBlock && !nonEmptyRefs) {
ctx.genReusedCode(stats, eval)
} else {
eval
}

case None =>
case None =>
doGenCode(ctx, ExprCode(
JavaCode.isNullVariable(isNull),
JavaCode.variable(value, dataType)))
}
} else {
doGenCode(ctx, ExprCode(
JavaCode.isNullVariable(isNull),
JavaCode.variable(value, dataType)))
}
}
reduceCodeSize(ctx, eval)
if (eval.code.toString.nonEmpty) {
// Add `this` in the comment.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -680,12 +680,12 @@ case class WholeStageCodegenExec(child: SparkPlan)(val codegenStageId: Int)
// If the input attributes changed, collect current common expressions and clear
// equivalentExpressions
if (attributeSeq.size != newAttributeSeq.size ||
attributeSeq.zip(newAttributeSeq).exists(tup => !tup._1.equals(tup._2))) {
attributeSeq.zip(newAttributeSeq).exists { case (left, right) => left != right }) {
equivalence = new EquivalentExpressions
}
if (newReusableExpressions.nonEmpty) {
val bondExpressions =
BindReferences.bindReferences(newReusableExpressions, newAttributeSeq.toSeq)
BindReferences.bindReferences(newReusableExpressions, newAttributeSeq)
executeSeq += ((c, bondExpressions, equivalence))
ctx.wholeStageSubexpressionElimination(bondExpressions, equivalence)
}
Expand Down