This is an automated email from the ASF dual-hosted git repository.
wenchen pushed a commit to branch branch-3.2
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-3.2 by this push:
new 00c2037 [SPARK-38304][SQL] Elt() should return null if index is null
under ANSI mode
00c2037 is described below
commit 00c2037ce01599022ed00cf022335f7b98453fcd
Author: Gengliang Wang <[email protected]>
AuthorDate: Wed Feb 23 23:19:56 2022 +0800
[SPARK-38304][SQL] Elt() should return null if index is null under ANSI mode
Elt() should return null if the input index is null under ANSI mode, which
is consistent with MySQL where the function is from.
Before changes:
<img width="824" alt="image"
src="https://user-images.githubusercontent.com/1097932/155308033-2e47b49a-b98b-4fd6-b1f1-d89762452fba.png">
After changes:
The query returns null.
Bug fix
Yes, SQL function Elt() returns null if the input index is null under ANSI
mode, instead of runtime error.
UT
Closes #35629 from gengliangwang/fixEltErrorMsg.
Authored-by: Gengliang Wang <[email protected]>
Signed-off-by: Wenchen Fan <[email protected]>
(cherry picked from commit a2448a4068d255fac951be2dcf36db08145533e7)
Signed-off-by: Wenchen Fan <[email protected]>
---
.../catalyst/expressions/stringExpressions.scala | 22 ++++++++------
.../src/test/resources/sql-tests/inputs/array.sql | 4 +++
.../resources/sql-tests/results/ansi/array.sql.out | 34 +++++++++++++++++++++-
.../test/resources/sql-tests/results/array.sql.out | 34 +++++++++++++++++++++-
4 files changed, 83 insertions(+), 11 deletions(-)
diff --git
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
index 33b4af8..80f05c2 100755
---
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
+++
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
@@ -359,15 +359,19 @@ case class Elt(
ev.copy(
code"""
|${index.code}
- |final int $indexVal = ${index.value};
- |${CodeGenerator.JAVA_BOOLEAN} $indexMatched = false;
- |$inputVal = null;
- |do {
- | $codes
- |} while (false);
- |$indexOutOfBoundBranch
- |final ${CodeGenerator.javaType(dataType)} ${ev.value} = $inputVal;
- |final boolean ${ev.isNull} = ${ev.value} == null;
+ |boolean ${ev.isNull} = ${index.isNull};
+ |${CodeGenerator.javaType(dataType)} ${ev.value} = null;
+ |if (!${index.isNull}) {
+ | final int $indexVal = ${index.value};
+ | ${CodeGenerator.JAVA_BOOLEAN} $indexMatched = false;
+ | $inputVal = null;
+ | do {
+ | $codes
+ | } while (false);
+ | $indexOutOfBoundBranch
+ | ${ev.value} = $inputVal;
+ | ${ev.isNull} = ${ev.value} == null;
+ |}
""".stripMargin)
}
diff --git a/sql/core/src/test/resources/sql-tests/inputs/array.sql
b/sql/core/src/test/resources/sql-tests/inputs/array.sql
index f73b653..0223ce5 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/array.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/array.sql
@@ -99,6 +99,10 @@ select element_at(array(1, 2, 3), 0);
select elt(4, '123', '456');
select elt(0, '123', '456');
select elt(-1, '123', '456');
+select elt(null, '123', '456');
+select elt(null, '123', null);
+select elt(1, '123', null);
+select elt(2, '123', null);
select array(1, 2, 3)[5];
select array(1, 2, 3)[-1];
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 a029a28..52f65ae 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
@@ -1,5 +1,5 @@
-- Automatically generated by SQLQueryTestSuite
--- Number of queries: 20
+-- Number of queries: 24
-- !query
@@ -217,6 +217,38 @@ Invalid index: -1, numElements: 2
-- !query
+select elt(null, '123', '456')
+-- !query schema
+struct<elt(NULL, 123, 456):string>
+-- !query output
+NULL
+
+
+-- !query
+select elt(null, '123', null)
+-- !query schema
+struct<elt(NULL, 123, NULL):string>
+-- !query output
+NULL
+
+
+-- !query
+select elt(1, '123', null)
+-- !query schema
+struct<elt(1, 123, NULL):string>
+-- !query output
+123
+
+
+-- !query
+select elt(2, '123', null)
+-- !query schema
+struct<elt(2, 123, NULL):string>
+-- !query output
+NULL
+
+
+-- !query
select array(1, 2, 3)[5]
-- !query schema
struct<>
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 76fdf03..9d42b8a 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
@@ -1,5 +1,5 @@
-- Automatically generated by SQLQueryTestSuite
--- Number of queries: 20
+-- Number of queries: 24
-- !query
@@ -212,6 +212,38 @@ NULL
-- !query
+select elt(null, '123', '456')
+-- !query schema
+struct<elt(NULL, 123, 456):string>
+-- !query output
+NULL
+
+
+-- !query
+select elt(null, '123', null)
+-- !query schema
+struct<elt(NULL, 123, NULL):string>
+-- !query output
+NULL
+
+
+-- !query
+select elt(1, '123', null)
+-- !query schema
+struct<elt(1, 123, NULL):string>
+-- !query output
+123
+
+
+-- !query
+select elt(2, '123', null)
+-- !query schema
+struct<elt(2, 123, NULL):string>
+-- !query output
+NULL
+
+
+-- !query
select array(1, 2, 3)[5]
-- !query schema
struct<array(1, 2, 3)[5]:int>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]