You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@spark.apache.org by GitBox <gi...@apache.org> on 2022/08/16 17:07:28 UTC

[GitHub] [spark] MaxGekk commented on a diff in pull request #37520: [SPARK-40098][SQL] Format error messages in the Thrift Server

MaxGekk commented on code in PR #37520:
URL: https://github.com/apache/spark/pull/37520#discussion_r947039507


##########
core/src/main/scala/org/apache/spark/SparkThrowableHelper.scala:
##########
@@ -135,4 +143,41 @@ private[spark] object SparkThrowableHelper {
   def isInternalError(errorClass: String): Boolean = {
     errorClass == "INTERNAL_ERROR"
   }
+
+  def getMessage(e: SparkThrowable with Throwable, format: ErrorMessageFormat.Value): String = {
+    import ErrorMessageFormat._
+    format match {
+      case PRETTY => e.getMessage
+      case MINIMAL | STANDARD if e.getErrorClass == null =>
+        val jValue = ("errorClass" -> "legacy") ~
+          ("messageParameters" -> JObject(List("message" -> JString(e.getMessage)))) ~
+          ("queryContext" -> JArray(List.empty))
+        compact(render(jValue))
+      case MINIMAL | STANDARD =>
+        val errorClass = e.getErrorClass
+        val message = if (format == STANDARD) {
+          val errorInfo = errorClassToInfoMap.getOrElse(errorClass,
+            throw new IllegalArgumentException(s"Cannot find error class '$errorClass'"))
+          Some(errorInfo.messageFormat)
+        } else None
+        assert(e.getParameterNames.size == e.getMessageParameters.size,
+          "Number of message parameter names and values must be the same")
+        val jValue = ("errorClass" -> errorClass) ~
+          ("errorSubClass" -> Option(e.getErrorSubClass)) ~
+          ("message" -> message) ~
+          ("sqlState" -> Option(e.getSqlState)) ~
+          ("messageParameters" ->
+            JObject((e.getParameterNames zip e.getMessageParameters.map(JString)).toList)) ~
+          ("queryContext" -> JArray(
+            e.getQueryContext.map(c => JObject(
+              "objectType" -> JString(c.objectType()),
+              "objectName" -> JString(c.objectName()),
+              "startIndex" -> JInt(c.startIndex()),
+              "stopIndex" -> JInt(c.stopIndex()),
+              "fragment" -> JString(c.fragment()))).toList)
+          )
+        val rendered = render(jValue)
+        if (format == MINIMAL) compact(rendered) else pretty(rendered)

Review Comment:
   I supposed that minimal means minimal size of result JSON that will be parsed machinery. What's the use case for the MINIMAL form from your point of view. Do you mean that it could improve readability of golden files?



-- 
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: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org