diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/urlExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/urlExpressions.scala index 47b37a5edeba8..0dd14d313e17e 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/urlExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/urlExpressions.scala @@ -115,7 +115,7 @@ object UrlCodec { UTF8String.fromString(URLDecoder.decode(src.toString, enc.toString)) } catch { case e: IllegalArgumentException => - throw QueryExecutionErrors.illegalUrlError(src) + throw QueryExecutionErrors.illegalUrlError(src, e) } } } diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryExecutionErrors.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryExecutionErrors.scala index f4968cd005708..798146839464c 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryExecutionErrors.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryExecutionErrors.scala @@ -372,10 +372,11 @@ private[sql] object QueryExecutionErrors extends QueryErrorsBase with ExecutionE cause = e) } - def illegalUrlError(url: UTF8String): Throwable = { + def illegalUrlError(url: UTF8String, e: IllegalArgumentException): Throwable = { new SparkIllegalArgumentException( errorClass = "CANNOT_DECODE_URL", - messageParameters = Map("url" -> url.toString) + messageParameters = Map("url" -> url.toString), + cause = e ) } diff --git a/sql/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala index 4709c2b5e192c..fa1a64460fcb4 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala @@ -17,7 +17,7 @@ package org.apache.spark.sql -import org.apache.spark.{SPARK_DOC_ROOT, SparkRuntimeException} +import org.apache.spark.{SPARK_DOC_ROOT, SparkIllegalArgumentException, SparkRuntimeException} import org.apache.spark.sql.catalyst.expressions.Cast._ import org.apache.spark.sql.execution.FormattedMode import org.apache.spark.sql.functions._ @@ -1191,4 +1191,13 @@ class StringFunctionsSuite extends QueryTest with SharedSparkSession { ) ) } + + test("SPARK-48806: url_decode exception") { + val e = intercept[SparkIllegalArgumentException] { + sql("select url_decode('https%3A%2F%2spark.apache.org')").collect() + } + assert(e.getCause.isInstanceOf[IllegalArgumentException] && + e.getCause.getMessage + .startsWith("URLDecoder: Illegal hex characters in escape (%) pattern - ")) + } }