[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)
```
This commit is contained in:
Qi Chen
2023-11-02 14:06:24 +08:00
committed by GitHub
parent fb622800aa
commit 3ce1bdae84
13 changed files with 102 additions and 45 deletions

View File

@ -501,6 +501,7 @@ TINYINT: 'TINYINT';
TO: 'TO';
TRANSACTION: 'TRANSACTION';
TRASH: 'TRASH';
TREE: 'TREE';
TRIGGERS: 'TRIGGERS';
TRIM: 'TRIM';
TRUE: 'TRUE';

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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();
}
}

View File

@ -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),

View File

@ -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

View File

@ -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";

View File

@ -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;

View File

@ -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:"));
}
}

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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();
}