Skip to content

Commit 21df68c

Browse files
authored
Improve SanityChecker error message (#12595)
1 parent 91c8a47 commit 21df68c

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

datafusion/core/src/physical_optimizer/sanity_checker.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use datafusion_physical_expr::intervals::utils::{check_support, is_datatype_supp
3333
use datafusion_physical_plan::joins::SymmetricHashJoinExec;
3434
use datafusion_physical_plan::{get_plan_string, ExecutionPlanProperties};
3535

36+
use datafusion_physical_expr_common::sort_expr::format_physical_sort_requirement_list;
3637
use datafusion_physical_optimizer::PhysicalOptimizerRule;
3738
use itertools::izip;
3839

@@ -130,9 +131,9 @@ pub fn check_plan_sanity(
130131
if !child_eq_props.ordering_satisfy_requirement(sort_req) {
131132
let plan_str = get_plan_string(&plan);
132133
return plan_err!(
133-
"Plan: {:?} does not satisfy order requirements: {:?}. Child-{} order: {:?}",
134+
"Plan: {:?} does not satisfy order requirements: {}. Child-{} order: {}",
134135
plan_str,
135-
sort_req,
136+
format_physical_sort_requirement_list(sort_req),
136137
idx,
137138
child_eq_props.oeq_class
138139
);
@@ -145,7 +146,7 @@ pub fn check_plan_sanity(
145146
{
146147
let plan_str = get_plan_string(&plan);
147148
return plan_err!(
148-
"Plan: {:?} does not satisfy distribution requirements: {:?}. Child-{} output partitioning: {:?}",
149+
"Plan: {:?} does not satisfy distribution requirements: {}. Child-{} output partitioning: {}",
149150
plan_str,
150151
dist_req,
151152
idx,

datafusion/physical-expr-common/src/sort_expr.rs

+26-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
//! Sort expressions
1919
20-
use std::fmt::Display;
20+
use std::fmt::{Display, Formatter};
2121
use std::hash::{Hash, Hasher};
2222
use std::ops::Deref;
2323
use std::sync::Arc;
@@ -252,13 +252,37 @@ impl PartialEq for PhysicalSortRequirement {
252252
}
253253
}
254254

255-
impl std::fmt::Display for PhysicalSortRequirement {
255+
impl Display for PhysicalSortRequirement {
256256
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
257257
let opts_string = self.options.as_ref().map_or("NA", to_str);
258258
write!(f, "{} {}", self.expr, opts_string)
259259
}
260260
}
261261

262+
/// Writes a list of [`PhysicalSortRequirement`]s to a `std::fmt::Formatter`.
263+
///
264+
/// Example output: `[a + 1, b]`
265+
pub fn format_physical_sort_requirement_list(
266+
exprs: &[PhysicalSortRequirement],
267+
) -> impl Display + '_ {
268+
struct DisplayWrapper<'a>(&'a [PhysicalSortRequirement]);
269+
impl<'a> Display for DisplayWrapper<'a> {
270+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
271+
let mut iter = self.0.iter();
272+
write!(f, "[")?;
273+
if let Some(expr) = iter.next() {
274+
write!(f, "{}", expr)?;
275+
}
276+
for expr in iter {
277+
write!(f, ", {}", expr)?;
278+
}
279+
write!(f, "]")?;
280+
Ok(())
281+
}
282+
}
283+
DisplayWrapper(exprs)
284+
}
285+
262286
impl PhysicalSortRequirement {
263287
/// Creates a new requirement.
264288
///

datafusion/physical-expr/src/partitioning.rs

+16-3
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@
1717

1818
//! [`Partitioning`] and [`Distribution`] for `ExecutionPlans`
1919
20-
use std::fmt;
21-
use std::sync::Arc;
22-
2320
use crate::{
2421
equivalence::ProjectionMapping, expressions::UnKnownColumn, physical_exprs_equal,
2522
EquivalenceProperties, PhysicalExpr,
2623
};
24+
use datafusion_physical_expr_common::physical_expr::format_physical_expr_list;
25+
use std::fmt;
26+
use std::fmt::Display;
27+
use std::sync::Arc;
2728

2829
/// Output partitioning supported by [`ExecutionPlan`]s.
2930
///
@@ -264,6 +265,18 @@ impl Distribution {
264265
}
265266
}
266267

268+
impl Display for Distribution {
269+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
270+
match self {
271+
Distribution::UnspecifiedDistribution => write!(f, "Unspecified"),
272+
Distribution::SinglePartition => write!(f, "SinglePartition"),
273+
Distribution::HashPartitioned(exprs) => {
274+
write!(f, "HashPartitioned[{}])", format_physical_expr_list(exprs))
275+
}
276+
}
277+
}
278+
}
279+
267280
#[cfg(test)]
268281
mod tests {
269282

0 commit comments

Comments
 (0)