wiedld commented on code in PR #14821: URL: https://github.com/apache/datafusion/pull/14821#discussion_r1985690492
########## datafusion/physical-optimizer/src/enforce_sorting/sort_pushdown.rs: ########## @@ -98,82 +98,112 @@ fn pushdown_sorts_helper( .ordering_satisfy_requirement(&parent_reqs); if is_sort(plan) { - let sort_fetch = plan.fetch(); - let required_ordering = plan + let current_sort_fetch = plan.fetch(); + let parent_req_fetch = sort_push_down.data.fetch; + + let current_plan_reqs = plan .output_ordering() .cloned() .map(LexRequirement::from) .unwrap_or_default(); - if !satisfy_parent { - // Make sure this `SortExec` satisfies parent requirements: - let sort_reqs = requirements.data.ordering_requirement.unwrap_or_default(); - // It's possible current plan (`SortExec`) has a fetch value. - // And if both of them have fetch values, we should use the minimum one. - if let Some(fetch) = sort_fetch { - if let Some(requirement_fetch) = requirements.data.fetch { - requirements.data.fetch = Some(fetch.min(requirement_fetch)); - } + let parent_is_stricter = plan + .equivalence_properties() + .requirements_compatible(&parent_reqs, ¤t_plan_reqs); + let child_is_stricter = plan + .equivalence_properties() + .requirements_compatible(¤t_plan_reqs, &parent_reqs); + + if !satisfy_parent && !parent_is_stricter { + // This new sort has different requirements than the ordering being pushed down. + // 1. add a `SortExec` here for the pushed down ordering (parent reqs). + // 2. continue sort pushdown, but with the new ordering of the new sort. + + // remove current sort (which will be the new ordering to pushdown) + let new_reqs = current_plan_reqs; + sort_push_down = sort_push_down.children.swap_remove(0); + sort_push_down = sort_push_down.update_plan_from_children()?; // changed plan + + // add back sort exec matching parent + sort_push_down = + add_sort_above(sort_push_down, parent_reqs, parent_req_fetch); + + // If we have totally orthogonal sort, (2 different sorts in a row), that means the child sort + // gets immdiately re-sorted. + // e.g. Sort col1 ASC + // Sort col1 DESC + // + // Remove this redundant sort by not pushing down. + let is_orthogonal_sort = Review Comment: Orthogonal sort is not the same as strictness. I added two test cases demonstrating the difference: https://github.com/apache/datafusion/pull/14821/commits/843e1f86a3dbe4b343614e824ce617edaba661ed After I added the test cases, I could confidently always push down the new child/current requires (rather than conditionally). See that^^ commit. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For additional commands, e-mail: github-h...@datafusion.apache.org