diff --git a/datafusion/physical-expr-common/src/datum.rs b/datafusion/physical-expr-common/src/datum.rs index 56ef54a1d450..c84d3afeeff6 100644 --- a/datafusion/physical-expr-common/src/datum.rs +++ b/datafusion/physical-expr-common/src/datum.rs @@ -24,7 +24,7 @@ use arrow::compute::kernels::cmp::{ use arrow::compute::{ilike, like, nilike, nlike, SortOptions}; use arrow::error::ArrowError; use datafusion_common::DataFusionError; -use datafusion_common::{arrow_datafusion_err, internal_err}; +use datafusion_common::{arrow_datafusion_err, assert_or_internal_err, internal_err}; use datafusion_common::{Result, ScalarValue}; use datafusion_expr_common::columnar_value::ColumnarValue; use datafusion_expr_common::operator::Operator; @@ -99,29 +99,24 @@ pub fn apply_cmp_for_nested( let left_data_type = lhs.data_type(); let right_data_type = rhs.data_type(); - if matches!( - op, - Operator::Eq - | Operator::NotEq - | Operator::Lt - | Operator::Gt - | Operator::LtEq - | Operator::GtEq - | Operator::IsDistinctFrom - | Operator::IsNotDistinctFrom - ) && left_data_type.equals_datatype(&right_data_type) - { - apply(lhs, rhs, |l, r| { - Ok(Arc::new(compare_op_for_nested(op, l, r)?)) - }) - } else { - internal_err!( - "invalid operator or data type mismatch for nested data, op {} left {}, right {}", + assert_or_internal_err!( + matches!( op, - left_data_type, - right_data_type - ) - } + Operator::Eq + | Operator::NotEq + | Operator::Lt + | Operator::Gt + | Operator::LtEq + | Operator::GtEq + | Operator::IsDistinctFrom + | Operator::IsNotDistinctFrom + ) && left_data_type.equals_datatype(&right_data_type), + "invalid operator or data type mismatch for nested data, op {op} left {left_data_type}, right {right_data_type}", + ); + + apply(lhs, rhs, |l, r| { + Ok(Arc::new(compare_op_for_nested(op, l, r)?)) + }) } /// Compare with eq with either nested or non-nested @@ -148,9 +143,7 @@ pub fn compare_op_for_nested( let l_len = l.len(); let r_len = r.len(); - if l_len != r_len && !is_l_scalar && !is_r_scalar { - return internal_err!("len mismatch"); - } + assert_or_internal_err!(l_len == r_len || is_l_scalar || is_r_scalar, "len mismatch"); let len = match is_l_scalar { true => r_len, diff --git a/datafusion/physical-expr-common/src/physical_expr.rs b/datafusion/physical-expr-common/src/physical_expr.rs index e8280409c027..efa08cc37777 100644 --- a/datafusion/physical-expr-common/src/physical_expr.rs +++ b/datafusion/physical-expr-common/src/physical_expr.rs @@ -30,7 +30,10 @@ use arrow::record_batch::RecordBatch; use datafusion_common::tree_node::{ Transformed, TransformedResult, TreeNode, TreeNodeRecursion, }; -use datafusion_common::{exec_err, internal_err, not_impl_err, Result, ScalarValue}; +use datafusion_common::{ + assert_eq_or_internal_err, exec_err, not_impl_err, DataFusionError, Result, + ScalarValue, +}; use datafusion_expr_common::columnar_value::ColumnarValue; use datafusion_expr_common::interval_arithmetic::Interval; use datafusion_expr_common::sort_properties::ExprProperties; @@ -453,9 +456,13 @@ pub fn with_new_children_if_necessary( children: Vec>, ) -> Result> { let old_children = expr.children(); - if children.len() != old_children.len() { - internal_err!("PhysicalExpr: Wrong number of children") - } else if children.is_empty() + assert_eq_or_internal_err!( + children.len(), + old_children.len(), + "PhysicalExpr: Wrong number of children" + ); + + if children.is_empty() || children .iter() .zip(old_children.iter())