From a6db5e63df3eacf07c889e42e7491903f76654ba Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Tue, 27 Sep 2022 11:46:44 +0800 Subject: [PATCH] [fix](projection)sort node's unmaterialized slots should be removed from resolvedTupleExprs (#12963) --- .../main/java/org/apache/doris/planner/SortNode.java | 12 ++++++++++-- .../data/query_p0/subquery/test_subquery.out | 3 +++ .../suites/query_p0/subquery/test_subquery.groovy | 5 +++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java index dbd532d4e0..d1218e6191 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java @@ -45,6 +45,7 @@ import com.google.common.collect.Lists; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -247,6 +248,12 @@ public class SortNode extends PlanNode { TSortInfo sortInfo = info.toThrift(); Preconditions.checkState(tupleIds.size() == 1, "Incorrect size for tupleIds in SortNode"); if (resolvedTupleExprs != null) { + List slotDescriptorList = this.info.getSortTupleDescriptor().getSlots(); + for (int i = slotDescriptorList.size() - 1; i >= 0; i--) { + if (!slotDescriptorList.get(i).isMaterialized()) { + resolvedTupleExprs.remove(i); + } + } sortInfo.setSortTupleSlotExprs(Expr.treesToThrift(resolvedTupleExprs)); } TSortNode sortNode = new TSortNode(sortInfo, useTopN); @@ -274,13 +281,14 @@ public class SortNode extends PlanNode { @Override public Set computeInputSlotIds(Analyzer analyzer) throws NotImplementedException { List slotDescriptorList = this.info.getSortTupleDescriptor().getSlots(); + List materializedTupleExprs = new ArrayList<>(resolvedTupleExprs); for (int i = slotDescriptorList.size() - 1; i >= 0; i--) { if (!slotDescriptorList.get(i).isMaterialized()) { - resolvedTupleExprs.remove(i); + materializedTupleExprs.remove(i); } } List result = Lists.newArrayList(); - Expr.getIds(resolvedTupleExprs, null, result); + Expr.getIds(materializedTupleExprs, null, result); return new HashSet<>(result); } diff --git a/regression-test/data/query_p0/subquery/test_subquery.out b/regression-test/data/query_p0/subquery/test_subquery.out index 7e6eb1ea5b..b9941ebf23 100644 --- a/regression-test/data/query_p0/subquery/test_subquery.out +++ b/regression-test/data/query_p0/subquery/test_subquery.out @@ -12,3 +12,6 @@ 2 3 +-- !sql4 -- +1 + diff --git a/regression-test/suites/query_p0/subquery/test_subquery.groovy b/regression-test/suites/query_p0/subquery/test_subquery.groovy index f52f0caff2..1044259929 100644 --- a/regression-test/suites/query_p0/subquery/test_subquery.groovy +++ b/regression-test/suites/query_p0/subquery/test_subquery.groovy @@ -36,4 +36,9 @@ suite("test_subquery") { SELECT k1 FROM test_query_db.test GROUP BY k1 HAVING k1 IN (SELECT k1 FROM test_query_db.baseall WHERE k2 >= (SELECT min(k3) FROM test_query_db.bigtable WHERE k2 = baseall.k2)) order by k1; """ + + qt_sql4 """ + select /*+SET_VAR(enable_projection=false) */ + count() from (select k2, k1 from test_query_db.baseall order by k1 limit 1) a; + """ }