Yang Jie created SPARK-58506:
--------------------------------

             Summary: Assert Spark's own error contract in codegen compile 
failure tests
                 Key: SPARK-58506
                 URL: https://issues.apache.org/jira/browse/SPARK-58506
             Project: Spark
          Issue Type: Test
          Components: SQL
    Affects Versions: 5.0.0
            Reporter: Yang Jie


Two tests around codegen compile failures assert on the compiler's own 
diagnostic
wording instead of what Spark itself produces.

*{{CodeGeneratorWithInterpretedFallbackSuite}}*, test "codegen failures in the 
CODEGEN_ONLY
mode":

{code:scala}
assert(errMsg.contains("Failed to compile: 
org.codehaus.commons.compiler.CompileException:"))
{code}

The class name here is Janino's. What Spark owns on this path is the wrapping - 
a
source-level failure goes through {{QueryExecutionErrors.compilerError}}, whose 
checked
{{CompileException}} the compile cache wraps in an {{ExecutionException}} 
(SPARK-23711 /
SPARK-25140 established exactly this) - and the {{"Failed to compile: "}} 
prefix that
{{failedToCompileMsg}} prepends. Asserting the cause's type states that 
contract directly;
asserting the class name inside a message states it by accident.

*{{ObjectExpressionsSuite}}*, test "SPARK-23593: InitializeJavaBean should 
support
interpreted execution":

{code:scala}
checkExceptionInExpression[Exception](initializeWithNonexistingMethod,
  """A method named "nonexistent" is not declared in any enclosing class """ +
    "nor any supertype")
{code}

{{checkExceptionInExpression}} applies one substring to both the interpreted 
and the codegen
path, so this string has to match both. It does, but only because the two 
happen to overlap:
interpreted execution raises Spark's own {{INTERNAL_ERROR}} from
{{QueryExecutionErrors.methodNotDeclaredError}}, whose text is

{noformat}
[INTERNAL_ERROR] A method named "nonexistent" is not declared in any enclosing 
class nor any supertype SQLSTATE: XX000
{noformat}

while the codegen path fails in the Java compiler, which reports

{noformat}
org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 41, 
Column 12: Failed to compile: org.codehaus.commons.compiler.CompileException: 
File 'generated.java', Line 41, Column 12: A method named "nonexistent" is not 
declared in any enclosing class nor any supertype, nor through a static import
{noformat}

Janino's diagnostic is a superstring of Spark's sentence, so one assertion 
covers both legs.
Asserting each path against what raises it is more direct: the interpreted leg 
has an error
class, parameters and a sqlState that {{checkError}} can pin exactly, which is 
stronger than
the substring match it replaces.

The same test also has an assertion that never ran - the {{contains}} result is 
discarded:

{code:scala}
intercept[Exception] {
  evaluateWithoutCodegen(initializeWithWrongParamType, 
InternalRow.fromSeq(Seq()))
}.getMessage.contains(
  """A method named "setX" is not declared in any enclosing class """ +
    "nor any supertype")
{code}

It has been a bare expression since SPARK-23593 introduced it in 2018, so only 
"an exception
was thrown" was ever verified. That leg raises the same 
{{methodNotDeclaredError}}, so it can
use {{checkError}} as well.

Not in scope, found while auditing for similar sites: 
{{DataFrameSuite.scala}}'s ignored test
"SPARK-19372: Filter can be executed w/o generated code due to JVM code size 
limit" asserts
{{e.contains("grows beyond 64 KiB")}}, but Janino's string is {{Code grows 
beyond 64 KB}} - no
released version spells it {{KiB}}. The assertion is already stale and only 
survives because
the test is {{ignore}}d.




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