@@ -49,8 +49,8 @@ use crate::enforce_sorting::sort_pushdown::{
4949} ;
5050use crate :: output_requirements:: OutputRequirementExec ;
5151use crate :: utils:: {
52- add_sort_above , add_sort_above_with_check, is_coalesce_partitions , is_limit ,
53- is_repartition, is_sort, is_sort_preserving_merge, is_window,
52+ add_sort_above_with_check, add_sort_above_with_distribution , is_coalesce_partitions ,
53+ is_limit , is_repartition, is_sort, is_sort_preserving_merge, is_window,
5454} ;
5555
5656use datafusion_common:: Result ;
@@ -489,6 +489,7 @@ pub fn ensure_sorting(
489489 } ;
490490
491491 let plan = & requirements. plan ;
492+ let required_distributions = plan. required_input_distribution ( ) ;
492493 let mut updated_children = vec ! [ ] ;
493494 for ( idx, ( required_ordering, mut child) ) in plan
494495 . required_input_ordering ( )
@@ -506,13 +507,14 @@ pub fn ensure_sorting(
506507 if physical_ordering. is_some ( ) {
507508 child = update_child_to_remove_unnecessary_sort ( idx, child, plan) ?;
508509 }
509- child = add_sort_above (
510+ child = add_sort_above_with_distribution (
510511 child,
511512 req,
512513 plan. as_any ( )
513514 . downcast_ref :: < OutputRequirementExec > ( )
514515 . map ( |output| output. fetch ( ) )
515516 . unwrap_or ( None ) ,
517+ & required_distributions[ idx] ,
516518 ) ;
517519 child = update_sort_ctx_children_data ( child, true ) ?;
518520 }
@@ -609,13 +611,17 @@ fn analyze_immediate_sort_removal(
609611fn adjust_window_sort_removal (
610612 mut window_tree : PlanWithCorrespondingSort ,
611613) -> Result < PlanWithCorrespondingSort > {
614+ let required_distribution = window_tree
615+ . plan
616+ . required_input_distribution ( )
617+ . swap_remove ( 0 ) ;
618+ let requires_single_partition =
619+ matches ! ( required_distribution, Distribution :: SinglePartition ) ;
620+
612621 // Window operators have a single child we need to adjust:
613622 let child_node = remove_corresponding_sort_from_sub_plan (
614623 window_tree. children . swap_remove ( 0 ) ,
615- matches ! (
616- window_tree. plan. required_input_distribution( ) [ 0 ] ,
617- Distribution :: SinglePartition
618- ) ,
624+ requires_single_partition,
619625 ) ?;
620626 window_tree. children . push ( child_node) ;
621627
@@ -647,7 +653,12 @@ fn adjust_window_sort_removal(
647653 // Satisfy the ordering requirement so that the window can run:
648654 let mut child_node = window_tree. children . swap_remove ( 0 ) ;
649655 if let Some ( reqs) = reqs {
650- child_node = add_sort_above ( child_node, reqs. into_single ( ) , None ) ;
656+ child_node = add_sort_above_with_distribution (
657+ child_node,
658+ reqs. into_single ( ) ,
659+ None ,
660+ & required_distribution,
661+ ) ;
651662 }
652663 let child_plan = Arc :: clone ( & child_node. plan ) ;
653664 window_tree. children . push ( child_node) ;
0 commit comments