You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Max Gekk (Jira)" <ji...@apache.org> on 2026/10/07 05:23:00 UTC
[jira] [Updated] (SPARK-60021) Label ExpandExec's outputs held in mutable state as global fields in codegen
[ https://issues.apache.org/jira/browse/SPARK-60021?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Max Gekk updated SPARK-60021:
-----------------------------
Affects Version/s: 4.2.0
4.1.3
4.3.0
(was: 5.0.0)
> Label ExpandExec's outputs held in mutable state as global fields in codegen
> ----------------------------------------------------------------------------
>
> Key: SPARK-60021
> URL: https://issues.apache.org/jira/browse/SPARK-60021
> Project: Spark
> Issue Type: Bug
> Components: SQL
> Affects Versions: 4.2.0, 4.3.0, 4.1.3
> Reporter: Max Gekk
> Priority: Major
>
> Since SPARK-35329, ExpandExec keeps its outputs in mutable state fields (addMutableState), which may be compacted into an array slot such as expand_mutableStateArray_0[k] for non-primitive types. But it labels them as local variables, JavaCode.isNullVariable(isNull) and JavaCode.variable(value, ...) in ExpandExec.doConsume, while every other producer that keeps its outputs in fields labels them isNullGlobal/global.
> As a result, CodegenContext.getLocalInputVariableValues takes such a slot as a local input, and a method split out of the stage (e.g. a subexpression elimination method) declares it as a parameter. No Java parameter can be named "array[i]", so the generated code fails to compile and the stage falls back to the non-codegen path (or fails when the fallback is off). For example, with Janino:
> ')' expected instead of '['
> Example query:
> CREATE TEMP VIEW t AS SELECT concat('a', CAST(id AS STRING)) AS a, concat('b', CAST(id AS STRING)) AS b FROM range(10);
> SELECT c,
> concat(upper(v), lower(v), reverse(v), trim(v), ltrim(v), rtrim(v), initcap(v), repeat(v, 2), lpad(v, 10, 'x'), rpad(v, 10, 'y')) AS x,
> concat(concat(upper(v), lower(v), reverse(v), trim(v), ltrim(v), rtrim(v), initcap(v), repeat(v, 2), lpad(v, 10, 'x'), rpad(v, 10, 'y')), 'z') AS y
> FROM t UNPIVOT (v FOR c IN (a, b));
> Released 4.1.3, 4.2.0 and 4.3.0 fail the same way.
> Proposed fix: label ExpandExec's outputs as JavaCode.isNullGlobal / JavaCode.global, so methods split out of the stage read them as fields. This came up in the review of https://github.com/apache/spark/pull/59225 (SPARK-33301), which currently works around it with a compacted-slot rule; once this is fixed, that PR can drop the workaround.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org