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]

Reply via email to