From 3ce1bdae84758ef9a410407bb9d8fe7a848166d8 Mon Sep 17 00:00:00 2001 From: Qi Chen Date: Thu, 2 Nov 2023 14:06:24 +0800 Subject: [PATCH] [Feature](Nereids) Add explain tree functionality. (#25446) Add explain tree functionality which contains fragment ids for profile analysis. ``` mysql> explain tree select sum(l_orderkey) from lineitem, orders where l_orderkey = o_orderkey; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | [414]:[414: ResultSink]||[Fragment: 0]||VRESULT SINK|| MYSQL_PROTOCAL|| | | --[414]:[414: VAGGREGATE (merge finalize)]||[Fragment: 0]||cardinality=1|| | | ----[411]:[411: VEXCHANGE]||[Fragment: 0]||offset: 0|| | | ------[411]:[411: DataStreamSink]||[Fragment: 1]||STREAM DATA SINK|| EXCHANGE ID: 411|| UNPARTITIONED | | --------[408]:[408: VAGGREGATE (update serialize)]||[Fragment: 1]||cardinality=1|| | | ----------[402]:[402: VHASH JOIN]||[Fragment: 1]||join op: INNER JOIN(PARTITIONED)[]||cardinality=593,132,346|| | | ------------[392]:[392: VEXCHANGE]||[Fragment: 1]||offset: 0|| | | --------------[392]:[392: DataStreamSink]||[Fragment: 2]||STREAM DATA SINK|| EXCHANGE ID: 392|| HASH_PARTITIONED | | ----------------[386]:[386: VHIVE_SCAN_NODE]||[Fragment: 2]||table: lineitem||inputSplitNum=144, totalFileSize=16632158739, scanRanges=144||partition=1/1||cardinality=600037902, numNodes=1||pushdown agg=NONE|| | | ------------[399]:[399: VEXCHANGE]||[Fragment: 1]||offset: 0|| | | --------------[399]:[399: DataStreamSink]||[Fragment: 3]||STREAM DATA SINK|| EXCHANGE ID: 399|| HASH_PARTITIONED | | ----------------[393]:[393: VHIVE_SCAN_NODE]||[Fragment: 3]||table: orders||inputSplitNum=48, totalFileSize=3984213353, scanRanges=48||partition=1/1||cardinality=150000000, numNodes=1||pushdown agg=NONE|| | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 12 rows in set (0.04 sec) ``` --- .../org/apache/doris/nereids/DorisLexer.g4 | 1 + .../org/apache/doris/nereids/DorisParser.g4 | 3 +- fe/fe-core/src/main/cup/sql_parser.cup | 13 +++- .../apache/doris/analysis/ExplainOptions.java | 9 ++- .../doris/common/profile/PlanTreePrinter.java | 19 ++++++ .../trees/plans/commands/ExplainCommand.java | 1 + .../org/apache/doris/planner/Planner.java | 11 ++++ .../nereids/parser/NereidsParserTest.java | 10 +++ .../doris/planner/DistributedPlannerTest.java | 8 +-- .../org/apache/doris/planner/PlannerTest.java | 66 +++++++++---------- .../org/apache/doris/utframe/DorisAssert.java | 2 +- .../doris/utframe/TestWithFeService.java | 2 +- .../apache/doris/utframe/UtFrameUtils.java | 2 +- 13 files changed, 102 insertions(+), 45 deletions(-) diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 index 27036e14fd..83c7b9dd95 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4 @@ -501,6 +501,7 @@ TINYINT: 'TINYINT'; TO: 'TO'; TRANSACTION: 'TRANSACTION'; TRASH: 'TRASH'; +TREE: 'TREE'; TRIGGERS: 'TRIGGERS'; TRIM: 'TRIM'; TRUE: 'TRUE'; diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 index 9d13ebb4ec..271834940d 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 @@ -124,7 +124,7 @@ userIdentify explain : (EXPLAIN planType? | DESC | DESCRIBE) - level=(VERBOSE | GRAPH | PLAN)? + level=(VERBOSE | TREE | GRAPH | PLAN)? ; planType @@ -1064,6 +1064,7 @@ nonReserved | TIMESTAMPADD | TIMESTAMPDIFF | TRANSACTION + | TREE | TRIGGERS | TRUNCATE | TYPE diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 5933fcffbc..479c9fd9c4 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -617,6 +617,7 @@ terminal String KW_TO, KW_TRANSACTION, KW_TRASH, + KW_TREE, KW_TRIGGERS, KW_TRIM, KW_TRUE, @@ -4316,15 +4317,19 @@ opt_builtin ::= opt_explain_options ::= {: - RESULT = new ExplainOptions(false, false); + RESULT = new ExplainOptions(false, false, false); :} | KW_VERBOSE {: - RESULT = new ExplainOptions(true, false); + RESULT = new ExplainOptions(true, false, false); + :} + | KW_TREE + {: + RESULT = new ExplainOptions(false, true, false); :} | KW_GRAPH {: - RESULT = new ExplainOptions(false, true); + RESULT = new ExplainOptions(false, false, true); :} ; @@ -7651,6 +7656,8 @@ keyword ::= {: RESULT = id; :} | KW_TRANSACTION:id {: RESULT = id; :} + | KW_TREE:id + {: RESULT = id; :} | KW_TEXT:id {: RESULT = id; :} | KW_TRIGGERS:id diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExplainOptions.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExplainOptions.java index 14286f1de8..88cfc7bf21 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExplainOptions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExplainOptions.java @@ -23,6 +23,8 @@ import org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel public class ExplainOptions { private boolean isVerbose; + + private boolean isTree; private boolean isGraph; private ExplainCommand.ExplainLevel explainLevel; @@ -31,8 +33,9 @@ public class ExplainOptions { this.explainLevel = explainLevel; } - public ExplainOptions(boolean isVerbose, boolean isGraph) { + public ExplainOptions(boolean isVerbose, boolean isTree, boolean isGraph) { this.isVerbose = isVerbose; + this.isTree = isTree; this.isGraph = isGraph; } @@ -40,6 +43,10 @@ public class ExplainOptions { return explainLevel == ExplainLevel.VERBOSE || isVerbose; } + public boolean isTree() { + return explainLevel == ExplainLevel.TREE || isTree; + } + public boolean isGraph() { return explainLevel == ExplainLevel.GRAPH || isGraph; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/profile/PlanTreePrinter.java b/fe/fe-core/src/main/java/org/apache/doris/common/profile/PlanTreePrinter.java index a4d9b6d3b5..708c82b143 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/profile/PlanTreePrinter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/profile/PlanTreePrinter.java @@ -23,6 +23,8 @@ import hu.webarticum.treeprinter.TraditionalTreePrinter; public class PlanTreePrinter { + private static final String DELIMITER = "||"; + public static String printPlanExplanation(PlanTreeNode root) { SimpleTreeNode rootNode = buildNode(root); StringBuilder sb = new StringBuilder(); @@ -37,4 +39,21 @@ public class PlanTreePrinter { } return node; } + + public static String printPlanTree(PlanTreeNode root) { + return buildTree(root, ""); + } + + private static String buildTree(PlanTreeNode planNode, String prefix) { + StringBuilder builder = new StringBuilder(); + builder.append(prefix).append(planNode.getIds()).append(":") + .append(planNode.getExplainStr().replaceAll("\n", DELIMITER)).append("\n"); + String childPrefix = prefix + "--"; + planNode.getChildren().forEach( + child -> { + builder.append(buildTree(child, childPrefix)); + } + ); + return builder.toString(); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ExplainCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ExplainCommand.java index 58e05855c0..0d5fd4957a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ExplainCommand.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ExplainCommand.java @@ -40,6 +40,7 @@ public class ExplainCommand extends Command implements NoForward { NONE(false), NORMAL(false), VERBOSE(false), + TREE(false), GRAPH(false), PARSED_PLAN(true), ANALYZED_PLAN(true), diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java index e03c696dfd..32fc0245c3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java @@ -70,6 +70,17 @@ public abstract class Planner { } return PlanTreePrinter.printPlanExplanation(builder.getTreeRoot()); } + if (explainOptions.isTree()) { + // print the plan tree + PlanTreeBuilder builder = new PlanTreeBuilder(fragments); + try { + builder.build(); + } catch (UserException e) { + LOG.warn("Failed to build explain plan tree", e); + return e.getMessage(); + } + return PlanTreePrinter.printPlanTree(builder.getTreeRoot()); + } // print text plan org.apache.doris.thrift.TExplainLevel diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java index f45d0f5269..28262799a5 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java @@ -152,6 +152,16 @@ public class NereidsParserTest extends ParserTestBase { Assertions.assertEquals(ExplainLevel.VERBOSE, explainLevel); } + @Test + public void testExplainTree() { + String sql = "explain tree select `AD``D` from t1 where a = 1"; + NereidsParser nereidsParser = new NereidsParser(); + LogicalPlan logicalPlan = nereidsParser.parseSingle(sql); + ExplainCommand explainCommand = (ExplainCommand) logicalPlan; + ExplainLevel explainLevel = explainCommand.getLevel(); + Assertions.assertEquals(ExplainLevel.TREE, explainLevel); + } + @Test public void testExplainGraph() { String sql = "explain graph select `AD``D` from t1 where a = 1"; diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/DistributedPlannerTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/DistributedPlannerTest.java index 45aab8366f..6f3a66ab3b 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/DistributedPlannerTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/DistributedPlannerTest.java @@ -136,14 +136,14 @@ public class DistributedPlannerTest { StmtExecutor stmtExecutor = new StmtExecutor(ctx, sql); stmtExecutor.execute(); Planner planner = stmtExecutor.planner(); - String plan = planner.getExplainString(new ExplainOptions(false, false)); + String plan = planner.getExplainString(new ExplainOptions(false, false, false)); Assert.assertEquals(1, StringUtils.countMatches(plan, "INNER JOIN(BROADCAST)")); sql = "explain select * from db1.tbl1 join [SHUFFLE] db1.tbl2 on tbl1.k1 = tbl2.k3"; stmtExecutor = new StmtExecutor(ctx, sql); stmtExecutor.execute(); planner = stmtExecutor.planner(); - plan = planner.getExplainString(new ExplainOptions(false, false)); + plan = planner.getExplainString(new ExplainOptions(false, false, false)); Assert.assertEquals(1, StringUtils.countMatches(plan, "INNER JOIN(PARTITIONED)")); } @@ -153,7 +153,7 @@ public class DistributedPlannerTest { StmtExecutor stmtExecutor = new StmtExecutor(ctx, sql); stmtExecutor.execute(); Planner planner = stmtExecutor.planner(); - String plan = planner.getExplainString(new ExplainOptions(false, false)); + String plan = planner.getExplainString(new ExplainOptions(false, false, false)); Assert.assertEquals(1, StringUtils.countMatches(plan, "INNER JOIN(BROADCAST)")); double originThreshold = ctx.getSessionVariable().autoBroadcastJoinThreshold; @@ -162,7 +162,7 @@ public class DistributedPlannerTest { stmtExecutor = new StmtExecutor(ctx, sql); stmtExecutor.execute(); planner = stmtExecutor.planner(); - plan = planner.getExplainString(new ExplainOptions(false, false)); + plan = planner.getExplainString(new ExplainOptions(false, false, false)); Assert.assertEquals(1, StringUtils.countMatches(plan, "INNER JOIN(PARTITIONED)")); } finally { ctx.getSessionVariable().autoBroadcastJoinThreshold = originThreshold; diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java index 8e99eadd1a..f2349733c1 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/PlannerTest.java @@ -81,7 +81,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(1, StringUtils.countMatches(plan1, "UNION")); String sql2 = "explain select /*+ SET_VAR(enable_nereids_planner=false) */ * from db1.tbl1 where k1='a' and k4=1\n" + "union distinct\n" @@ -105,7 +105,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor2 = new StmtExecutor(connectContext, sql2); stmtExecutor2.execute(); Planner planner2 = stmtExecutor2.planner(); - String plan2 = planner2.getExplainString(new ExplainOptions(false, false)); + String plan2 = planner2.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(4, StringUtils.countMatches(plan2, "UNION")); // intersect @@ -120,7 +120,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor3 = new StmtExecutor(connectContext, sql3); stmtExecutor3.execute(); Planner planner3 = stmtExecutor3.planner(); - String plan3 = planner3.getExplainString(new ExplainOptions(false, false)); + String plan3 = planner3.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(1, StringUtils.countMatches(plan3, "INTERSECT")); String sql4 = "explain select /*+ SET_VAR(enable_nereids_planner=false) */ * from db1.tbl1 where k1='a' and k4=1\n" + "intersect distinct\n" @@ -145,7 +145,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor4 = new StmtExecutor(connectContext, sql4); stmtExecutor4.execute(); Planner planner4 = stmtExecutor4.planner(); - String plan4 = planner4.getExplainString(new ExplainOptions(false, false)); + String plan4 = planner4.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(3, StringUtils.countMatches(plan4, "INTERSECT")); // except @@ -160,7 +160,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor5 = new StmtExecutor(connectContext, sql5); stmtExecutor5.execute(); Planner planner5 = stmtExecutor5.planner(); - String plan5 = planner5.getExplainString(new ExplainOptions(false, false)); + String plan5 = planner5.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(1, StringUtils.countMatches(plan5, "EXCEPT")); String sql6 = "select /*+ SET_VAR(enable_nereids_planner=false) */ * from db1.tbl1 where k1='a' and k4=1\n" @@ -174,7 +174,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor6 = new StmtExecutor(connectContext, sql6); stmtExecutor6.execute(); Planner planner6 = stmtExecutor6.planner(); - String plan6 = planner6.getExplainString(new ExplainOptions(false, false)); + String plan6 = planner6.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(1, StringUtils.countMatches(plan6, "EXCEPT")); String sql7 = "select /*+ SET_VAR(enable_nereids_planner=false) */ * from db1.tbl1 where k1='a' and k4=1\n" @@ -188,7 +188,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor7 = new StmtExecutor(connectContext, sql7); stmtExecutor7.execute(); Planner planner7 = stmtExecutor7.planner(); - String plan7 = planner7.getExplainString(new ExplainOptions(false, false)); + String plan7 = planner7.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(1, StringUtils.countMatches(plan7, "EXCEPT")); // mixed @@ -203,7 +203,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor8 = new StmtExecutor(connectContext, sql8); stmtExecutor8.execute(); Planner planner8 = stmtExecutor8.planner(); - String plan8 = planner8.getExplainString(new ExplainOptions(false, false)); + String plan8 = planner8.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(1, StringUtils.countMatches(plan8, "UNION")); Assertions.assertEquals(1, StringUtils.countMatches(plan8, "INTERSECT")); Assertions.assertEquals(1, StringUtils.countMatches(plan8, "EXCEPT")); @@ -231,7 +231,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor9 = new StmtExecutor(connectContext, sql9); stmtExecutor9.execute(); Planner planner9 = stmtExecutor9.planner(); - String plan9 = planner9.getExplainString(new ExplainOptions(false, false)); + String plan9 = planner9.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(2, StringUtils.countMatches(plan9, "UNION")); Assertions.assertEquals(3, StringUtils.countMatches(plan9, "INTERSECT")); Assertions.assertEquals(2, StringUtils.countMatches(plan9, "EXCEPT")); @@ -341,7 +341,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(true, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(true, false, false)); Assertions.assertEquals(2, StringUtils.countMatches(plan1, "nullable=true")); } @@ -391,7 +391,7 @@ public class PlannerTest extends TestWithFeService { e.printStackTrace(); } Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); StmtExecutor stmtExecutor2 = new StmtExecutor(connectContext, sql2); try { @@ -400,7 +400,7 @@ public class PlannerTest extends TestWithFeService { e.printStackTrace(); } Planner planner2 = stmtExecutor2.planner(); - String plan2 = planner2.getExplainString(new ExplainOptions(false, false)); + String plan2 = planner2.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertEquals(plan1, plan2); }; @@ -435,7 +435,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor = new StmtExecutor(connectContext, sql); stmtExecutor.execute(); Planner planner = stmtExecutor.planner(); - String plan = planner.getExplainString(new ExplainOptions(false, false)); + String plan = planner.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan.contains("PREDICATES: `k1` = 1\n")); } @@ -446,7 +446,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor = new StmtExecutor(connectContext, sql); stmtExecutor.execute(); Planner planner = stmtExecutor.planner(); - String plan = planner.getExplainString(new ExplainOptions(false, false)); + String plan = planner.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan.contains("PREDICATES:")); } @@ -457,7 +457,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor = new StmtExecutor(connectContext, sql); stmtExecutor.execute(); Planner planner = stmtExecutor.planner(); - String plan = planner.getExplainString(new ExplainOptions(false, false)); + String plan = planner.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan.contains("PREDICATES: `k1` = 1 AND `k2` = 1\n")); } @@ -469,7 +469,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor = new StmtExecutor(connectContext, sql); stmtExecutor.execute(); Planner planner = stmtExecutor.planner(); - String plan = planner.getExplainString(new ExplainOptions(false, false)); + String plan = planner.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan.contains("PREDICATES: `k1` = 1\n")); } @@ -508,7 +508,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan1.contains("SORT INFO:\n `k1`\n `k2`")); Assertions.assertFalse(plan1.contains("SORT LIMIT:")); Assertions.assertFalse(plan1.contains("TOPN OPT")); @@ -519,7 +519,7 @@ public class PlannerTest extends TestWithFeService { stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); planner1 = stmtExecutor1.planner(); - plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan1.contains("SORT INFO:\n `k1`\n `k2`")); Assertions.assertFalse(plan1.contains("SORT LIMIT:")); Assertions.assertFalse(plan1.contains("TOPN OPT")); @@ -530,7 +530,7 @@ public class PlannerTest extends TestWithFeService { stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); planner1 = stmtExecutor1.planner(); - plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("SORT INFO:\n `k1`\n `k2`")); Assertions.assertTrue(plan1.contains("SORT LIMIT:")); Assertions.assertTrue(plan1.contains("TOPN OPT")); @@ -542,7 +542,7 @@ public class PlannerTest extends TestWithFeService { stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); planner1 = stmtExecutor1.planner(); - plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("SORT INFO:\n `k1`\n `k2`")); Assertions.assertTrue(plan1.contains("SORT LIMIT:")); Assertions.assertTrue(plan1.contains("TOPN OPT")); @@ -553,7 +553,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor2 = new StmtExecutor(connectContext, sql2); stmtExecutor2.execute(); Planner planner2 = stmtExecutor2.planner(); - String plan2 = planner2.getExplainString(new ExplainOptions(false, false)); + String plan2 = planner2.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan2.contains("SORT INFO:")); Assertions.assertFalse(plan2.contains("SORT LIMIT:")); } @@ -566,7 +566,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("order by:")); } @@ -576,7 +576,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("order by:")); } @@ -586,7 +586,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("order by:")); } @@ -596,7 +596,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("order by:")); } @@ -606,7 +606,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("order by:")); } @@ -617,7 +617,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("order by:")); } @@ -627,7 +627,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertTrue(plan1.contains("order by:")); } @@ -637,7 +637,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan1.contains("order by:")); } @@ -647,7 +647,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan1.contains("order by:")); } @@ -657,7 +657,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan1.contains("order by:")); } @@ -667,7 +667,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan1.contains("order by:")); } @@ -678,7 +678,7 @@ public class PlannerTest extends TestWithFeService { StmtExecutor stmtExecutor1 = new StmtExecutor(connectContext, sql1); stmtExecutor1.execute(); Planner planner1 = stmtExecutor1.planner(); - String plan1 = planner1.getExplainString(new ExplainOptions(false, false)); + String plan1 = planner1.getExplainString(new ExplainOptions(false, false, false)); Assertions.assertFalse(plan1.contains("order by:")); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java index 0078c505dc..219b64edcd 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java @@ -205,7 +205,7 @@ public class DorisAssert { } } Planner planner = stmtExecutor.planner(); - String explainString = planner.getExplainString(new ExplainOptions(false, false)); + String explainString = planner.getExplainString(new ExplainOptions(false, false, false)); System.out.println(explainString); return explainString; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java index 880063196e..62e1e95ec1 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java @@ -528,7 +528,7 @@ public abstract class TestWithFeService { stmtExecutor.execute(); if (ctx.getState().getStateType() != QueryState.MysqlStateType.ERR) { Planner planner = stmtExecutor.planner(); - return planner.getExplainString(new ExplainOptions(isVerbose, false)); + return planner.getExplainString(new ExplainOptions(isVerbose, false, false)); } else { return ctx.getState().getErrorMessage(); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java index 182450322c..85fa2f0c2e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/UtFrameUtils.java @@ -354,7 +354,7 @@ public class UtFrameUtils { stmtExecutor.execute(); if (ctx.getState().getStateType() != QueryState.MysqlStateType.ERR) { Planner planner = stmtExecutor.planner(); - return planner.getExplainString(new ExplainOptions(isVerbose, false)); + return planner.getExplainString(new ExplainOptions(isVerbose, false, false)); } else { return ctx.getState().getErrorMessage(); }