davidm-db commented on code in PR #47537: URL: https://github.com/apache/spark/pull/47537#discussion_r1697237880
########## sql/catalyst/src/main/scala/org/apache/spark/sql/errors/SqlScriptingException.scala: ########## @@ -17,40 +17,77 @@ package org.apache.spark.sql.errors -import org.apache.spark.SparkException +import org.apache.spark.{SparkException, SparkThrowableHelper} +import org.apache.spark.sql.catalyst.trees.Origin +import org.apache.spark.sql.errors.SqlScriptingException.errorMessageWithLineNumber + +class SqlScriptingException protected ( + origin: Origin, + errorClass: String, + cause: Throwable, + messageParameters: Map[String, String] = Map.empty) + extends SparkException( + message = errorMessageWithLineNumber(origin, errorClass, messageParameters), + errorClass = Option(errorClass), + cause = cause, + messageParameters = messageParameters + ) { + +} /** * Object for grouping error messages thrown during parsing/interpreting phase * of the SQL Scripting Language interpreter. */ -private[sql] object SqlScriptingErrors extends QueryErrorsBase { +private[sql] object SqlScriptingException { - def labelsMismatch(beginLabel: String, endLabel: String): Throwable = { - new SparkException( + def labelsMismatch(origin: Origin, beginLabel: String, endLabel: String): Throwable = { + new SqlScriptingException( + origin = origin, errorClass = "LABELS_MISMATCH", cause = null, messageParameters = Map("beginLabel" -> beginLabel, "endLabel" -> endLabel)) } - def endLabelWithoutBeginLabel(endLabel: String): Throwable = { - new SparkException( + def endLabelWithoutBeginLabel(origin: Origin, endLabel: String): Throwable = { + new SqlScriptingException( + origin = origin, errorClass = "END_LABEL_WITHOUT_BEGIN_LABEL", cause = null, messageParameters = Map("endLabel" -> endLabel)) } - def variableDeclarationNotAllowedInScope(varName: String, lineNumber: String): Throwable = { - new SparkException( + def variableDeclarationNotAllowedInScope( + origin: Origin, + varName: String, + lineNumber: String + ): Throwable = { + new SqlScriptingException( + origin = origin, errorClass = "INVALID_VARIABLE_DECLARATION.NOT_ALLOWED_IN_SCOPE", cause = null, messageParameters = Map("varName" -> varName, "lineNumber" -> lineNumber)) } - def variableDeclarationOnlyAtBeginning(varName: String, lineNumber: String): Throwable = { - new SparkException( + def variableDeclarationOnlyAtBeginning( + origin: Origin, + varName: String, + lineNumber: String + ): Throwable = { + new SqlScriptingException( + origin = origin, errorClass = "INVALID_VARIABLE_DECLARATION.ONLY_AT_BEGINNING", cause = null, messageParameters = Map("varName" -> varName, "lineNumber" -> lineNumber)) } + private def errorMessageWithLineNumber( + origin: Origin, + errorClass: String, + messageParameters: Map[String, String] + ): String = { + val prefix = if (origin.line.isEmpty) "" else s"[LINE:${origin.line.get}] " Review Comment: with `Options`, this line can be simplified and written in a more "functional" manner, something like: `val lineNumberPrefix = origin.line.map(l => s"[LINE:${l}] ").getOrElse("")` -- 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-unsubscr...@spark.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org For additional commands, e-mail: reviews-h...@spark.apache.org