This is an automated email from the ASF dual-hosted git repository.

mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new 4c695885a5 [CALCITE-6348] ARRAY_OVERLAP with a NULL argument crashes 
the compiler
4c695885a5 is described below

commit 4c695885a50d2986008aa24a1122094b051c0872
Author: Mihai Budiu <[email protected]>
AuthorDate: Thu Apr 4 10:44:30 2024 -0700

    [CALCITE-6348] ARRAY_OVERLAP with a NULL argument crashes the compiler
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../java/org/apache/calcite/sql/fun/SqlLibraryOperators.java  |  3 ++-
 .../java/org/apache/calcite/sql/type/SqlTypeTransforms.java   |  6 +++++-
 .../main/java/org/apache/calcite/test/SqlOperatorTest.java    | 11 +++++++----
 3 files changed, 14 insertions(+), 6 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 b32658f866..5f27b503d5 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
@@ -1441,7 +1441,8 @@ public abstract class SqlLibraryOperators {
           
ReturnTypes.BOOLEAN_NULLABLE.andThen(SqlTypeTransforms.COLLECTION_ELEMENT_TYPE_NULLABLE),
           OperandTypes.and(
               OperandTypes.SAME_SAME,
-              OperandTypes.family(SqlTypeFamily.ARRAY, SqlTypeFamily.ARRAY)));
+              OperandTypes.family(SqlTypeFamily.ARRAY, SqlTypeFamily.ARRAY),
+              OperandTypes.NONNULL_NONNULL));
 
   private static RelDataType deriveTypeArraysZip(SqlOperatorBinding opBinding) 
{
     final List<RelDataType> argComponentTypes = new ArrayList<>();
diff --git 
a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeTransforms.java 
b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeTransforms.java
index 63c1e43559..2004125261 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeTransforms.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeTransforms.java
@@ -121,7 +121,11 @@ public abstract class SqlTypeTransforms {
       (opBinding, typeToTransform) -> {
         final List<RelDataType> argComponentTypes = new ArrayList<>();
         for (RelDataType arrayType : opBinding.collectOperandTypes()) {
-          final RelDataType componentType = 
requireNonNull(arrayType.getComponentType());
+          final RelDataType componentType = arrayType.getComponentType();
+          if (componentType == null) {
+            // NULL supplied for array
+            return arrayType;
+          }
           argComponentTypes.add(componentType);
         }
 
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 eb7e087398..675ab8591b 100644
--- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
@@ -7124,10 +7124,13 @@ public class SqlOperatorTest {
     f.checkType("arrays_overlap(array[1, 2], cast(null as integer array))", 
"BOOLEAN");
     f.checkNull("arrays_overlap(array[1], array[2, null])");
     f.checkType("arrays_overlap(array[2, null], array[1])", "BOOLEAN");
-    f.checkFails("^arrays_overlap(array[1, 2], true)^",
-        "Cannot apply 'ARRAYS_OVERLAP' to arguments of type 'ARRAYS_OVERLAP\\("
-            + "<INTEGER ARRAY>, <BOOLEAN>\\)'. Supported form\\(s\\): 
'ARRAYS_OVERLAP\\("
-            + "<EQUIVALENT_TYPE>, <EQUIVALENT_TYPE>\\)'", false);
+    final String expected = "Cannot apply 'ARRAYS_OVERLAP' to arguments of 
type 'ARRAYS_OVERLAP\\("
+        + "<.*>, <.*>\\)'. Supported form\\(s\\): 'ARRAYS_OVERLAP\\("
+        + "<EQUIVALENT_TYPE>, <EQUIVALENT_TYPE>\\)'";
+    f.checkFails("^arrays_overlap(array[1, 2], true)^", expected, false);
+    f.checkFails("^arrays_overlap(null, null)^", expected, false);
+    f.checkFails("^arrays_overlap(null, array[1])^", expected, false);
+    f.checkFails("^arrays_overlap(array[1], null)^", expected, false);
   }
 
   /** Tests {@code ARRAYS_ZIP} function from Spark. */

Reply via email to