diff --git a/datafusion/physical-plan/src/union.rs b/datafusion/physical-plan/src/union.rs index cfa919425c54..bcd9572f45c7 100644 --- a/datafusion/physical-plan/src/union.rs +++ b/datafusion/physical-plan/src/union.rs @@ -32,14 +32,16 @@ use super::{ ExecutionPlanProperties, Partitioning, PlanProperties, RecordBatchStream, SendableRecordBatchStream, Statistics, }; -use crate::execution_plan::{boundedness_from_children, emission_type_from_children}; +use crate::execution_plan::{ + boundedness_from_children, emission_type_from_children, InvariantLevel, +}; use crate::metrics::BaselineMetrics; use crate::stream::ObservedStream; use arrow::datatypes::{Field, Schema, SchemaRef}; use arrow::record_batch::RecordBatch; use datafusion_common::stats::Precision; -use datafusion_common::{exec_err, internal_err, Result}; +use datafusion_common::{exec_err, internal_err, DataFusionError, Result}; use datafusion_execution::TaskContext; use datafusion_physical_expr::{calculate_union, EquivalenceProperties}; @@ -172,6 +174,14 @@ impl ExecutionPlan for UnionExec { &self.cache } + fn check_invariants(&self, _check: InvariantLevel) -> Result<()> { + (self.inputs().len() >= 2) + .then_some(()) + .ok_or(DataFusionError::Internal( + "UnionExec should have at least 2 children".into(), + )) + } + fn children(&self) -> Vec<&Arc> { self.inputs.iter().collect() }