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. */