This is an automated email from the ASF dual-hosted git repository. maxgekk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push: new a7177f6f842 [SPARK-39432][SQL] Return ELEMENT_AT_BY_INDEX_ZERO from element_at(*, 0) a7177f6f842 is described below commit a7177f6f842270e75c6515f65aa667c8be4aab4b Author: panbingkun <pbk1...@gmail.com> AuthorDate: Mon Jun 27 09:35:59 2022 +0300 [SPARK-39432][SQL] Return ELEMENT_AT_BY_INDEX_ZERO from element_at(*, 0) ## What changes were proposed in this pull request? SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(0), (2) AS T(index); This should roll into ELEMENT_AT_BY_INDEX_ZERO. ### Why are the changes needed? element_at(*, 0) should return ELEMENT_AT_BY_INDEX_ZERO to unify errors representation for users. ### Does this PR introduce any user-facing change? Yes, it changes an user-facing error message. ### How was this patch tested? Add new UT & By running manual test: ```scala > sql("SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(0), (2) AS T(index)").collect() ``` throws error: ``` 19:20:13.012 ERROR org.apache.spark.executor.Executor: Exception in task 0.0 in stage 0.0 (TID 0) org.apache.spark.SparkRuntimeException: [ELEMENT_AT_BY_INDEX_ZERO] The index 0 is invalid. The indexes can be < 0 and > 0 (the first element has index 1). at org.apache.spark.sql.errors.QueryExecutionErrors$.elementAtByIndexZeroError(QueryExecutionErrors.scala:1203) at org.apache.spark.sql.errors.QueryExecutionErrors.elementAtByIndexZeroError(QueryExecutionErrors.scala) ... ``` Closes #36855 from panbingkun/SPARK-39432. Authored-by: panbingkun <pbk1...@gmail.com> Signed-off-by: Max Gekk <max.g...@gmail.com> --- core/src/main/resources/error/error-classes.json | 5 +++++ .../spark/sql/catalyst/expressions/collectionOperations.scala | 4 ++-- .../org/apache/spark/sql/errors/QueryExecutionErrors.scala | 5 +++-- .../sql/catalyst/expressions/CollectionExpressionsSuite.scala | 5 ----- .../src/test/resources/sql-tests/results/ansi/array.sql.out | 8 ++++---- .../resources/sql-tests/results/ansi/string-functions.sql.out | 4 ++-- .../resources/sql-tests/results/ansi/try_element_at.sql.out | 4 ++-- sql/core/src/test/resources/sql-tests/results/array.sql.out | 4 ++-- .../test/resources/sql-tests/results/string-functions.sql.out | 4 ++-- .../test/resources/sql-tests/results/try_element_at.sql.out | 4 ++-- .../apache/spark/sql/errors/QueryExecutionErrorsSuite.scala | 10 ++++++++++ 11 files changed, 34 insertions(+), 23 deletions(-) diff --git a/core/src/main/resources/error/error-classes.json b/core/src/main/resources/error/error-classes.json index f9257b6c21b..5395ab0e26e 100644 --- a/core/src/main/resources/error/error-classes.json +++ b/core/src/main/resources/error/error-classes.json @@ -70,6 +70,11 @@ ], "sqlState" : "23000" }, + "ELEMENT_AT_BY_INDEX_ZERO" : { + "message" : [ + "The index 0 is invalid. An index shall be either < 0 or > 0 (the first element has index 1)." + ] + }, "FAILED_EXECUTE_UDF" : { "message" : [ "Failed to execute user defined function (<functionName>: (<signature>) => <result>)" diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala index eac2c915d91..c74f8e1a685 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala @@ -2187,7 +2187,7 @@ case class ElementAt( } } else { val idx = if (index == 0) { - throw QueryExecutionErrors.sqlArrayIndexNotStartAtOneError() + throw QueryExecutionErrors.elementAtByIndexZeroError() } else if (index > 0) { index - 1 } else { @@ -2243,7 +2243,7 @@ case class ElementAt( | $indexOutOfBoundBranch |} else { | if ($index == 0) { - | throw QueryExecutionErrors.sqlArrayIndexNotStartAtOneError(); + | throw QueryExecutionErrors.elementAtByIndexZeroError(); | } else if ($index > 0) { | $index--; | } else { 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 657c7c74b9e..bfdf9942a57 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 @@ -1199,8 +1199,9 @@ private[sql] object QueryExecutionErrors extends QueryErrorsBase { "length must be greater than or equal to 0.") } - def sqlArrayIndexNotStartAtOneError(): ArrayIndexOutOfBoundsException = { - new ArrayIndexOutOfBoundsException("SQL array indices start at 1") + def elementAtByIndexZeroError(): SparkRuntimeException = { + new SparkRuntimeException(errorClass = "ELEMENT_AT_BY_INDEX_ZERO", + messageParameters = Array.empty) } def concatArraysWithElementsExceedLimitError(numberOfElements: Long): Throwable = { diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala index a8c4b16c7a0..c14a0839b1a 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CollectionExpressionsSuite.scala @@ -2345,11 +2345,6 @@ class CollectionExpressionsSuite extends SparkFunSuite with ExpressionEvalHelper } else { checkEvaluation(expr, null) } - - // SQL array indices start at 1 exception throws for both mode. - expr = ElementAt(array, Literal(0)) - val errMsg = "SQL array indices start at 1" - checkExceptionInExpression[Exception](expr, errMsg) } } } diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/array.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/array.sql.out index 6e2d2e478bc..8152dc25217 100644 --- a/sql/core/src/test/resources/sql-tests/results/ansi/array.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/ansi/array.sql.out @@ -188,8 +188,8 @@ select element_at(array(1, 2, 3), 0) -- !query schema struct<> -- !query output -java.lang.ArrayIndexOutOfBoundsException -SQL array indices start at 1 +org.apache.spark.SparkRuntimeException +[ELEMENT_AT_BY_INDEX_ZERO] The index 0 is invalid. An index shall be either < 0 or > 0 (the first element has index 1). -- !query @@ -378,8 +378,8 @@ select element_at(array(1, 2, 3), 0) -- !query schema struct<> -- !query output -java.lang.ArrayIndexOutOfBoundsException -SQL array indices start at 1 +org.apache.spark.SparkRuntimeException +[ELEMENT_AT_BY_INDEX_ZERO] The index 0 is invalid. An index shall be either < 0 or > 0 (the first element has index 1). -- !query diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/string-functions.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/string-functions.sql.out index 899135610fc..ffa600f66fd 100644 --- a/sql/core/src/test/resources/sql-tests/results/ansi/string-functions.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/ansi/string-functions.sql.out @@ -174,8 +174,8 @@ SELECT split_part('11.12.13', '.', 0) -- !query schema struct<> -- !query output -java.lang.ArrayIndexOutOfBoundsException -SQL array indices start at 1 +org.apache.spark.SparkRuntimeException +[ELEMENT_AT_BY_INDEX_ZERO] The index 0 is invalid. An index shall be either < 0 or > 0 (the first element has index 1). -- !query diff --git a/sql/core/src/test/resources/sql-tests/results/ansi/try_element_at.sql.out b/sql/core/src/test/resources/sql-tests/results/ansi/try_element_at.sql.out index c1c0980ea52..defac2ea5d6 100644 --- a/sql/core/src/test/resources/sql-tests/results/ansi/try_element_at.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/ansi/try_element_at.sql.out @@ -4,8 +4,8 @@ SELECT try_element_at(array(1, 2, 3), 0) -- !query schema struct<> -- !query output -java.lang.ArrayIndexOutOfBoundsException -SQL array indices start at 1 +org.apache.spark.SparkRuntimeException +[ELEMENT_AT_BY_INDEX_ZERO] The index 0 is invalid. An index shall be either < 0 or > 0 (the first element has index 1). -- !query diff --git a/sql/core/src/test/resources/sql-tests/results/array.sql.out b/sql/core/src/test/resources/sql-tests/results/array.sql.out index 78f4c85fa05..25bc001d3d6 100644 --- a/sql/core/src/test/resources/sql-tests/results/array.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/array.sql.out @@ -180,8 +180,8 @@ select element_at(array(1, 2, 3), 0) -- !query schema struct<> -- !query output -java.lang.ArrayIndexOutOfBoundsException -SQL array indices start at 1 +org.apache.spark.SparkRuntimeException +[ELEMENT_AT_BY_INDEX_ZERO] The index 0 is invalid. An index shall be either < 0 or > 0 (the first element has index 1). -- !query diff --git a/sql/core/src/test/resources/sql-tests/results/string-functions.sql.out b/sql/core/src/test/resources/sql-tests/results/string-functions.sql.out index faf6165a888..0ac05bb29c9 100644 --- a/sql/core/src/test/resources/sql-tests/results/string-functions.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/string-functions.sql.out @@ -166,8 +166,8 @@ SELECT split_part('11.12.13', '.', 0) -- !query schema struct<> -- !query output -java.lang.ArrayIndexOutOfBoundsException -SQL array indices start at 1 +org.apache.spark.SparkRuntimeException +[ELEMENT_AT_BY_INDEX_ZERO] The index 0 is invalid. An index shall be either < 0 or > 0 (the first element has index 1). -- !query diff --git a/sql/core/src/test/resources/sql-tests/results/try_element_at.sql.out b/sql/core/src/test/resources/sql-tests/results/try_element_at.sql.out index c1c0980ea52..defac2ea5d6 100644 --- a/sql/core/src/test/resources/sql-tests/results/try_element_at.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/try_element_at.sql.out @@ -4,8 +4,8 @@ SELECT try_element_at(array(1, 2, 3), 0) -- !query schema struct<> -- !query output -java.lang.ArrayIndexOutOfBoundsException -SQL array indices start at 1 +org.apache.spark.SparkRuntimeException +[ELEMENT_AT_BY_INDEX_ZERO] The index 0 is invalid. An index shall be either < 0 or > 0 (the first element has index 1). -- !query diff --git a/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryExecutionErrorsSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryExecutionErrorsSuite.scala index ff269271ebc..8bf90d43565 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryExecutionErrorsSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryExecutionErrorsSuite.scala @@ -639,6 +639,16 @@ class QueryExecutionErrorsSuite sqlState = None, matchPVals = true) } + + test("ELEMENT_AT_BY_INDEX_ZERO: element_at from array by index zero") { + checkError( + exception = intercept[SparkRuntimeException]( + sql("select element_at(array(1, 2, 3, 4, 5), 0)").collect() + ), + errorClass = "ELEMENT_AT_BY_INDEX_ZERO", + Map.empty + ) + } } class FakeFileSystemSetPermission extends LocalFileSystem { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org