[fix](projection)sort node's unmaterialized slots should be removed from resolvedTupleExprs (#12963)

This commit is contained in:
starocean999
2022-09-27 11:46:44 +08:00
committed by GitHub
parent 429ac929fb
commit a6db5e63df
3 changed files with 18 additions and 2 deletions

View File

@ -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<SlotDescriptor> 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<SlotId> computeInputSlotIds(Analyzer analyzer) throws NotImplementedException {
List<SlotDescriptor> slotDescriptorList = this.info.getSortTupleDescriptor().getSlots();
List<Expr> 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<SlotId> result = Lists.newArrayList();
Expr.getIds(resolvedTupleExprs, null, result);
Expr.getIds(materializedTupleExprs, null, result);
return new HashSet<>(result);
}

View File

@ -12,3 +12,6 @@
2
3
-- !sql4 --
1

View File

@ -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;
"""
}