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)",