Yang Jie created SPARK-59589:
--------------------------------

             Summary: Hand Expand's varying output columns to the consumer as 
globals
                 Key: SPARK-59589
                 URL: https://issues.apache.org/jira/browse/SPARK-59589
             Project: Spark
          Issue Type: Improvement
          Components: SQL
    Affects Versions: 5.0.0
            Reporter: Yang Jie


{{ExpandExec.doConsume}} allocates a mutable state for each output column that 
varies across the Expand's branches, and hands it to the consumer as 
{{JavaCode.variable(value, dataType)}}.

{{CodegenContext.addMutableState}} returns a field of the generated class: a 
name of its own when it can inline the type, otherwise a slot in a compacted 
array, e.g. {{mutableStateArray_0[3]}}. Either form is reachable from every 
method of that class, and neither is a local variable, which is what 
{{JavaCode.global}} says and {{JavaCode.variable}} does not.

The difference is not cosmetic. {{CodeGenerator.getLocalInputVariableValues}} 
collects the {{VariableValue}}s of an operator's input so that a caller can 
pass them into a split function -- used by 
{{AggregateCodegenSupport.splitAggregateExpressions}} and by 
{{CommonExprSlots.fill}} (SPARK-59295). Taking a field for a local variable 
adds a parameter that shadows the field, and for the compacted form the 
parameter name is a slot expression, which does not compile. SPARK-59295 had to 
add an "is this a Java identifier" check on the candidate parameters partly for 
this source.

Whole-stage subexpression elimination already wraps its own {{addMutableState}} 
results with {{JavaCode.global}} / {{JavaCode.isNullGlobal}} 
({{CodeGenerator.subexpressionEliminationForWholeStageCodegen}}), so this makes 
{{ExpandExec}} consistent with it.

No query is known to reach the bad parameter today: with a consume function per 
operator (the default) the value is passed as an argument to a fresh parameter, 
and the shapes tried without it -- CUBE over string columns, and a regular 
aggregate over a varying string column under a distinct rewrite -- do not put 
the slot in a parameter list. This is a latent trap rather than an observed 
failure.




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to