diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java index 76211137c75a2b..d7840c3ff96099 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java @@ -1888,7 +1888,12 @@ private PartitionSortNode translatePartitionSortNode(PhysicalPartitionTopN sort, PlanNode childNode, PlanTranslatorContext context) { - TupleDescriptor sortTuple = generateTupleDesc(sort.child().getOutput(), null, context); + Set deferredMaterializedExprIds = sort + .getMutableState(PhysicalOlapScan.DEFERRED_MATERIALIZED_SLOTS) + .map(s -> (Set) s) + .orElse(Collections.emptySet()); + TupleDescriptor sortTuple = generateTupleDesc(sort.child().getOutput(), + null, deferredMaterializedExprIds, context); List orderingExprs = Lists.newArrayList(); List ascOrders = Lists.newArrayList(); List nullsFirstParams = Lists.newArrayList(); @@ -1900,12 +1905,10 @@ private SortNode translateSortNode(AbstractPhysicalSort sort, Pl }); SortInfo sortInfo = new SortInfo(orderingExprs, ascOrders, nullsFirstParams, sortTuple); SortNode sortNode = new SortNode(context.nextPlanNodeId(), childNode, sortInfo, sort instanceof PhysicalTopN); - if (sort.getMutableState(PhysicalTopN.TWO_PHASE_READ_OPT).isPresent()) { + if (sort.getMutableState(PhysicalOlapScan.DEFERRED_MATERIALIZED_SLOTS).isPresent()) { sortNode.setUseTwoPhaseReadOpt(true); sortNode.getSortInfo().setUseTwoPhaseRead(); injectRowIdColumnSlot(sortNode.getSortInfo().getSortTupleDescriptor()); - SlotDescriptor childRowIdDesc = sortTuple.getSlots().get(sortTuple.getSlots().size() - 1); - sortNode.getResolvedTupleExprs().add(new SlotRef(childRowIdDesc)); } if (sort.getStats() != null) { sortNode.setCardinality((long) sort.getStats().getRowCount()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/TwoPhaseReadOpt.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/TwoPhaseReadOpt.java index 72d1a7d2db77b9..93dd579e7084a7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/TwoPhaseReadOpt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/TwoPhaseReadOpt.java @@ -144,9 +144,9 @@ public PhysicalTopN visitPhysicalTopN(PhysicalTopN mergeTopN, Ca .map(Slot.class::cast) .map(NamedExpression::getExprId) .forEach(deferredMaterializedExprIds::remove); - localTopN.setMutableState(PhysicalTopN.TWO_PHASE_READ_OPT, true); - mergeTopN.setMutableState(PhysicalTopN.TWO_PHASE_READ_OPT, true); olapScan.setMutableState(PhysicalOlapScan.DEFERRED_MATERIALIZED_SLOTS, deferredMaterializedExprIds); + localTopN.setMutableState(PhysicalOlapScan.DEFERRED_MATERIALIZED_SLOTS, deferredMaterializedExprIds); + mergeTopN.setMutableState(PhysicalOlapScan.DEFERRED_MATERIALIZED_SLOTS, deferredMaterializedExprIds); return mergeTopN; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java index 559f7f2d0c8e83..272791acf0a5c8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java @@ -41,7 +41,6 @@ public class PhysicalTopN extends AbstractPhysicalSort implements TopN { public static final String TOPN_RUNTIME_FILTER = "topn_runtime_filter"; - public static final String TWO_PHASE_READ_OPT = "two_phase_read_opt"; private final long limit; private final long offset; diff --git a/regression-test/data/nereids_p0/sort/sort.out b/regression-test/data/nereids_p0/sort/sort.out index ffddb115bce80e..38326d3e23a779 100644 --- a/regression-test/data/nereids_p0/sort/sort.out +++ b/regression-test/data/nereids_p0/sort/sort.out @@ -50,3 +50,9 @@ true 2023-03-21T07:00 area1 p0 aaaaa ddddd2 100.000 100.000 100.000 100.000 2023-03-21T17:00 2023-03-21T06:00 area1 p0 aaaaa ddddd1 100.000 100.000 100.000 100.000 2023-03-21T17:00 +-- !sql -- +1 1024 +2 1024 +3 0 +4 \N + diff --git a/regression-test/suites/nereids_p0/sort/sort.groovy b/regression-test/suites/nereids_p0/sort/sort.groovy index 11f4bc5dfbaa28..0dfe4a68d7cd00 100644 --- a/regression-test/suites/nereids_p0/sort/sort.groovy +++ b/regression-test/suites/nereids_p0/sort/sort.groovy @@ -89,4 +89,22 @@ suite("sort") { """ qt_sql_orderby_non_overlap_desc """ select * from sort_non_overlap order by time_period desc limit 4; """ + + sql """ DROP TABLE if exists `sort_default_value`; """ + sql """ CREATE TABLE `sort_default_value` ( + `k1` int NOT NULL + ) ENGINE=OLAP + DUPLICATE KEY(`k1`) + DISTRIBUTED BY HASH(`k1`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "disable_auto_compaction" = "true" + ); + """ + sql "insert into sort_default_value values (1)" + sql "insert into sort_default_value values (2)" + sql """ alter table sort_default_value add column k4 INT default "1024" """ + sql "insert into sort_default_value values (3, 0)" + sql "insert into sort_default_value values (4, null)" + qt_sql "select * from sort_default_value order by k1 limit 10" }