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