[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:
@ -501,6 +501,7 @@ TINYINT: 'TINYINT';
|
||||
TO: 'TO';
|
||||
TRANSACTION: 'TRANSACTION';
|
||||
TRASH: 'TRASH';
|
||||
TREE: 'TREE';
|
||||
TRIGGERS: 'TRIGGERS';
|
||||
TRIM: 'TRIM';
|
||||
TRUE: 'TRUE';
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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),
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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:"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user