Skip to content

Commit 1ed0fce

Browse files
committed
modify the return type
1 parent 58a784e commit 1ed0fce

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

datafusion/expr/src/built_in_function.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,18 @@ impl BuiltinScalarFunction {
617617
BuiltinScalarFunction::ArrayReplaceAll => Ok(input_expr_types[0].clone()),
618618
BuiltinScalarFunction::ArraySlice => Ok(input_expr_types[0].clone()),
619619
BuiltinScalarFunction::ArrayToString => Ok(Utf8),
620-
BuiltinScalarFunction::ArrayUnion | BuiltinScalarFunction::ArrayIntersect => {
620+
BuiltinScalarFunction::ArrayIntersect => {
621+
match (input_expr_types[0].clone(), input_expr_types[1].clone()) {
622+
(DataType::Null, DataType::Null) | (DataType::Null, _) => {
623+
Ok(DataType::Null)
624+
}
625+
(_, DataType::Null) => {
626+
Ok(List(Arc::new(Field::new("item", Null, true))))
627+
}
628+
(dt, _) => Ok(dt),
629+
}
630+
}
631+
BuiltinScalarFunction::ArrayUnion => {
621632
match (input_expr_types[0].clone(), input_expr_types[1].clone()) {
622633
(DataType::Null, dt) => Ok(dt),
623634
(dt, DataType::Null) => Ok(dt),

datafusion/physical-expr/src/array_expressions.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,24 +1631,36 @@ fn general_set_op(
16311631
set_op: SetOp,
16321632
) -> Result<ArrayRef> {
16331633
match (array1.data_type(), array2.data_type()) {
1634-
// Null type
1635-
(DataType::Null, DataType::List(field))
1636-
| (DataType::List(field), DataType::Null) => {
1637-
let array = match array1.data_type() {
1638-
DataType::Null => as_list_array(&array2)?,
1639-
_ => as_list_array(&array1)?,
1640-
};
1634+
(DataType::Null, DataType::List(field)) => {
1635+
if set_op == SetOp::Intersect {
1636+
return make_array(dbg!(&[]));
1637+
}
1638+
let array = as_list_array(&array2)?;
16411639
general_array_distinct::<i32>(array, field)
16421640
}
1643-
(DataType::Null, DataType::LargeList(field))
1644-
| (DataType::LargeList(field), DataType::Null) => {
1645-
let array = match array1.data_type() {
1646-
DataType::Null => as_large_list_array(&array2)?,
1647-
_ => as_large_list_array(&array1)?,
1648-
};
1641+
1642+
(DataType::List(field), DataType::Null) => {
1643+
if set_op == SetOp::Intersect {
1644+
return make_array(dbg!(&[]));
1645+
}
1646+
let array = as_list_array(&array1)?;
1647+
general_array_distinct::<i32>(array, field)
1648+
}
1649+
(DataType::Null, DataType::LargeList(field)) => {
1650+
if set_op == SetOp::Intersect {
1651+
return make_array(&[]);
1652+
}
1653+
let array = as_large_list_array(&array2)?;
1654+
general_array_distinct::<i64>(array, field)
1655+
}
1656+
(DataType::LargeList(field), DataType::Null) => {
1657+
if set_op == SetOp::Intersect {
1658+
return make_array(&[]);
1659+
}
1660+
let array = as_large_list_array(&array1)?;
16491661
general_array_distinct::<i64>(array, field)
16501662
}
1651-
(DataType::Null, DataType::Null) => Ok(array1.clone()),
1663+
(DataType::Null, DataType::Null) => make_array(&[]),
16521664

16531665
(DataType::List(_), DataType::List(_)) => {
16541666
let array1 = as_list_array(&array1)?;

datafusion/sqllogictest/test_files/array.slt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2116,7 +2116,7 @@ select array_union(null, []);
21162116
query ?
21172117
select array_union(null, null);
21182118
----
2119-
NULL
2119+
[]
21202120

21212121
# array_union scalar function #11
21222122
query ?
@@ -3046,12 +3046,12 @@ select array_intersect([], []);
30463046
query ?
30473047
select array_intersect([1, 1, 2, 2, 3, 3], null);
30483048
----
3049-
[1, 2, 3]
3049+
[]
30503050

30513051
query ?
30523052
select array_intersect(null, [1, 1, 2, 2, 3, 3]);
30533053
----
3054-
[1, 2, 3]
3054+
[]
30553055

30563056
query ?
30573057
select array_intersect([], null);
@@ -3066,7 +3066,7 @@ select array_intersect(null, []);
30663066
query ?
30673067
select array_intersect(null, null);
30683068
----
3069-
NULL
3069+
[]
30703070

30713071
query ??????
30723072
SELECT list_intersect(make_array(1,2,3), make_array(2,3,4)),

0 commit comments

Comments
 (0)