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

snuyanzin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 10dce7cf0a0 [FLINK-31166][table] array_contains does not support null 
argument when the array element type is not null
10dce7cf0a0 is described below

commit 10dce7cf0a04b80d7416a5760e1a6dbc430d9f88
Author: Jacky Lau <[email protected]>
AuthorDate: Fri Mar 10 07:42:08 2023 +0800

    [FLINK-31166][table] array_contains does not support null argument when the 
array element type is not null
    
    [FLINK-31166][table] Fix array_contains does not support null argument when 
the array element type is not null.
---
 .../ArrayElementArgumentTypeStrategy.java          |  7 ++++++-
 .../types/inference/InputTypeStrategiesTest.java   | 14 +++++++++++++-
 .../functions/CollectionFunctionsITCase.java       | 22 ++++++++++++++++++++--
 3 files changed, 39 insertions(+), 4 deletions(-)

diff --git 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/strategies/ArrayElementArgumentTypeStrategy.java
 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/strategies/ArrayElementArgumentTypeStrategy.java
index 8f576c4bdd0..d37bf713338 100644
--- 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/strategies/ArrayElementArgumentTypeStrategy.java
+++ 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/inference/strategies/ArrayElementArgumentTypeStrategy.java
@@ -42,9 +42,14 @@ class ArrayElementArgumentTypeStrategy implements 
ArgumentTypeStrategy {
             CallContext callContext, int argumentPos, boolean throwOnFailure) {
         final ArrayType haystackType =
                 (ArrayType) 
callContext.getArgumentDataTypes().get(0).getLogicalType();
-        final LogicalType haystackElementType = haystackType.getElementType();
         final LogicalType needleType =
                 
callContext.getArgumentDataTypes().get(argumentPos).getLogicalType();
+        LogicalType haystackElementType = haystackType.getElementType();
+
+        if (!haystackElementType.isNullable() && needleType.isNullable()) {
+            haystackElementType = haystackElementType.copy(true);
+        }
+
         if (supportsImplicitCast(needleType, haystackElementType)) {
             return Optional.of(DataTypes.of(haystackElementType));
         }
diff --git 
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/inference/InputTypeStrategiesTest.java
 
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/inference/InputTypeStrategiesTest.java
index b26d04bf42b..14c7c89a451 100644
--- 
a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/inference/InputTypeStrategiesTest.java
+++ 
b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/inference/InputTypeStrategiesTest.java
@@ -624,7 +624,19 @@ class InputTypeStrategiesTest extends 
InputTypeStrategiesTestBase {
                                         InputTypeStrategies.COMMON_ARG))
                         .calledWithArgumentTypes(DataTypes.INT(), 
DataTypes.BIGINT())
                         .expectSignature("f(<COMMON>, <COMMON>)")
-                        .expectArgumentTypes(DataTypes.BIGINT(), 
DataTypes.BIGINT()));
+                        .expectArgumentTypes(DataTypes.BIGINT(), 
DataTypes.BIGINT()),
+                TestSpec.forStrategy(
+                                "ArrayElement argument type strategy",
+                                sequence(
+                                        logical(LogicalTypeRoot.ARRAY),
+                                        
SpecificInputTypeStrategies.ARRAY_ELEMENT_ARG))
+                        .calledWithArgumentTypes(
+                                
DataTypes.ARRAY(DataTypes.INT().notNull()).notNull(),
+                                DataTypes.INT())
+                        .expectSignature("f(<ARRAY>, <ARRAY ELEMENT>)")
+                        .expectArgumentTypes(
+                                
DataTypes.ARRAY(DataTypes.INT().notNull()).notNull(),
+                                DataTypes.INT()));
     }
 
     /** Simple pojo that should be converted to a Structured type. */
diff --git 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/CollectionFunctionsITCase.java
 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/CollectionFunctionsITCase.java
index c79dbbee7e3..684338f062d 100644
--- 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/CollectionFunctionsITCase.java
+++ 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/CollectionFunctionsITCase.java
@@ -26,6 +26,7 @@ import java.time.LocalDate;
 import java.util.stream.Stream;
 
 import static org.apache.flink.table.api.Expressions.$;
+import static org.apache.flink.table.api.Expressions.lit;
 import static org.apache.flink.table.api.Expressions.row;
 
 /** Tests for {@link BuiltInFunctionDefinitions} around arrays. */
@@ -44,14 +45,16 @@ class CollectionFunctionsITCase extends 
BuiltInFunctionTestBase {
                                     Row.of(true, LocalDate.of(1990, 10, 14)),
                                     null
                                 },
-                                new Integer[] {1, null, 3})
+                                new Integer[] {1, null, 3},
+                                new Integer[] {1, 2, 3})
                         .andDataTypes(
                                 DataTypes.ARRAY(DataTypes.INT()),
                                 DataTypes.ARRAY(DataTypes.INT()),
                                 DataTypes.ARRAY(DataTypes.STRING()).notNull(),
                                 DataTypes.ARRAY(
                                         DataTypes.ROW(DataTypes.BOOLEAN(), 
DataTypes.DATE())),
-                                DataTypes.ARRAY(DataTypes.INT()))
+                                DataTypes.ARRAY(DataTypes.INT()),
+                                
DataTypes.ARRAY(DataTypes.INT().notNull()).notNull())
                         // ARRAY<INT>
                         .testResult(
                                 $("f0").arrayContains(2),
@@ -102,6 +105,21 @@ class CollectionFunctionsITCase extends 
BuiltInFunctionTestBase {
                                 "ARRAY_CONTAINS(f4, NULL)",
                                 true,
                                 DataTypes.BOOLEAN().nullable())
+                        .testResult(
+                                $("f5").arrayContains(lit(null, 
DataTypes.INT())),
+                                "ARRAY_CONTAINS(f5, CAST(NULL AS INT))",
+                                false,
+                                DataTypes.BOOLEAN().notNull())
+                        .testResult(
+                                $("f5").arrayContains(lit(4, 
DataTypes.INT().notNull())),
+                                "ARRAY_CONTAINS(f5, 4)",
+                                false,
+                                DataTypes.BOOLEAN().notNull())
+                        .testResult(
+                                $("f5").arrayContains(lit(3, 
DataTypes.INT().notNull())),
+                                "ARRAY_CONTAINS(f5, 3)",
+                                true,
+                                DataTypes.BOOLEAN().notNull())
                         // invalid signatures
                         .testSqlValidationError(
                                 "ARRAY_CONTAINS(f0, TRUE)",

Reply via email to