You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2024/03/06 05:09:13 UTC
(doris) 02/47: [feature](Nereids) parallel output file (#31623)
This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
commit e2ebf9d5662010bed920bb96216bbc1eab46061a
Author: morrySnow <10...@users.noreply.github.com>
AuthorDate: Mon Mar 4 12:14:07 2024 +0800
[feature](Nereids) parallel output file (#31623)
legacy planner impl PR: #6539
---
.../org/apache/doris/analysis/OutFileClause.java | 2 +-
.../java/org/apache/doris/analysis/SlotRef.java | 2 +-
.../glue/translator/PhysicalPlanTranslator.java | 62 ++++++++++++++++++----
.../nereids/properties/RequestPropertyDeriver.java | 2 +-
.../trees/plans/physical/PhysicalFileSink.java | 17 ++++++
.../org/apache/doris/planner/OriginalPlanner.java | 39 +-------------
.../org/apache/doris/planner/ResultFileSink.java | 45 ++++++++++++++++
.../apache/doris/analysis/StmtRewriterTest.java | 12 ++---
.../doris/planner/TableFunctionPlanTest.java | 6 +--
.../org/apache/doris/qe/OlapQueryCacheTest.java | 12 ++---
.../suites/demo_p0/explain_action.groovy | 2 +-
.../suites/export_p0/test_outfile.groovy | 5 +-
.../suites/nereids_p0/outfile/test_outfile.groovy | 5 +-
13 files changed, 141 insertions(+), 70 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/OutFileClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/OutFileClause.java
index cc2ee8ef10a..c0af252d9eb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/OutFileClause.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/OutFileClause.java
@@ -129,7 +129,7 @@ public class OutFileClause {
private static final String HADOOP_FS_PROP_PREFIX = "dfs.";
private static final String HADOOP_PROP_PREFIX = "hadoop.";
private static final String BROKER_PROP_PREFIX = "broker.";
- private static final String PROP_BROKER_NAME = "broker.name";
+ public static final String PROP_BROKER_NAME = "broker.name";
public static final String PROP_COLUMN_SEPARATOR = "column_separator";
public static final String PROP_LINE_DELIMITER = "line_delimiter";
public static final String PROP_MAX_FILE_SIZE = "max_file_size";
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
index 29087b4bb80..55cb0b07fa3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
@@ -94,7 +94,7 @@ public class SlotRef extends Expr {
this.desc = desc;
this.type = desc.getType();
// TODO(zc): label is meaningful
- this.label = null;
+ this.label = desc.getLabel();
if (this.type.equals(Type.CHAR)) {
this.type = Type.VARCHAR;
}
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 1be1a6c7630..929bbdb23ca 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
@@ -245,10 +245,12 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
*/
public PlanFragment translatePlan(PhysicalPlan physicalPlan) {
PlanFragment rootFragment = physicalPlan.accept(this, context);
- List<Expr> outputExprs = Lists.newArrayList();
- physicalPlan.getOutput().stream().map(Slot::getExprId)
- .forEach(exprId -> outputExprs.add(context.findSlotRef(exprId)));
- rootFragment.setOutputExprs(outputExprs);
+ if (CollectionUtils.isEmpty(rootFragment.getOutputExprs())) {
+ List<Expr> outputExprs = Lists.newArrayList();
+ physicalPlan.getOutput().stream().map(Slot::getExprId)
+ .forEach(exprId -> outputExprs.add(context.findSlotRef(exprId)));
+ rootFragment.setOutputExprs(outputExprs);
+ }
Collections.reverse(context.getPlanFragments());
// TODO: maybe we need to trans nullable directly? and then we could remove call computeMemLayout
context.getDescTable().computeMemLayout();
@@ -369,8 +371,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
public PlanFragment visitPhysicalResultSink(PhysicalResultSink<? extends Plan> physicalResultSink,
PlanTranslatorContext context) {
PlanFragment planFragment = physicalResultSink.child().accept(this, context);
- TResultSinkType resultSinkType = context.getConnectContext() != null ? context.getConnectContext()
- .getResultSinkType() : null;
+ TResultSinkType resultSinkType = context.getConnectContext() != null
+ ? context.getConnectContext().getResultSinkType() : null;
planFragment.setSink(new ResultSink(planFragment.getPlanRoot().getId(), resultSinkType));
return planFragment;
}
@@ -426,7 +428,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
@Override
public PlanFragment visitPhysicalFileSink(PhysicalFileSink<? extends Plan> fileSink,
PlanTranslatorContext context) {
- PlanFragment rootFragment = fileSink.child().accept(this, context);
+ PlanFragment sinkFragment = fileSink.child().accept(this, context);
OutFileClause outFile = new OutFileClause(
fileSink.getFilePath(),
fileSink.getFormat(),
@@ -436,7 +438,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
List<Expr> outputExprs = Lists.newArrayList();
fileSink.getOutput().stream().map(Slot::getExprId)
.forEach(exprId -> outputExprs.add(context.findSlotRef(exprId)));
- rootFragment.setOutputExprs(outputExprs);
+ sinkFragment.setOutputExprs(outputExprs);
// generate colLabels
List<String> labels = fileSink.getOutput().stream().map(NamedExpression::getName).collect(Collectors.toList());
@@ -447,11 +449,49 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
} catch (Exception e) {
throw new AnalysisException(e.getMessage(), e.getCause());
}
- ResultFileSink sink = new ResultFileSink(rootFragment.getPlanRoot().getId(), outFile,
+ ResultFileSink resultFileSink = new ResultFileSink(sinkFragment.getPlanRoot().getId(), outFile,
(ArrayList<String>) labels);
- rootFragment.setSink(sink);
- return rootFragment;
+ sinkFragment.setSink(resultFileSink);
+
+ // TODO: do parallel sink, we should do it in Nereids, but now we impl here temporarily
+ // because impl in Nereids affect too many things
+ if (fileSink.requestProperties(context.getConnectContext()).equals(PhysicalProperties.GATHER)) {
+ return sinkFragment;
+ } else {
+ // create output tuple
+ TupleDescriptor fileStatusDesc = ResultFileSink.constructFileStatusTupleDesc(context.getDescTable());
+
+ // create exchange node
+ ExchangeNode exchangeNode = new ExchangeNode(context.nextPlanNodeId(), sinkFragment.getPlanRoot());
+ exchangeNode.setPartitionType(TPartitionType.UNPARTITIONED);
+ exchangeNode.setNumInstances(1);
+
+ // create final result sink
+ TResultSinkType resultSinkType = context.getConnectContext() != null
+ ? context.getConnectContext().getResultSinkType() : null;
+ ResultSink resultSink = new ResultSink(exchangeNode.getId(), resultSinkType);
+
+ // create top fragment
+ PlanFragment topFragment = new PlanFragment(context.nextFragmentId(), exchangeNode,
+ DataPartition.UNPARTITIONED);
+ topFragment.addChild(sinkFragment);
+ topFragment.setSink(resultSink);
+ context.addPlanFragment(topFragment);
+
+ // update sink fragment and result file sink
+ DataStreamSink streamSink = new DataStreamSink(exchangeNode.getId());
+ streamSink.setOutputPartition(DataPartition.UNPARTITIONED);
+ resultFileSink.resetByDataStreamSink(streamSink);
+ resultFileSink.setOutputTupleId(fileStatusDesc.getId());
+ sinkFragment.setDestination(exchangeNode);
+
+ // set out expr and tuple correct
+ exchangeNode.resetTupleIds(Lists.newArrayList(fileStatusDesc.getId()));
+ topFragment.resetOutputExprs(fileStatusDesc);
+
+ return topFragment;
+ }
}
/* ********************************************************************************************
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
index bd85cff4e83..72df678b120 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
@@ -331,7 +331,7 @@ public class RequestPropertyDeriver extends PlanVisitor<Void, PlanContext> {
@Override
public Void visitPhysicalFileSink(PhysicalFileSink<? extends Plan> fileSink, PlanContext context) {
- addRequestPropertyToChildren(PhysicalProperties.GATHER);
+ addRequestPropertyToChildren(fileSink.requestProperties(connectContext));
return null;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
index bc184471185..30eaf9cb04e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileSink.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.trees.plans.physical;
+import org.apache.doris.analysis.OutFileClause;
import org.apache.doris.nereids.memo.GroupExpression;
import org.apache.doris.nereids.properties.LogicalProperties;
import org.apache.doris.nereids.properties.PhysicalProperties;
@@ -27,6 +28,7 @@ import org.apache.doris.nereids.trees.plans.PlanType;
import org.apache.doris.nereids.trees.plans.algebra.Sink;
import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
import org.apache.doris.nereids.util.Utils;
+import org.apache.doris.qe.ConnectContext;
import org.apache.doris.statistics.Statistics;
import com.google.common.base.Preconditions;
@@ -83,6 +85,21 @@ public class PhysicalFileSink<CHILD_TYPE extends Plan> extends PhysicalSink<CHIL
return properties;
}
+ /**
+ * if enable parallel outfile and not broker export, we should request any here.
+ * and it will add a top fragment to summary export result in PhysicalPlanTranslator.
+ */
+ public PhysicalProperties requestProperties(ConnectContext ctx) {
+ if (!ctx.getSessionVariable().enableParallelOutfile
+ || ctx.getSessionVariable().getEnablePipelineEngine()
+ || ctx.getSessionVariable().getEnablePipelineXEngine()
+ || properties.containsKey(OutFileClause.PROP_BROKER_NAME)) {
+ return PhysicalProperties.GATHER;
+ }
+ // come here means we turn on parallel output export
+ return PhysicalProperties.ANY;
+ }
+
@Override
public Plan withChildren(List<Plan> children) {
Preconditions.checkArgument(children.size() == 1, "PhysicalFileSink only accepts one child");
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 0b3fbb9eb5f..db327bddcb9 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
@@ -37,8 +37,6 @@ import org.apache.doris.analysis.TupleDescriptor;
import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.Env;
import org.apache.doris.catalog.OlapTable;
-import org.apache.doris.catalog.PrimitiveType;
-import org.apache.doris.catalog.ScalarType;
import org.apache.doris.catalog.Type;
import org.apache.doris.common.Config;
import org.apache.doris.common.UserException;
@@ -385,7 +383,7 @@ public class OriginalPlanner extends Planner {
return;
}
// create result file sink desc
- TupleDescriptor fileStatusDesc = constructFileStatusTupleDesc(analyzer);
+ TupleDescriptor fileStatusDesc = ResultFileSink.constructFileStatusTupleDesc(analyzer.getDescTbl());
resultFileSink.resetByDataStreamSink((DataStreamSink) secondPlanFragment.getSink());
resultFileSink.setOutputTupleId(fileStatusDesc.getId());
secondPlanFragment.setOutputExprs(topPlanFragment.getOutputExprs());
@@ -554,41 +552,6 @@ public class OriginalPlanner extends Planner {
}
}
- /**
- * Construct a tuple for file status, the tuple schema as following:
- * | FileNumber | Int |
- * | TotalRows | Bigint |
- * | FileSize | Bigint |
- * | URL | Varchar |
- */
- private TupleDescriptor constructFileStatusTupleDesc(Analyzer analyzer) {
- TupleDescriptor resultFileStatusTupleDesc =
- analyzer.getDescTbl().createTupleDescriptor("result_file_status");
- resultFileStatusTupleDesc.setIsMaterialized(true);
- SlotDescriptor fileNumber = analyzer.getDescTbl().addSlotDescriptor(resultFileStatusTupleDesc);
- fileNumber.setLabel("FileNumber");
- fileNumber.setType(ScalarType.createType(PrimitiveType.INT));
- fileNumber.setIsMaterialized(true);
- fileNumber.setIsNullable(false);
- SlotDescriptor totalRows = analyzer.getDescTbl().addSlotDescriptor(resultFileStatusTupleDesc);
- totalRows.setLabel("TotalRows");
- totalRows.setType(ScalarType.createType(PrimitiveType.BIGINT));
- totalRows.setIsMaterialized(true);
- totalRows.setIsNullable(false);
- SlotDescriptor fileSize = analyzer.getDescTbl().addSlotDescriptor(resultFileStatusTupleDesc);
- fileSize.setLabel("FileSize");
- fileSize.setType(ScalarType.createType(PrimitiveType.BIGINT));
- fileSize.setIsMaterialized(true);
- fileSize.setIsNullable(false);
- SlotDescriptor url = analyzer.getDescTbl().addSlotDescriptor(resultFileStatusTupleDesc);
- url.setLabel("URL");
- url.setType(ScalarType.createType(PrimitiveType.VARCHAR));
- url.setIsMaterialized(true);
- url.setIsNullable(false);
- resultFileStatusTupleDesc.computeStatAndMemLayout();
- return resultFileStatusTupleDesc;
- }
-
private static class QueryStatisticsTransferOptimizer {
private final PlanFragment root;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ResultFileSink.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ResultFileSink.java
index d9213360583..631339c3732 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/ResultFileSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ResultFileSink.java
@@ -17,9 +17,15 @@
package org.apache.doris.planner;
+import org.apache.doris.analysis.DescriptorTable;
import org.apache.doris.analysis.OutFileClause;
+import org.apache.doris.analysis.SlotDescriptor;
import org.apache.doris.analysis.StorageBackend;
+import org.apache.doris.analysis.TupleDescriptor;
import org.apache.doris.analysis.TupleId;
+import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.ScalarType;
import org.apache.doris.common.util.FileFormatConstants;
import org.apache.doris.thrift.TDataSink;
import org.apache.doris.thrift.TDataSinkType;
@@ -136,4 +142,43 @@ public class ResultFileSink extends DataSink {
public DataPartition getOutputPartition() {
return outputPartition;
}
+
+ /**
+ * Construct a tuple for file status, the tuple schema as following:
+ * | FileNumber | Int |
+ * | TotalRows | Bigint |
+ * | FileSize | Bigint |
+ * | URL | Varchar |
+ */
+ public static TupleDescriptor constructFileStatusTupleDesc(DescriptorTable descriptorTable) {
+ TupleDescriptor resultFileStatusTupleDesc =
+ descriptorTable.createTupleDescriptor("result_file_status");
+ resultFileStatusTupleDesc.setIsMaterialized(true);
+ SlotDescriptor fileNumber = descriptorTable.addSlotDescriptor(resultFileStatusTupleDesc);
+ fileNumber.setLabel("FileNumber");
+ fileNumber.setType(ScalarType.createType(PrimitiveType.INT));
+ fileNumber.setColumn(new Column("FileNumber", ScalarType.createType(PrimitiveType.INT)));
+ fileNumber.setIsMaterialized(true);
+ fileNumber.setIsNullable(false);
+ SlotDescriptor totalRows = descriptorTable.addSlotDescriptor(resultFileStatusTupleDesc);
+ totalRows.setLabel("TotalRows");
+ totalRows.setType(ScalarType.createType(PrimitiveType.BIGINT));
+ totalRows.setColumn(new Column("TotalRows", ScalarType.createType(PrimitiveType.BIGINT)));
+ totalRows.setIsMaterialized(true);
+ totalRows.setIsNullable(false);
+ SlotDescriptor fileSize = descriptorTable.addSlotDescriptor(resultFileStatusTupleDesc);
+ fileSize.setLabel("FileSize");
+ fileSize.setType(ScalarType.createType(PrimitiveType.BIGINT));
+ fileSize.setColumn(new Column("FileSize", ScalarType.createType(PrimitiveType.BIGINT)));
+ fileSize.setIsMaterialized(true);
+ fileSize.setIsNullable(false);
+ SlotDescriptor url = descriptorTable.addSlotDescriptor(resultFileStatusTupleDesc);
+ url.setLabel("URL");
+ url.setType(ScalarType.createType(PrimitiveType.VARCHAR));
+ url.setColumn(new Column("URL", ScalarType.createType(PrimitiveType.VARCHAR)));
+ url.setIsMaterialized(true);
+ url.setIsNullable(false);
+ resultFileStatusTupleDesc.computeStatAndMemLayout();
+ return resultFileStatusTupleDesc;
+ }
}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
index be770538c3b..79589942147 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
@@ -264,7 +264,7 @@ public class StmtRewriterTest {
+ subquery + ") order by a;";
LOG.info("EXPLAIN:{}", dorisAssert.query(query).explainQuery());
dorisAssert.query(query).explainContains("CROSS JOIN",
- "order by: <slot 10> `$a$1`.`$c$1` ASC");
+ "order by: `$a$1`.`$c$1` ASC");
}
/**
@@ -376,7 +376,7 @@ public class StmtRewriterTest {
LOG.info("EXPLAIN:{}", dorisAssert.query(query).explainQuery());
dorisAssert.query(query).explainContains("group by: `empid`",
"CROSS JOIN",
- "order by: <slot 10> `$a$1`.`$c$2` ASC",
+ "order by: `$a$1`.`$c$2` ASC",
"OUTPUT EXPRS:\n <slot 11> `$a$1`.`$c$1`");
}
@@ -490,8 +490,8 @@ public class StmtRewriterTest {
LOG.info("EXPLAIN:{}", dorisAssert.query(query).explainQuery());
dorisAssert.query(query).explainContains("group by: `empid`",
"CROSS JOIN",
- "order by: <slot 10> `$a$1`.`$c$2` ASC",
- "OUTPUT EXPRS:\n <slot 11> `$a$1`.`$c$1`\n <slot 10> `$a$1`.`$c$2`");
+ "order by: `$a$1`.`$c$2` ASC",
+ "OUTPUT EXPRS:\n <slot 11> `$a$1`.`$c$1`\n `$a$1`.`$c$2`");
}
/**
@@ -603,8 +603,8 @@ public class StmtRewriterTest {
LOG.info("EXPLAIN:{}", dorisAssert.query(query).explainQuery());
dorisAssert.query(query).explainContains("group by: `empid`",
"CROSS JOIN",
- "order by: <slot 10> `$a$1`.`$c$2` ASC",
- "OUTPUT EXPRS:\n <slot 11> `$a$1`.`$c$1`\n <slot 10> `$a$1`.`$c$2`");
+ "order by: `$a$1`.`$c$2` ASC",
+ "OUTPUT EXPRS:\n <slot 11> `$a$1`.`$c$1`\n `$a$1`.`$c$2`");
}
/**
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
index a9698080219..c22744cfe5d 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
@@ -380,7 +380,7 @@ public class TableFunctionPlanTest {
String sql = "desc verbose select /*+ SET_VAR(enable_nereids_planner=false) */ e1 from (select k2 as c1 from db1.tbl1 group by c1) a lateral view explode_split(c1, \",\") tmp1 as e1 ";
String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true);
Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 2, "TABLE FUNCTION NODE"));
- Assert.assertTrue(explainString.contains("table function: explode_split( `k2`, ',')"));
+ Assert.assertTrue(explainString.contains("table function: explode_split(`k2`, ',')"));
Assert.assertTrue(explainString.contains("lateral view tuple id: 3"));
Assert.assertTrue(explainString.contains("output slot id: 3"));
Assert.assertTrue(explainString.contains("tuple ids: 1 3"));
@@ -397,7 +397,7 @@ public class TableFunctionPlanTest {
+ "lateral view explode_split(c2, \",\") tmp1 as e1";
String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true);
Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 2, "TABLE FUNCTION NODE"));
- Assert.assertTrue(explainString.contains("table function: explode_split(<slot 3> min(`k2`), ',')"));
+ Assert.assertTrue(explainString.contains("table function: explode_split(min(`k2`), ',')"));
Assert.assertTrue(explainString.contains("lateral view tuple id: 3"));
Assert.assertTrue(explainString.contains("output slot id: 2 6"));
Assert.assertTrue(explainString.contains("tuple ids: 1 3"));
@@ -480,7 +480,7 @@ public class TableFunctionPlanTest {
+ "lateral view explode_split(c2, \",\") tmp1 as e1) tmp2";
String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true);
Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 2, "TABLE FUNCTION NODE"));
- Assert.assertTrue(explainString.contains("table function: explode_split(<slot 3> min(`k2`), ',')"));
+ Assert.assertTrue(explainString.contains("table function: explode_split(min(`k2`), ',')"));
Assert.assertTrue(explainString.contains("lateral view tuple id: 3"));
Assert.assertTrue(explainString.contains("output slot id: 2"));
Assert.assertTrue(explainString.contains("tuple ids: 1 3"));
diff --git a/fe/fe-core/src/test/java/org/apache/doris/qe/OlapQueryCacheTest.java b/fe/fe-core/src/test/java/org/apache/doris/qe/OlapQueryCacheTest.java
index ea02a89c2f5..9ff7042e76e 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/qe/OlapQueryCacheTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/qe/OlapQueryCacheTest.java
@@ -974,8 +974,8 @@ public class OlapQueryCacheTest {
cache.rewriteSelectStmt(null);
LOG.warn("Sub nokey={}", cache.getNokeyStmt().toSql());
Assert.assertEquals(cache.getNokeyStmt().toSql(),
- "SELECT <slot 7> `eventdate` AS `eventdate`, <slot 8> sum(`pv`) AS `sum(``pv``)` "
- + "FROM (SELECT <slot 3> `eventdate` AS `eventdate`, <slot 4> count(`userid`) AS `pv` "
+ "SELECT `eventdate` AS `eventdate`, sum(`pv`) AS `sum(``pv``)` "
+ + "FROM (SELECT `eventdate` AS `eventdate`, count(`userid`) AS `pv` "
+ "FROM `testDb`.`appevent` WHERE (`eventid` = 1) GROUP BY `eventdate`) tbl "
+ "GROUP BY `eventdate`");
@@ -996,8 +996,8 @@ public class OlapQueryCacheTest {
sql = ca.getRewriteStmt().toSql();
LOG.warn("Sub rewrite={}", sql);
Assert.assertEquals(sql,
- "SELECT <slot 7> `eventdate` AS `eventdate`, <slot 8> sum(`pv`) AS `sum(``pv``)` "
- + "FROM (SELECT <slot 3> `eventdate` AS `eventdate`, <slot 4> count(`userid`) AS `pv` "
+ "SELECT `eventdate` AS `eventdate`, sum(`pv`) AS `sum(``pv``)` "
+ + "FROM (SELECT `eventdate` AS `eventdate`, count(`userid`) AS `pv` "
+ "FROM `testDb`.`appevent` WHERE (`eventdate` > '2020-01-13') "
+ "AND (`eventdate` < '2020-01-16') AND (`eventid` = 1) GROUP BY `eventdate`) tbl "
+ "GROUP BY `eventdate`");
@@ -1050,7 +1050,7 @@ public class OlapQueryCacheTest {
SqlCache sqlCache = (SqlCache) ca.getCache();
String cacheKey = sqlCache.getSqlWithViewStmt();
- Assert.assertEquals(cacheKey, "SELECT <slot 2> `eventdate` AS `eventdate`, <slot 3> count(`userid`) "
+ Assert.assertEquals(cacheKey, "SELECT `eventdate` AS `eventdate`, count(`userid`) "
+ "AS `count(``userid``)` FROM `testDb`.`appevent` WHERE (`eventdate` >= '2020-01-12') "
+ "AND (`eventdate` <= '2020-01-14') GROUP BY `eventdate`|");
Assert.assertEquals(selectedPartitionIds.size(), sqlCache.getSumOfPartitionNum());
@@ -1219,7 +1219,7 @@ public class OlapQueryCacheTest {
Assert.assertEquals(cache.getNokeyStmt().getWhereClause(), null);
Assert.assertEquals(cache.getSqlWithViewStmt(),
"SELECT `origin`.`eventdate` AS `eventdate`, `origin`.`cnt` AS `cnt` "
- + "FROM (SELECT <slot 4> `eventdate` AS `eventdate`, <slot 5> count(`userid`) AS `cnt` "
+ + "FROM (SELECT `eventdate` AS `eventdate`, count(`userid`) AS `cnt` "
+ "FROM `testDb`.`view2` GROUP BY `eventdate`) origin|SELECT `eventdate` "
+ "AS `eventdate`, `userid` AS `userid` FROM `testDb`.`appevent`");
} catch (Exception e) {
diff --git a/regression-test/suites/demo_p0/explain_action.groovy b/regression-test/suites/demo_p0/explain_action.groovy
index 4dd65ba0da4..511b9509360 100644
--- a/regression-test/suites/demo_p0/explain_action.groovy
+++ b/regression-test/suites/demo_p0/explain_action.groovy
@@ -24,7 +24,7 @@ suite("explain_action") {
sql("select 100")
// contains("OUTPUT EXPRS:\n <slot 0> 100\n") && contains("PARTITION: UNPARTITIONED\n")
- contains "OUTPUT EXPRS:\n <slot 0> 100\n"
+ contains "OUTPUT EXPRS:\n 100\n"
contains "PARTITION: UNPARTITIONED\n"
}
diff --git a/regression-test/suites/export_p0/test_outfile.groovy b/regression-test/suites/export_p0/test_outfile.groovy
index d2ceb46c5eb..76c5bb688c4 100644
--- a/regression-test/suites/export_p0/test_outfile.groovy
+++ b/regression-test/suites/export_p0/test_outfile.groovy
@@ -209,7 +209,10 @@ suite("test_outfile") {
(4, "c"), (5, "睿"), (6, "多"), (7, "丝"), (8, "test"),
(100, "aa"), (111, "bb"), (123, "cc"), (222, "dd");"""
sql "set enable_parallel_outfile = true;"
- sql """select * from select_into_file into outfile "file://${outFilePath}/" properties("success_file_name" = "SUCCESS");"""
+ sql """select * from select_into_file into outfile "file://${outFilePath}/";"""
+ // TODO: parallel outfile is not compatible with success_file_name. remove this case temporary
+ // sql "set enable_parallel_outfile = true;"
+ // sql """select * from select_into_file into outfile "file://${outFilePath}/" properties("success_file_name" = "SUCCESS");"""
} finally {
try_sql("DROP TABLE IF EXISTS select_into_file")
File path = new File(outFilePath)
diff --git a/regression-test/suites/nereids_p0/outfile/test_outfile.groovy b/regression-test/suites/nereids_p0/outfile/test_outfile.groovy
index aa2234c5a18..1cfdd7b62ce 100644
--- a/regression-test/suites/nereids_p0/outfile/test_outfile.groovy
+++ b/regression-test/suites/nereids_p0/outfile/test_outfile.groovy
@@ -235,7 +235,10 @@ suite("test_outfile") {
(4, "c"), (5, "睿"), (6, "多"), (7, "丝"), (8, "test"),
(100, "aa"), (111, "bb"), (123, "cc"), (222, "dd");"""
sql "set enable_parallel_outfile = true;"
- sql """select * from select_into_file into outfile "file://${outFile}/" properties("success_file_name" = "SUCCESS");"""
+ sql """select * from select_into_file into outfile "file://${outFilePath}/";"""
+ // TODO: parallel outfile is not compatible with success_file_name. remove this case temporary
+ // sql "set enable_parallel_outfile = true;"
+ // sql """select * from select_into_file into outfile "file://${outFilePath}/" properties("success_file_name" = "SUCCESS");"""
} finally {
try_sql("DROP TABLE IF EXISTS select_into_file")
File path = new File(outFilePath)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org