Github user cloud-fan commented on a diff in the pull request:
https://github.com/apache/spark/pull/19899#discussion_r155133805
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala
---
@@ -602,23 +602,36 @@ case class Least(children: Seq[Expression]) extends
Expression {
override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val evalChildren = children.map(_.genCode(ctx))
- ctx.addMutableState(ctx.JAVA_BOOLEAN, ev.isNull)
- ctx.addMutableState(ctx.javaType(dataType), ev.value)
- def updateEval(eval: ExprCode): String = {
+ val isNull = ctx.freshName("isNull")
+ ctx.addMutableState(ctx.JAVA_BOOLEAN, isNull)
+ val evals = evalChildren.map(eval =>
s"""
${eval.code}
- if (!${eval.isNull} && (${ev.isNull} ||
+ if (!${eval.isNull} && (${isNull} ||
${ctx.genGreater(dataType, ev.value, eval.value)})) {
- ${ev.isNull} = false;
+ $isNull = false;
${ev.value} = ${eval.value};
}
"""
- }
- val codes =
ctx.splitExpressionsWithCurrentInputs(evalChildren.map(updateEval))
+ )
+
+ val resultType = ctx.javaType(dataType)
+ val codes = ctx.splitExpressionsWithCurrentInputs(
+ expressions = evals,
+ funcName = "least",
+ extraArguments = Seq(resultType -> ev.value),
+ returnType = resultType,
+ makeSplitFunction = body =>
+ s"""
+ |$body
+ |return ${ev.value};
--- End diff --
```
$resultType ${ev.value} = default...
$body
$return ${ev.value}
```
We can use a local variable and avoid passing the parameter.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]