Skip to content

Commit 273d37a

Browse files
authored
chore: use equals_datatype for BinaryExpr (#16813) (#16847)
* chore: use `equals_datatype` instead of direct type comparison for `BinaryExpr` * chore: use `equals_datatype` instead of direct type comparison for `BinaryExpr` (cherry picked from commit acff1b6)
1 parent 1ded6ef commit 273d37a

File tree

1 file changed

+63
-2
lines changed
  • datafusion/physical-expr/src/expressions

1 file changed

+63
-2
lines changed

datafusion/physical-expr/src/expressions/binary.rs

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,8 @@ impl PhysicalExpr for BinaryExpr {
387387
let input_schema = schema.as_ref();
388388

389389
if left_data_type.is_nested() {
390-
if right_data_type != left_data_type {
391-
return internal_err!("type mismatch");
390+
if !left_data_type.equals_datatype(&right_data_type) {
391+
return internal_err!("Cannot evaluate binary expression because of type mismatch: left {}, right {} ", left_data_type, right_data_type);
392392
}
393393
return apply_cmp_for_nested(self.op, &lhs, &rhs);
394394
}
@@ -5399,4 +5399,65 @@ mod tests {
53995399
Interval::make(Some(false), Some(false)).unwrap()
54005400
);
54015401
}
5402+
5403+
#[test]
5404+
fn test_evaluate_nested_type() {
5405+
let batch_schema = Arc::new(Schema::new(vec![
5406+
Field::new(
5407+
"a",
5408+
DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true))),
5409+
true,
5410+
),
5411+
Field::new(
5412+
"b",
5413+
DataType::List(Arc::new(Field::new_list_field(DataType::Int32, true))),
5414+
true,
5415+
),
5416+
]));
5417+
5418+
let mut list_builder_a = ListBuilder::new(Int32Builder::new());
5419+
5420+
list_builder_a.append_value([Some(1)]);
5421+
list_builder_a.append_value([Some(2)]);
5422+
list_builder_a.append_value([]);
5423+
list_builder_a.append_value([None]);
5424+
5425+
let list_array_a: ArrayRef = Arc::new(list_builder_a.finish());
5426+
5427+
let mut list_builder_b = ListBuilder::new(Int32Builder::new());
5428+
5429+
list_builder_b.append_value([Some(1)]);
5430+
list_builder_b.append_value([Some(2)]);
5431+
list_builder_b.append_value([]);
5432+
list_builder_b.append_value([None]);
5433+
5434+
let list_array_b: ArrayRef = Arc::new(list_builder_b.finish());
5435+
5436+
let batch =
5437+
RecordBatch::try_new(batch_schema, vec![list_array_a, list_array_b]).unwrap();
5438+
5439+
let schema = Arc::new(Schema::new(vec![
5440+
Field::new(
5441+
"a",
5442+
DataType::List(Arc::new(Field::new("foo", DataType::Int32, true))),
5443+
true,
5444+
),
5445+
Field::new(
5446+
"b",
5447+
DataType::List(Arc::new(Field::new("bar", DataType::Int32, true))),
5448+
true,
5449+
),
5450+
]));
5451+
5452+
let a = Arc::new(Column::new("a", 0)) as _;
5453+
let b = Arc::new(Column::new("b", 1)) as _;
5454+
5455+
let eq_expr =
5456+
binary_expr(Arc::clone(&a), Operator::Eq, Arc::clone(&b), &schema).unwrap();
5457+
5458+
let eq_result = eq_expr.evaluate(&batch).unwrap();
5459+
let expected =
5460+
BooleanArray::from_iter(vec![Some(true), Some(true), Some(true), Some(true)]);
5461+
assert_eq!(eq_result.into_array(4).unwrap().as_boolean(), &expected);
5462+
}
54025463
}

0 commit comments

Comments
 (0)