Max Gekk created SPARK-59764:
--------------------------------

             Summary: BenchmarkQueryTest.checkGeneratedCode checks nothing 
under adaptive query execution
                 Key: SPARK-59764
                 URL: https://issues.apache.org/jira/browse/SPARK-59764
             Project: Spark
          Issue Type: Test
          Components: SQL
    Affects Versions: 5.0.0
            Reporter: Max Gekk


{{BenchmarkQueryTest.checkGeneratedCode}} is meant to check that every 
whole-stage codegen subtree of a benchmark query compiles and that its largest 
generated method is within {{CodeGenerator.DEFAULT_JVM_HUGE_METHOD_LIMIT}} 
(8000 bytes, HotSpot's {{HugeMethodLimit}}). {{TPCDSQuerySuite}} (and 
{{TPCDSQueryWithStatsSuite}}, {{TPCDSQueryANSISuite}}), {{TPCHQuerySuite}} and 
{{SSBQuerySuite}} call it on {{sql(query).queryExecution.executedPlan}}.

Since adaptive query execution became the default (SPARK-33679, 3.2.0), that 
plan is an {{AdaptiveSparkPlanExec}}, a leaf node whose query stages, and so 
its {{WholeStageCodegenExec}} nodes, are created only when the query runs. The 
suites never run the queries, so the {{plan foreach}} walk in 
{{checkGeneratedCode}} finds no {{WholeStageCodegenExec}} and the method 
returns without compiling or checking anything. The tests pass vacuously.

Evidence: walking the same way as {{checkGeneratedCode}} (the plan plus its 
subqueries) over all TPC-DS v1.4 (103), v2.7 (32) and modified (21) queries and 
all 22 TPC-H queries finds 0 whole-stage stages with 
{{spark.sql.adaptive.enabled=true}}. With {{spark.sql.adaptive.enabled=false}} 
the same walk finds about 1,700 TPC-DS stages (without injected statistics) and 
126 TPC-H stages, and exactly one of them is past 8000 bytes: {{modified-q3}}'s 
stage (12214 bytes; 12167 with injected statistics), which the suite already 
excludes as SPARK-29128.

Two consequences:
* The "can be properly compiled" check and the method size check have not run 
since 3.2.0, so a codegen regression in these queries would not be caught here.
* The workarounds in {{TPCDSQuerySuite}} guard an assertion that does not run. 
{{spark.sql.readSideCharPadding=false}} ("so that the generated code is less 
than 8000") is not needed with AQE off either: padding changes the largest 
method of some queries by at most about 500 bytes, and none crosses 8000.

Proposed fix: set {{spark.sql.adaptive.enabled=false}} in 
{{BenchmarkQueryTest}}'s {{sparkConf}}, since these suites only compile plans, 
and assert that at least one {{WholeStageCodegenExec}} was found, so the check 
cannot become vacuous again. Keep the {{modified-q3}} exclusion, and consider 
dropping the char padding override.




--
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