Skip to content

Commit e6e430f

Browse files
committed
addressed comments
1 parent fb3c0b9 commit e6e430f

2 files changed

Lines changed: 20 additions & 11 deletions

File tree

datafusion/common/src/functional_dependencies.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -595,14 +595,17 @@ pub fn get_required_group_by_exprs_indices(
595595
pub fn get_required_sort_exprs_indices(
596596
schema: &DFSchema,
597597
sort_expr_names: &[String],
598-
) -> Option<Vec<usize>> {
598+
) -> Vec<usize> {
599599
let dependencies = schema.functional_dependencies();
600600
let field_names = schema.field_names();
601601

602602
let mut known_field_indices = HashSet::new();
603603
let mut required_sort_expr_indices = Vec::new();
604604

605605
for (sort_expr_idx, sort_expr_name) in sort_expr_names.iter().enumerate() {
606+
// If the sort expression doesn't correspond to a known schema field
607+
// (e.g. a computed expression), we can't reason about it via functional
608+
// dependencies, so conservatively keep it.
606609
let Some(field_idx) = field_names
607610
.iter()
608611
.position(|field_name| field_name == sort_expr_name)
@@ -611,6 +614,10 @@ pub fn get_required_sort_exprs_indices(
611614
continue;
612615
};
613616

617+
// A sort expression is removable if its value is functionally determined
618+
// by fields that already appear earlier in the sort order: if the earlier
619+
// fields are fixed, this one's value is fixed too, so it adds no ordering
620+
// information.
614621
let removable = dependencies.deps.iter().any(|dependency| {
615622
dependency.target_indices.contains(&field_idx)
616623
&& dependency
@@ -627,7 +634,7 @@ pub fn get_required_sort_exprs_indices(
627634
required_sort_expr_indices.push(sort_expr_idx);
628635
}
629636

630-
Some(required_sort_expr_indices)
637+
required_sort_expr_indices
631638
}
632639

633640
/// Updates entries inside the `entries` vector with their corresponding

datafusion/optimizer/src/eliminate_duplicated_expr.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
use crate::optimizer::ApplyOrder;
2121
use crate::{OptimizerConfig, OptimizerRule};
2222
use datafusion_common::tree_node::Transformed;
23-
use datafusion_common::{Result, get_required_sort_exprs_indices};
23+
use datafusion_common::{Result, get_required_sort_exprs_indices, internal_err};
2424
use datafusion_expr::logical_plan::LogicalPlan;
2525
use datafusion_expr::{Aggregate, Expr, Sort, SortExpr};
2626
use std::hash::{Hash, Hasher};
@@ -85,12 +85,13 @@ impl OptimizerRule for EliminateDuplicatedExpr {
8585
&sort_expr_names,
8686
);
8787

88-
let unique_exprs = match required_indices {
89-
Some(indices) if indices.len() < unique_exprs.len() => indices
88+
let unique_exprs = if required_indices.len() < unique_exprs.len() {
89+
required_indices
9090
.into_iter()
9191
.map(|idx| unique_exprs[idx].clone())
92-
.collect(),
93-
_ => unique_exprs,
92+
.collect()
93+
} else {
94+
unique_exprs
9495
};
9596

9697
let transformed = if len != unique_exprs.len() {
@@ -99,10 +100,11 @@ impl OptimizerRule for EliminateDuplicatedExpr {
99100
Transformed::no
100101
};
101102

102-
assert!(
103-
!unique_exprs.is_empty(),
104-
"FD pruning unexpectedly removed all ORDER BY expressions"
105-
);
103+
if unique_exprs.is_empty() {
104+
return internal_err!(
105+
"FD pruning unexpectedly removed all ORDER BY expressions"
106+
);
107+
}
106108

107109
Ok(transformed(LogicalPlan::Sort(Sort {
108110
expr: unique_exprs,

0 commit comments

Comments
 (0)