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 <101034200+morrys...@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-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to