Skip to content

Commit cc14cd5

Browse files
authored
[Fix](Nereids) TopN should forbid two-phase topN if child is DistributionSpecGather (#36877)
TopN should forbid two-phase topN if child is DistributionSpecGather.
1 parent df5adaa commit cc14cd5

File tree

40 files changed

+1374
-1411
lines changed

40 files changed

+1374
-1411
lines changed

fe/fe-core/src/main/java/org/apache/doris/nereids/properties/ChildrenPropertiesRegulator.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.apache.doris.nereids.trees.plans.physical.PhysicalPartitionTopN;
4343
import org.apache.doris.nereids.trees.plans.physical.PhysicalProject;
4444
import org.apache.doris.nereids.trees.plans.physical.PhysicalSetOperation;
45+
import org.apache.doris.nereids.trees.plans.physical.PhysicalTopN;
4546
import org.apache.doris.nereids.trees.plans.physical.PhysicalUnion;
4647
import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
4748
import org.apache.doris.nereids.util.JoinUtils;
@@ -476,6 +477,19 @@ public Boolean visitAbstractPhysicalSort(AbstractPhysicalSort<? extends Plan> so
476477
return true;
477478
}
478479

480+
@Override
481+
public Boolean visitPhysicalTopN(PhysicalTopN<? extends Plan> topN, Void context) {
482+
// process must shuffle
483+
visit(topN, context);
484+
485+
// If child is DistributionSpecGather, topN should forbid two-phase topN
486+
if (topN.getSortPhase() == SortPhase.LOCAL_SORT
487+
&& childrenProperties.get(0).getDistributionSpec().equals(DistributionSpecGather.INSTANCE)) {
488+
return false;
489+
}
490+
return true;
491+
}
492+
479493
/**
480494
* check both side real output hash key order are same or not.
481495
*

regression-test/data/nereids_rules_p0/limit_push_down/order_push_down.out

Lines changed: 63 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,12 @@ PhysicalResultSink
7575

7676
-- !cross_join_order --
7777
PhysicalResultSink
78-
--PhysicalTopN[MERGE_SORT]
79-
----PhysicalTopN[LOCAL_SORT]
80-
------NestedLoopJoin[CROSS_JOIN]
81-
--------PhysicalTopN[MERGE_SORT]
82-
----------PhysicalTopN[LOCAL_SORT]
83-
------------PhysicalOlapScan[t1]
84-
--------PhysicalOlapScan[t2]
78+
--PhysicalTopN[GATHER_SORT]
79+
----NestedLoopJoin[CROSS_JOIN]
80+
------PhysicalTopN[MERGE_SORT]
81+
--------PhysicalTopN[LOCAL_SORT]
82+
----------PhysicalOlapScan[t1]
83+
------PhysicalOlapScan[t2]
8584

8685
-- !limit_offset_sort_join --
8786
PhysicalResultSink
@@ -172,12 +171,11 @@ PhysicalResultSink
172171

173172
-- !limit_sort_window --
174173
PhysicalResultSink
175-
--PhysicalTopN[MERGE_SORT]
176-
----PhysicalTopN[LOCAL_SORT]
177-
------PhysicalWindow
178-
--------PhysicalQuickSort[MERGE_SORT]
179-
----------PhysicalQuickSort[LOCAL_SORT]
180-
------------PhysicalOlapScan[t1]
174+
--PhysicalTopN[GATHER_SORT]
175+
----PhysicalWindow
176+
------PhysicalQuickSort[MERGE_SORT]
177+
--------PhysicalQuickSort[LOCAL_SORT]
178+
----------PhysicalOlapScan[t1]
181179

182180
-- !limit_offset_window --
183181
PhysicalResultSink
@@ -191,12 +189,11 @@ PhysicalResultSink
191189

192190
-- !limit_offset_sort_window --
193191
PhysicalResultSink
194-
--PhysicalTopN[MERGE_SORT]
195-
----PhysicalTopN[LOCAL_SORT]
196-
------PhysicalWindow
197-
--------PhysicalQuickSort[MERGE_SORT]
198-
----------PhysicalQuickSort[LOCAL_SORT]
199-
------------PhysicalOlapScan[t1]
192+
--PhysicalTopN[GATHER_SORT]
193+
----PhysicalWindow
194+
------PhysicalQuickSort[MERGE_SORT]
195+
--------PhysicalQuickSort[LOCAL_SORT]
196+
----------PhysicalOlapScan[t1]
200197

201198
-- !limit_sort_filter --
202199
PhysicalResultSink
@@ -264,21 +261,19 @@ PhysicalResultSink
264261

265262
-- !limit_window --
266263
PhysicalResultSink
267-
--PhysicalTopN[MERGE_SORT]
268-
----PhysicalTopN[LOCAL_SORT]
269-
------PhysicalWindow
270-
--------PhysicalQuickSort[MERGE_SORT]
271-
----------PhysicalQuickSort[LOCAL_SORT]
272-
------------PhysicalOlapScan[t1]
264+
--PhysicalTopN[GATHER_SORT]
265+
----PhysicalWindow
266+
------PhysicalQuickSort[MERGE_SORT]
267+
--------PhysicalQuickSort[LOCAL_SORT]
268+
----------PhysicalOlapScan[t1]
273269

274270
-- !limit_offset_window --
275271
PhysicalResultSink
276-
--PhysicalTopN[MERGE_SORT]
277-
----PhysicalTopN[LOCAL_SORT]
278-
------PhysicalWindow
279-
--------PhysicalQuickSort[MERGE_SORT]
280-
----------PhysicalQuickSort[LOCAL_SORT]
281-
------------PhysicalOlapScan[t1]
272+
--PhysicalTopN[GATHER_SORT]
273+
----PhysicalWindow
274+
------PhysicalQuickSort[MERGE_SORT]
275+
--------PhysicalQuickSort[LOCAL_SORT]
276+
----------PhysicalOlapScan[t1]
282277

283278
-- !limit_filter --
284279
PhysicalResultSink
@@ -334,12 +329,11 @@ PhysicalResultSink
334329

335330
-- !limit_subquery_window --
336331
PhysicalResultSink
337-
--PhysicalTopN[MERGE_SORT]
338-
----PhysicalTopN[LOCAL_SORT]
339-
------PhysicalWindow
340-
--------PhysicalQuickSort[MERGE_SORT]
341-
----------PhysicalQuickSort[LOCAL_SORT]
342-
------------PhysicalOlapScan[t1]
332+
--PhysicalTopN[GATHER_SORT]
333+
----PhysicalWindow
334+
------PhysicalQuickSort[MERGE_SORT]
335+
--------PhysicalQuickSort[LOCAL_SORT]
336+
----------PhysicalOlapScan[t1]
343337

344338
-- !limit_nested_subquery --
345339
PhysicalResultSink
@@ -384,18 +378,16 @@ PhysicalResultSink
384378
--PhysicalTopN[MERGE_SORT]
385379
----PhysicalTopN[LOCAL_SORT]
386380
------PhysicalUnion
387-
--------PhysicalTopN[MERGE_SORT]
388-
----------PhysicalTopN[LOCAL_SORT]
389-
------------PhysicalWindow
390-
--------------PhysicalQuickSort[MERGE_SORT]
391-
----------------PhysicalQuickSort[LOCAL_SORT]
392-
------------------PhysicalOlapScan[t1]
393-
--------PhysicalTopN[MERGE_SORT]
394-
----------PhysicalTopN[LOCAL_SORT]
395-
------------PhysicalWindow
396-
--------------PhysicalQuickSort[MERGE_SORT]
397-
----------------PhysicalQuickSort[LOCAL_SORT]
398-
------------------PhysicalOlapScan[t2]
381+
--------PhysicalTopN[GATHER_SORT]
382+
----------PhysicalWindow
383+
------------PhysicalQuickSort[MERGE_SORT]
384+
--------------PhysicalQuickSort[LOCAL_SORT]
385+
----------------PhysicalOlapScan[t1]
386+
--------PhysicalTopN[GATHER_SORT]
387+
----------PhysicalWindow
388+
------------PhysicalQuickSort[MERGE_SORT]
389+
--------------PhysicalQuickSort[LOCAL_SORT]
390+
----------------PhysicalOlapScan[t2]
399391

400392
-- !limit_subquery_join_filter --
401393
PhysicalResultSink
@@ -533,12 +525,11 @@ PhysicalCteAnchor ( cteId=CTEId#0 )
533525
----filter((t1.id < 10))
534526
------PhysicalOlapScan[t1]
535527
--PhysicalResultSink
536-
----PhysicalTopN[MERGE_SORT]
537-
------PhysicalTopN[LOCAL_SORT]
538-
--------PhysicalWindow
539-
----------PhysicalQuickSort[MERGE_SORT]
540-
------------PhysicalQuickSort[LOCAL_SORT]
541-
--------------PhysicalCteConsumer ( cteId=CTEId#0 )
528+
----PhysicalTopN[GATHER_SORT]
529+
------PhysicalWindow
530+
--------PhysicalQuickSort[MERGE_SORT]
531+
----------PhysicalQuickSort[LOCAL_SORT]
532+
------------PhysicalCteConsumer ( cteId=CTEId#0 )
542533

543534
-- !limit_project_filter --
544535
PhysicalResultSink
@@ -567,12 +558,11 @@ PhysicalResultSink
567558

568559
-- !limit_subquery_window --
569560
PhysicalResultSink
570-
--PhysicalTopN[MERGE_SORT]
571-
----PhysicalTopN[LOCAL_SORT]
572-
------PhysicalWindow
573-
--------PhysicalQuickSort[MERGE_SORT]
574-
----------PhysicalQuickSort[LOCAL_SORT]
575-
------------PhysicalOlapScan[t1]
561+
--PhysicalTopN[GATHER_SORT]
562+
----PhysicalWindow
563+
------PhysicalQuickSort[MERGE_SORT]
564+
--------PhysicalQuickSort[LOCAL_SORT]
565+
----------PhysicalOlapScan[t1]
576566

577567
-- !limit_nested_subquery --
578568
PhysicalResultSink
@@ -589,13 +579,12 @@ PhysicalResultSink
589579

590580
-- !limit_cross_join --
591581
PhysicalResultSink
592-
--PhysicalTopN[MERGE_SORT]
593-
----PhysicalTopN[LOCAL_SORT]
594-
------NestedLoopJoin[CROSS_JOIN]
595-
--------PhysicalTopN[MERGE_SORT]
596-
----------PhysicalTopN[LOCAL_SORT]
597-
------------PhysicalOlapScan[t1]
598-
--------PhysicalOlapScan[t2]
582+
--PhysicalTopN[GATHER_SORT]
583+
----NestedLoopJoin[CROSS_JOIN]
584+
------PhysicalTopN[MERGE_SORT]
585+
--------PhysicalTopN[LOCAL_SORT]
586+
----------PhysicalOlapScan[t1]
587+
------PhysicalOlapScan[t2]
599588

600589
-- !limit_multiple_left_outer_join --
601590
PhysicalResultSink
@@ -633,13 +622,12 @@ PhysicalResultSink
633622

634623
-- !limit_subquery_cross_join --
635624
PhysicalResultSink
636-
--PhysicalTopN[MERGE_SORT]
637-
----PhysicalTopN[LOCAL_SORT]
638-
------NestedLoopJoin[CROSS_JOIN]
639-
--------PhysicalTopN[MERGE_SORT]
640-
----------PhysicalTopN[LOCAL_SORT]
641-
------------PhysicalOlapScan[t1]
642-
--------PhysicalOlapScan[t2]
625+
--PhysicalTopN[GATHER_SORT]
626+
----NestedLoopJoin[CROSS_JOIN]
627+
------PhysicalTopN[MERGE_SORT]
628+
--------PhysicalTopN[LOCAL_SORT]
629+
----------PhysicalOlapScan[t1]
630+
------PhysicalOlapScan[t2]
643631

644632
-- !limit_subquery_multiple_join --
645633
PhysicalResultSink

regression-test/data/nereids_rules_p0/push_down_top_n/push_down_top_n_through_union.out

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,14 @@ PhysicalResultSink
106106
--PhysicalTopN[MERGE_SORT]
107107
----PhysicalTopN[LOCAL_SORT]
108108
------PhysicalUnion
109-
--------PhysicalTopN[MERGE_SORT]
110-
----------PhysicalTopN[LOCAL_SORT]
111-
------------PhysicalLimit[GLOBAL]
112-
--------------PhysicalLimit[LOCAL]
113-
----------------PhysicalOlapScan[table1]
114-
--------PhysicalTopN[MERGE_SORT]
115-
----------PhysicalTopN[LOCAL_SORT]
116-
------------PhysicalLimit[GLOBAL]
117-
--------------PhysicalLimit[LOCAL]
118-
----------------PhysicalOlapScan[table1]
109+
--------PhysicalTopN[GATHER_SORT]
110+
----------PhysicalLimit[GLOBAL]
111+
------------PhysicalLimit[LOCAL]
112+
--------------PhysicalOlapScan[table1]
113+
--------PhysicalTopN[GATHER_SORT]
114+
----------PhysicalLimit[GLOBAL]
115+
------------PhysicalLimit[LOCAL]
116+
--------------PhysicalOlapScan[table1]
119117

120118
-- !push_down_topn_union_complex_conditions --
121119
PhysicalResultSink

0 commit comments

Comments
 (0)