vladimirg-db opened a new pull request, #58710:
URL: https://github.com/apache/spark/pull/58710

   ### What changes were proposed in this pull request?
   
   This change makes `ExtractGenerator` preserve SELECT-list order when it 
extracts independent
   generator expressions. A generator may still be extracted ahead of an 
earlier generator when the
   earlier generator has a direct or transitive lateral-column-alias dependency 
on a generator to its
   right.
   
   The internal configuration `spark.sql.generator.preserveSelectListOrder` 
defaults to `true` for the
   new behavior. Setting it to `false` restores the previous first-ready 
extraction behavior.
   
   ### Why are the changes needed?
   
   Generator extraction currently happens over multiple analyzer iterations. If 
a later generator's
   children resolve before an earlier generator's children, the later generator 
is extracted first.
   That changes the nesting and evaluation order of the resulting `Generate` 
operators. The difference
   is observable when generator inputs contain nondeterministic expressions or 
UDFs and can change query
   results.
   
   ### Does this PR introduce _any_ user-facing change?
   
   Yes. Independent generators are now evaluated in SELECT-list order by 
default. For example, with an
   identity UDF registered as `udf`:
   
   ```sql
   SELECT
     explode(array(sin(0) + udf(monotonically_increasing_id()))) AS left_value,
     explode(array(10, 20)) AS right_value;
   ```
   
   The new behavior returns `(0.0, 10)` and `(0.0, 20)`. The previous behavior 
could return
   `(0.0, 10)` and `(1.0, 20)` because the right generator was extracted first. 
Setting
   `spark.sql.generator.preserveSelectListOrder=false` restores the previous 
behavior.
   
   ### How was this patch tested?
   
   Added SQL golden tests for both configuration values. They cover Scala and 
Python UDFs,
   nondeterministic expressions, multiple generators, grouping analytics, 
direct and transitive
   lateral-column-alias dependencies, and a case combining all of them.
   
   ```bash
   build/sbt "sql/testOnly org.apache.spark.sql.SQLQueryTestSuite -- -z 
generators-resolution-edge-cases.sql"
   build/sbt "sql/testOnly org.apache.spark.sql.SQLQueryTestSuite -- -z 
generator-ordering"
   ```
   
   ### Was this patch authored or co-authored using generative AI tooling?
   
   Generated-by: Codex (GPT-5)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to