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 8b9167284b4cc538a176a03d631a3bf43d4aa597
Author: Ran Tao <[email protected]>
AuthorDate: Mon Dec 18 16:15:59 2023 +0800

    Revert "Handle array operandTypeChecker bug"
    
    This reverts commit 67ee8d2c7d939696f69cf46dc20efc62aa08ff58.
---
 .../calcite/sql/fun/SqlLibraryOperators.java       |  2 +-
 .../org/apache/calcite/sql/type/OperandTypes.java  | 62 ----------------------
 .../org/apache/calcite/test/SqlOperatorTest.java   | 13 ++---
 3 files changed, 5 insertions(+), 72 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 427e305d50..a81f93910b 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
@@ -1119,7 +1119,7 @@ public abstract class SqlLibraryOperators {
   public static final SqlFunction ARRAY =
       SqlBasicFunction.create("ARRAY",
           SqlLibraryOperators::arrayReturnType,
-          OperandTypes.ARRAY_FUNCTION,
+          OperandTypes.SAME_VARIADIC,
           SqlFunctionCategory.SYSTEM);
 
   private static RelDataType mapReturnType(SqlOperatorBinding opBinding) {
diff --git a/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java 
b/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java
index 6d4228d1f8..295c95e0f3 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java
@@ -26,7 +26,6 @@ import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlOperandCountRange;
 import org.apache.calcite.sql.SqlOperator;
-import org.apache.calcite.sql.SqlOperatorBinding;
 import org.apache.calcite.sql.SqlUtil;
 import org.apache.calcite.sql.validate.SqlValidatorScope;
 import org.apache.calcite.util.ImmutableIntList;
@@ -561,9 +560,6 @@ public abstract class OperandTypes {
   public static final SqlSingleOperandTypeChecker MAP =
       family(SqlTypeFamily.MAP);
 
-  public static final SqlOperandTypeChecker ARRAY_FUNCTION =
-      new ArrayFunctionOperandTypeChecker();
-
   public static final SqlOperandTypeChecker ARRAY_ELEMENT =
       new ArrayElementOperandTypeChecker();
 
@@ -1229,64 +1225,6 @@ public abstract class OperandTypes {
     }
   }
 
-  /**
-   * Operand type-checking strategy for a ARRAY function, it allows empty 
array.
-   *
-   * <p> The reason it overrides SameOperandTypeChecker#checkOperandTypesImpl 
is that it needs
-   * to handle the scenario where row/struct type and NULL exist 
simultaneously in array.
-   * This scenario need be supported, but will be rejected by the current 
checkOperandTypesImpl.
-   */
-  private static class ArrayFunctionOperandTypeChecker
-      extends SameOperandTypeChecker {
-
-    ArrayFunctionOperandTypeChecker() {
-      // The args of array are non-fixed, so we set to -1 here. then 
operandCount
-      // can dynamically set according to the number of input args.
-      // details please see SameOperandTypeChecker#getOperandList.
-      super(-1);
-    }
-
-    @Override protected boolean checkOperandTypesImpl(
-        SqlOperatorBinding operatorBinding,
-        boolean throwOnFailure,
-        @Nullable SqlCallBinding callBinding) {
-      if (throwOnFailure && callBinding == null) {
-        throw new IllegalArgumentException(
-            "callBinding must be non-null in case throwOnFailure=true");
-      }
-      int nOperandsActual = nOperands;
-      if (nOperandsActual == -1) {
-        nOperandsActual = operatorBinding.getOperandCount();
-      }
-      RelDataType[] types = new RelDataType[nOperandsActual];
-      final List<Integer> operandList =
-          getOperandList(operatorBinding.getOperandCount());
-      for (int i : operandList) {
-        types[i] = operatorBinding.getOperandType(i);
-      }
-      int prev = -1;
-      for (int i : operandList) {
-        if (prev >= 0) {
-          // we replace SqlTypeUtil.isComparable with 
SqlTypeUtil.leastRestrictiveForComparison
-          // to handle struct type and NULL constant.
-          // details please see: 
https://issues.apache.org/jira/browse/CALCITE-6163
-          RelDataType type =
-              
SqlTypeUtil.leastRestrictiveForComparison(operatorBinding.getTypeFactory(),
-                  types[i], types[prev]);
-          if (type == null) {
-            if (!throwOnFailure) {
-              return false;
-            }
-            throw requireNonNull(callBinding, 
"callBinding").newValidationError(
-                RESOURCE.needSameTypeParameter());
-          }
-        }
-        prev = i;
-      }
-      return true;
-    }
-  }
-
   /**
    * Operand type-checking strategy for a MAP function, it allows empty map.
    */
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 2f21b83dbd..1d15d3cfa9 100644
--- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
@@ -10546,10 +10546,10 @@ public class SqlOperatorTest {
         "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.checkScalar("array(row(1, 2), null)",
-        "[{1, 2}, null]", "RecordType(INTEGER EXPR$0, INTEGER EXPR$1) ARRAY 
NOT NULL");
-    f2.checkScalar("array(null, row(1, 2))",
-        "[null, {1, 2}]", "RecordType(INTEGER EXPR$0, INTEGER EXPR$1) 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}]",
@@ -10560,11 +10560,6 @@ public class SqlOperatorTest {
         "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");
-    // checkFails
-    f2.checkFails("^array(row(1), row(2, 3))^",
-        "Parameters must be of the same type", false);
-    f2.checkFails("^array(row(1), row(2, 3), null)^",
-        "Parameters must be of the same type", false);
     // 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");

Reply via email to