From 070b1ce429d31e81334e6c4e2b450b02e8bdde8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=9F=E6=88=90?= Date: Tue, 27 Oct 2020 17:53:29 +0800 Subject: [PATCH] fix union bug (#4772) --- .../main/java/org/apache/doris/planner/PlanNode.java | 11 +++++++++++ .../org/apache/doris/planner/SingleNodePlanner.java | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java index 6d62ab2889b17e..8a84c1a26732ae 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java @@ -17,6 +17,7 @@ package org.apache.doris.planner; +import com.google.common.base.Predicates; import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.ExprSubstitutionMap; @@ -223,6 +224,16 @@ public void unsetLimit() { limit = -1; } + protected List getAllScanTupleIds() { + List tupleIds = Lists.newArrayList(); + List scanNodes = Lists.newArrayList(); + collectAll(Predicates.instanceOf(ScanNode.class), scanNodes); + for(ScanNode node: scanNodes) { + tupleIds.addAll(node.getTupleIds()); + } + return tupleIds; + } + public ArrayList getTupleIds() { Preconditions.checkState(tupleIds != null); return tupleIds; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java index 8123c3f0688c27..fd81c33facf3c9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java @@ -71,6 +71,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; /** @@ -283,7 +285,8 @@ private PlanNode createQueryPlan(QueryStmt stmt, Analyzer analyzer, long default if (analyzer.hasEmptyResultSet()) { // Must clear the scanNodes, otherwise we will get NPE in Coordinator::computeScanRangeAssignment - scanNodes.clear(); + Set scanTupleIds = new HashSet<>(root.getAllScanTupleIds()); + scanNodes.removeIf(scanNode -> scanTupleIds.contains(scanNode.getTupleIds().get(0))); PlanNode node = createEmptyNode(stmt, analyzer); // Ensure result exprs will be substituted by right outputSmap node.setOutputSmap(root.outputSmap);