diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/FileScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/FileScanNode.java index 1213c1c03f2f76..48c4a9ff3f476c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/FileScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/FileScanNode.java @@ -70,7 +70,6 @@ public abstract class FileScanNode extends ExternalScanNode { protected long totalFileSize = 0; protected long totalPartitionNum = 0; protected long fileSplitSize; - public long rowCount = 0; public FileScanNode(PlanNodeId id, TupleDescriptor desc, String planNodeName, StatisticalType statisticalType, boolean needCheckColumnPriv) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/source/IcebergScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/source/IcebergScanNode.java index f5110ac5bb021b..be30921e46a0b2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/source/IcebergScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/source/IcebergScanNode.java @@ -75,6 +75,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -209,12 +210,6 @@ private List doGetSplits() throws UserException { HashSet partitionPathSet = new HashSet<>(); boolean isPartitionedTable = icebergTable.spec().isPartitioned(); - long rowCount = getCountFromSnapshot(); - if (getPushDownAggNoGroupingOp().equals(TPushAggOp.COUNT) && rowCount >= 0) { - this.rowCount = rowCount; - return new ArrayList<>(); - } - CloseableIterable fileScanTasks = TableScanUtil.splitFiles(scan.planFiles(), splitSize); try (CloseableIterable combinedScanTasks = TableScanUtil.planTasks(fileScanTasks, splitSize, 1, 0)) { @@ -268,6 +263,12 @@ private List doGetSplits() throws UserException { throw new UserException(e.getMessage(), e.getCause()); } + TPushAggOp aggOp = getPushDownAggNoGroupingOp(); + if (aggOp.equals(TPushAggOp.COUNT) && getCountFromSnapshot() >= 0) { + // we can create a special empty split and skip the plan process + return splits.isEmpty() ? splits : Collections.singletonList(splits.get(0)); + } + selectedPartitionNum = partitionPathSet.size(); return splits; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java index 046686255c1489..f307f14d78f140 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java @@ -27,7 +27,6 @@ import org.apache.doris.common.Pair; import org.apache.doris.common.UserException; import org.apache.doris.common.profile.SummaryProfile; -import org.apache.doris.datasource.iceberg.source.IcebergScanNode; import org.apache.doris.mysql.FieldInfo; import org.apache.doris.nereids.CascadesContext.Lock; import org.apache.doris.nereids.exceptions.AnalysisException; @@ -58,20 +57,16 @@ import org.apache.doris.nereids.trees.plans.distribute.FragmentIdMapping; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalSqlCache; -import org.apache.doris.nereids.trees.plans.physical.PhysicalHashAggregate; import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan; import org.apache.doris.nereids.trees.plans.physical.PhysicalRelation; -import org.apache.doris.nereids.trees.plans.physical.PhysicalResultSink; import org.apache.doris.nereids.trees.plans.physical.PhysicalSqlCache; import org.apache.doris.nereids.trees.plans.physical.TopnFilter; import org.apache.doris.planner.PlanFragment; import org.apache.doris.planner.Planner; import org.apache.doris.planner.RuntimeFilter; import org.apache.doris.planner.ScanNode; -import org.apache.doris.qe.CommonResultSet; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ResultSet; -import org.apache.doris.qe.ResultSetMetaData; import org.apache.doris.qe.SessionVariable; import com.google.common.annotations.VisibleForTesting; @@ -81,7 +76,6 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Function; @@ -633,23 +627,7 @@ public Optional handleQueryInFe(StatementBase parsedStmt) { } } - if (physicalPlan instanceof PhysicalResultSink - && physicalPlan.child(0) instanceof PhysicalHashAggregate && !getScanNodes().isEmpty() - && getScanNodes().get(0) instanceof IcebergScanNode) { - List columns = Lists.newArrayList(); - NamedExpression output = physicalPlan.getOutput().get(0); - columns.add(new Column(output.getName(), output.getDataType().toCatalogDataType())); - if (((IcebergScanNode) getScanNodes().get(0)).rowCount > 0) { - ResultSetMetaData metadata = new CommonResultSet.CommonResultSetMetaData(columns); - ResultSet resultSet = new CommonResultSet(metadata, Collections.singletonList( - Lists.newArrayList(String.valueOf(((IcebergScanNode) getScanNodes().get(0)).rowCount)))); - // only support one iceberg scan node and one count, e.g. select count(*) from icetbl; - return Optional.of(resultSet); - } - return Optional.empty(); - } else { - return Optional.empty(); - } + return Optional.empty(); } private void setFormatOptions() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java index 284ad449b1ab16..acde5f8f37cb20 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java @@ -41,7 +41,6 @@ import org.apache.doris.common.Config; import org.apache.doris.common.FormatOptions; import org.apache.doris.common.UserException; -import org.apache.doris.datasource.iceberg.source.IcebergScanNode; import org.apache.doris.qe.CommonResultSet; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ResultSet; @@ -637,25 +636,13 @@ public Optional handleQueryInFe(StatementBase parsedStmt) { return Optional.empty(); } SelectStmt parsedSelectStmt = (SelectStmt) parsedStmt; + if (!parsedSelectStmt.getTableRefs().isEmpty()) { + return Optional.empty(); + } List selectItems = parsedSelectStmt.getSelectList().getItems(); List columns = new ArrayList<>(selectItems.size()); List columnLabels = parsedSelectStmt.getColLabels(); List data = new ArrayList<>(); - if ((singleNodePlanner.getScanNodes().size() > 0 && singleNodePlanner.getScanNodes().get(0) - instanceof IcebergScanNode) && (((IcebergScanNode) getScanNodes().get(0)).rowCount > 0)) { - SelectListItem item = selectItems.get(0); - Expr expr = item.getExpr(); - String columnName = columnLabels.get(0); - columns.add(new Column(columnName, expr.getType())); - data.add(String.valueOf(((IcebergScanNode) getScanNodes().get(0)).rowCount)); - ResultSetMetaData metadata = new CommonResultSet.CommonResultSetMetaData(columns); - ResultSet resultSet = new CommonResultSet(metadata, Collections.singletonList(data)); - // only support one iceberg scan node and one count, e.g. select count(*) from icetbl; - return Optional.of(resultSet); - } - if (!parsedSelectStmt.getTableRefs().isEmpty()) { - return Optional.empty(); - } FormatOptions options = FormatOptions.getDefault(); for (int i = 0; i < selectItems.size(); i++) { SelectListItem item = selectItems.get(i);