diff --git a/connector/connect/client/jvm/src/test/scala/org/apache/spark/sql/ClientE2ETestSuite.scala b/connector/connect/client/jvm/src/test/scala/org/apache/spark/sql/ClientE2ETestSuite.scala index 10c928f130416..ee238c5492f91 100644 --- a/connector/connect/client/jvm/src/test/scala/org/apache/spark/sql/ClientE2ETestSuite.scala +++ b/connector/connect/client/jvm/src/test/scala/org/apache/spark/sql/ClientE2ETestSuite.scala @@ -85,6 +85,7 @@ class ClientE2ETestSuite extends RemoteSparkSession with SQLHelper with PrivateM |""".stripMargin) .collect() } + assert(ex.getErrorClass != null) if (enrichErrorEnabled) { assert(ex.getCause.isInstanceOf[DateTimeException]) } else { diff --git a/connector/connect/common/src/main/scala/org/apache/spark/sql/connect/client/GrpcExceptionConverter.scala b/connector/connect/common/src/main/scala/org/apache/spark/sql/connect/client/GrpcExceptionConverter.scala index 52bd276b0c4b5..810aeb010c0f3 100644 --- a/connector/connect/common/src/main/scala/org/apache/spark/sql/connect/client/GrpcExceptionConverter.scala +++ b/connector/connect/common/src/main/scala/org/apache/spark/sql/connect/client/GrpcExceptionConverter.scala @@ -168,7 +168,7 @@ private[client] object GrpcExceptionConverter { private[client] case class ErrorParams( message: String, cause: Option[Throwable], - // errorClass will only be set if the error is both enriched and SparkThrowable. + // errorClass will only be set if the error is SparkThrowable. errorClass: Option[String], // messageParameters will only be set if the error is both enriched and SparkThrowable. messageParameters: Map[String, String], @@ -367,14 +367,20 @@ private[client] object GrpcExceptionConverter { implicit val formats = DefaultFormats val classes = JsonMethods.parse(info.getMetadataOrDefault("classes", "[]")).extract[Array[String]] - - errorsToThrowable( - 0, - Seq( - FetchErrorDetailsResponse.Error + val errorClass = info.getMetadataOrDefault("errorClass", null) + val builder = FetchErrorDetailsResponse.Error + .newBuilder() + .setMessage(message) + .addAllErrorTypeHierarchy(classes.toImmutableArraySeq.asJava) + + if (errorClass != null) { + builder.setSparkThrowable( + FetchErrorDetailsResponse.SparkThrowable .newBuilder() - .setMessage(message) - .addAllErrorTypeHierarchy(classes.toImmutableArraySeq.asJava) - .build())) + .setErrorClass(errorClass) + .build()) + } + + errorsToThrowable(0, Seq(builder.build())) } }