This is an automated email from the ASF dual-hosted git repository. taoran pushed a commit to branch revert-3579-CALCITE-6127 in repository https://gitbox.apache.org/repos/asf/calcite.git
commit c08fa970e5cf8f8e92618ea69c6eeff5de70ccc2 Author: Ran Tao <chucheng...@gmail.com> AuthorDate: Mon Dec 18 16:15:59 2023 +0800 Revert "[CALCITE-6127] The spark array function gives NullPointerException when element is row type" This reverts commit 668d9df4f2d55b79ed07c2ede2801c2546fdbbb4. --- .../calcite/sql/fun/SqlLibraryOperators.java | 16 +++++---------- .../org/apache/calcite/test/SqlOperatorTest.java | 23 ---------------------- 2 files changed, 5 insertions(+), 34 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java index a81f93910b..a5440a211d 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java @@ -1061,22 +1061,13 @@ public abstract class SqlLibraryOperators { private static RelDataType arrayReturnType(SqlOperatorBinding opBinding) { final List<RelDataType> operandTypes = opBinding.collectOperandTypes(); - // only numeric & character types check, this is a special spark array case - // the form like ARRAY(1, 2, '3') will return ["1", "2", "3"] + // only numeric & character types check boolean hasNumeric = false; boolean hasCharacter = false; boolean hasOthers = false; for (RelDataType type : operandTypes) { SqlTypeFamily family = type.getSqlTypeName().getFamily(); - // some types such as Row, the family is null, fallback to normal inferred type logic - if (family == null) { - hasOthers = true; - break; - } - // skip it because we allow NULL literal - if (SqlTypeUtil.isNull(type)) { - continue; - } + requireNonNull(family, "array element type family"); switch (family) { case NUMERIC: hasNumeric = true; @@ -1084,6 +1075,9 @@ public abstract class SqlLibraryOperators { case CHARACTER: hasCharacter = true; break; + case NULL: + // skip it becase we allow null + break; default: hasOthers = true; break; diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java index 1d15d3cfa9..9578522bd8 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -10537,29 +10537,6 @@ public class SqlOperatorTest { "[null, foo]", "CHAR(3) ARRAY NOT NULL"); f2.checkScalar("array(null)", "[null]", "NULL ARRAY NOT NULL"); - // check complex type - f2.checkScalar("array(row(1))", "[{1}]", - "RecordType(INTEGER NOT NULL EXPR$0) NOT NULL ARRAY NOT NULL"); - f2.checkScalar("array(row(1, null))", "[{1, null}]", - "RecordType(INTEGER NOT NULL EXPR$0, NULL EXPR$1) NOT NULL ARRAY NOT NULL"); - f2.checkScalar("array(row(null, 1))", "[{null, 1}]", - "RecordType(NULL EXPR$0, INTEGER NOT NULL EXPR$1) NOT NULL ARRAY NOT NULL"); - f2.checkScalar("array(row(1, 2))", "[{1, 2}]", - "RecordType(INTEGER NOT NULL EXPR$0, INTEGER NOT NULL EXPR$1) NOT NULL ARRAY NOT NULL"); - f2.checkFails("^array(row(1, 2), null)^", - "Parameters must be of the same type", false); - f2.checkFails("^array(null, row(1, 2))^", - "Parameters must be of the same type", false); - f2.checkScalar("array(row(1, null), row(2, null))", "[{1, null}, {2, null}]", - "RecordType(INTEGER NOT NULL EXPR$0, NULL EXPR$1) NOT NULL ARRAY NOT NULL"); - f2.checkScalar("array(row(null, 1), row(null, 2))", "[{null, 1}, {null, 2}]", - "RecordType(NULL EXPR$0, INTEGER NOT NULL EXPR$1) NOT NULL ARRAY NOT NULL"); - f2.checkScalar("array(row(1, null), row(null, 2))", "[{1, null}, {null, 2}]", - "RecordType(INTEGER EXPR$0, INTEGER EXPR$1) NOT NULL ARRAY NOT NULL"); - f2.checkScalar("array(row(null, 1), row(2, null))", "[{null, 1}, {2, null}]", - "RecordType(INTEGER EXPR$0, INTEGER EXPR$1) NOT NULL ARRAY NOT NULL"); - f2.checkScalar("array(row(1, 2), row(3, 4))", "[{1, 2}, {3, 4}]", - "RecordType(INTEGER NOT NULL EXPR$0, INTEGER NOT NULL EXPR$1) NOT NULL ARRAY NOT NULL"); // calcite default cast char type will fill extra spaces f2.checkScalar("array(1, 2, 'Hi')", "[1 , 2 , Hi]", "CHAR(2) NOT NULL ARRAY NOT NULL");