[improve](planner): split output expr to multiple line. (#10710)

* [improve](planner): split output expr to multiple line.

+---------------------------------------------------+
| Explain String                                    |
+---------------------------------------------------+
| PLAN FRAGMENT 0                                   |
|   OUTPUT EXPRS:                                   |
|     <slot 9> `user_id`                            |
|     <slot 11> `default_cluster:test`.`tbl`.`date` |
|     <slot 10> `city`                              |
|     <slot 12> `default_cluster:test`.`tbl`.`age`  |
+---------------------------------------------------+

* *: fix UT and regression-test.
This commit is contained in:
jakevin
2022-07-10 11:35:48 +08:00
committed by GitHub
parent 7f9eeb8fc3
commit a6e4c88663
6 changed files with 32 additions and 30 deletions

View File

@ -296,8 +296,8 @@ public class PlanFragment extends TreeNode<PlanFragment> {
StringBuilder str = new StringBuilder();
Preconditions.checkState(dataPartition != null);
if (CollectionUtils.isNotEmpty(outputExprs)) {
str.append(" OUTPUT EXPRS:");
str.append(outputExprs.stream().map(Expr::toSql).collect(Collectors.joining(" | ")));
str.append(" OUTPUT EXPRS:\n ");
str.append(outputExprs.stream().map(Expr::toSql).collect(Collectors.joining("\n ")));
}
str.append("\n");
str.append(" PARTITION: " + dataPartition.getExplainString(explainLevel) + "\n");

View File

@ -380,7 +380,7 @@ public class StmtRewriterTest {
"CROSS JOIN",
"predicates: <slot 3> sum(`salary`) > <slot 8> avg(`salary`)",
"order by: <slot 10> `$a$1`.`$c$2` ASC",
"OUTPUT EXPRS:<slot 11> `$a$1`.`$c$1`");
"OUTPUT EXPRS:\n <slot 11> `$a$1`.`$c$1`");
}
/**
@ -495,7 +495,7 @@ public class StmtRewriterTest {
"CROSS JOIN",
"predicates: <slot 3> sum(`salary`) > <slot 8> avg(`salary`)",
"order by: <slot 10> `$a$1`.`$c$2` ASC",
"OUTPUT EXPRS:<slot 11> `$a$1`.`$c$1` | <slot 10> `$a$1`.`$c$2`");
"OUTPUT EXPRS:\n <slot 11> `$a$1`.`$c$1`\n <slot 10> `$a$1`.`$c$2`");
}
/**
@ -609,7 +609,7 @@ public class StmtRewriterTest {
"CROSS JOIN",
"predicates: <slot 3> sum(`salary`) > <slot 8> avg(`salary`)",
"order by: <slot 10> `$a$1`.`$c$2` ASC",
"OUTPUT EXPRS:<slot 11> `$a$1`.`$c$1` | <slot 10> `$a$1`.`$c$2`");
"OUTPUT EXPRS:\n <slot 11> `$a$1`.`$c$1`\n <slot 10> `$a$1`.`$c$2`");
}
/**

View File

@ -439,7 +439,7 @@ public class QueryPlanTest extends TestWithFeService {
sql = "insert into test.bitmap_table select id, id2 from test.bitmap_table_2;";
explainString = getSQLPlanOrErrorMsg("explain " + sql);
Assert.assertTrue(explainString.contains("OLAP TABLE SINK"));
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:`id` | `id2`"));
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:\n `id`\n `id2`"));
Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 0, "OlapScanNode"));
assertSQLPlanOrErrorMsgContains("insert into test.bitmap_table select id, id from test.bitmap_table_2;",
@ -450,7 +450,7 @@ public class QueryPlanTest extends TestWithFeService {
public void testBitmapQuery() throws Exception {
assertSQLPlanOrErrorMsgContains(
"select * from test.bitmap_table;",
"OUTPUT EXPRS:`default_cluster:test`.`bitmap_table`.`id` | `default_cluster:test`.`bitmap_table`.`id2`"
"OUTPUT EXPRS:\n `default_cluster:test`.`bitmap_table`.`id`\n `default_cluster:test`.`bitmap_table`.`id2`"
);
assertSQLPlanOrErrorMsgContains(
@ -499,7 +499,7 @@ public class QueryPlanTest extends TestWithFeService {
public void testHLLTypeQuery() throws Exception {
assertSQLPlanOrErrorMsgContains(
"select * from test.hll_table;",
"OUTPUT EXPRS:`default_cluster:test`.`hll_table`.`id` | `default_cluster:test`.`hll_table`.`id2`"
"OUTPUT EXPRS:\n `default_cluster:test`.`hll_table`.`id`\n `default_cluster:test`.`hll_table`.`id2`"
);
assertSQLPlanOrErrorMsgContains(
@ -883,13 +883,13 @@ public class QueryPlanTest extends TestWithFeService {
String sql121 = "select case when false then 2 when substr(k7,2,1) then 3 else 0 end as col121 from"
+ " test.baseall";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql121),
"OUTPUT EXPRS:CASE WHEN substr(`k7`, 2, 1) THEN 3 ELSE 0 END"));
"OUTPUT EXPRS:\n CASE WHEN substr(`k7`, 2, 1) THEN 3 ELSE 0 END"));
// 1.2.2 when expr which can not be converted to constants in the first
String sql122 = "select case when substr(k7,2,1) then 2 when false then 3 else 0 end as col122"
+ " from test.baseall";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql122),
"OUTPUT EXPRS:CASE WHEN substr(`k7`, 2, 1) THEN 2 WHEN FALSE THEN 3 ELSE 0 END"));
"OUTPUT EXPRS:\n CASE WHEN substr(`k7`, 2, 1) THEN 2 WHEN FALSE THEN 3 ELSE 0 END"));
// 1.2.3 test return `then expr` in the middle
String sql124 = "select case when false then 1 when true then 2 when false then 3 else 'other' end as col124";
@ -915,7 +915,7 @@ public class QueryPlanTest extends TestWithFeService {
String sql15 = "select case when case when substr(k7,2,1) then true else false end then 2 when false then 3"
+ " else 0 end as col from test.baseall";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql15),
"OUTPUT EXPRS:CASE WHEN CASE WHEN substr(`k7`, 2, 1) THEN TRUE ELSE FALSE END THEN 2"
"OUTPUT EXPRS:\n CASE WHEN CASE WHEN substr(`k7`, 2, 1) THEN TRUE ELSE FALSE END THEN 2"
+ " WHEN FALSE THEN 3 ELSE 0 END"));
// 1.6 test when expr is null
@ -949,20 +949,20 @@ public class QueryPlanTest extends TestWithFeService {
+ " else 0 end as col23 from test.baseall";
String a = getSQLPlanOrErrorMsg("explain " + sql23);
Assert.assertTrue(StringUtils.containsIgnoreCase(a,
"OUTPUT EXPRS:CASE 'a' WHEN substr(`k7`, 2, 1) THEN '2' WHEN '0' THEN '3' ELSE '0' END"));
"OUTPUT EXPRS:\n CASE 'a' WHEN substr(`k7`, 2, 1) THEN '2' WHEN '0' THEN '3' ELSE '0' END"));
// 2.3.1 first when expr is not constant
String sql231 = "select case 'a' when substr(k7,2,1) then 2 when 1 then 'a' when false then 3 else 0 end"
+ " as col231 from test.baseall";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql231),
"OUTPUT EXPRS:CASE 'a' WHEN substr(`k7`, 2, 1) THEN '2' WHEN '1' THEN 'a' WHEN '0'"
"OUTPUT EXPRS:\n CASE 'a' WHEN substr(`k7`, 2, 1) THEN '2' WHEN '1' THEN 'a' WHEN '0'"
+ " THEN '3' ELSE '0' END"));
// 2.3.2 case expr is not constant
String sql232 = "select case k1 when substr(k7,2,1) then 2 when 1 then 'a' when false then 3 else 0 end"
+ " as col232 from test.baseall";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql232),
"OUTPUT EXPRS:CASE `k1` WHEN substr(`k7`, 2, 1) THEN '2' WHEN '1' THEN 'a' "
"OUTPUT EXPRS:\n CASE `k1` WHEN substr(`k7`, 2, 1) THEN '2' WHEN '1' THEN 'a' "
+ "WHEN '0' THEN '3' ELSE '0' END"));
// 3.1 test float,float in case expr
@ -988,29 +988,29 @@ public class QueryPlanTest extends TestWithFeService {
// 5.1 test same type in then expr and else expr
String sql51 = "select case when 132 then k7 else 'all' end as col51 from test.baseall group by col51";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql51),
"OUTPUT EXPRS: CASE WHEN 132 THEN `k7` ELSE 'all' END"));
"CASE WHEN 132 THEN `k7` ELSE 'all' END"));
// 5.2 test same type in then expr and else expr
String sql52 = "select case when 2 < 1 then 'all' else k7 end as col52 from test.baseall group by col52";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql52),
"OUTPUT EXPRS: `k7`"));
"`k7`"));
// 5.3 test different type in then expr and else expr, and return CastExpr<SlotRef>
String sql53 = "select case when 2 < 1 then 'all' else k1 end as col53 from test.baseall group by col53";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql53),
"OUTPUT EXPRS: `k1`"));
"`k1`"));
// 5.4 test return CastExpr<SlotRef> with other SlotRef in selectListItem
String sql54 = "select k2, case when 2 < 1 then 'all' else k1 end as col54, k7 from test.baseall"
+ " group by k2, col54, k7";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql54),
"OUTPUT EXPRS:<slot 3> `k2` | <slot 4> `k1` | <slot 5> `k7`"));
"OUTPUT EXPRS:\n <slot 3> `k2`\n <slot 4> `k1`\n <slot 5> `k7`"));
// 5.5 test return CastExpr<CastExpr<SlotRef>> with other SlotRef in selectListItem
String sql55 = "select case when 2 < 1 then 'all' else cast(k1 as int) end as col55, k7 from"
+ " test.baseall group by col55, k7";
Assert.assertTrue(StringUtils.containsIgnoreCase(getSQLPlanOrErrorMsg("explain " + sql55),
"OUTPUT EXPRS:<slot 2> CAST(`k1` AS INT) | <slot 3> `k7`"));
"OUTPUT EXPRS:\n <slot 2> CAST(`k1` AS INT)\n <slot 3> `k7`"));
}
@Test
@ -1620,19 +1620,19 @@ public class QueryPlanTest extends TestWithFeService {
//valid date
String sql = "SELECT a.aid, b.bid FROM (SELECT 3 AS aid) a right outer JOIN (SELECT 4 AS bid) b ON (a.aid=b.bid)";
String explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:`a`.`aid` | 4"));
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:\n `a`.`aid`\n 4"));
sql = "SELECT a.aid, b.bid FROM (SELECT 3 AS aid) a left outer JOIN (SELECT 4 AS bid) b ON (a.aid=b.bid)";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:3 | `b`.`bid`"));
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:\n 3\n `b`.`bid`"));
sql = "SELECT a.aid, b.bid FROM (SELECT 3 AS aid) a full outer JOIN (SELECT 4 AS bid) b ON (a.aid=b.bid)";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:`a`.`aid` | `b`.`bid`"));
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:\n `a`.`aid`\n `b`.`bid`"));
sql = "SELECT a.aid, b.bid FROM (SELECT 3 AS aid) a JOIN (SELECT 4 AS bid) b ON (a.aid=b.bid)";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:3 | 4"));
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:\n 3\n 4"));
sql = "SELECT a.k1, b.k2 FROM (SELECT k1 from baseall) a LEFT OUTER JOIN (select k1, 999 as k2 from baseall) b ON (a.k1=b.k1)";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
@ -2096,9 +2096,9 @@ public class QueryPlanTest extends TestWithFeService {
+ "RIGHT JOIN\n"
+ " (SELECT 4 AS bid)b ON (a.aid=b.bid)\n";
String explainString = getSQLPlanOrErrorMsg(queryStr);
Assert.assertFalse(explainString.contains("OUTPUT EXPRS:3 | 4"));
Assert.assertFalse(explainString.contains("OUTPUT EXPRS:\n 3\n 4"));
System.out.println(explainString);
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:CAST(`a`.`aid` AS INT) | 4"));
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:\n CAST(`a`.`aid` AS INT)\n 4"));
}
@Test

View File

@ -89,7 +89,7 @@ public class TableFunctionPlanTest {
public void withoutOutputExplodeColumn() throws Exception {
String sql = "desc verbose select k1 from db1.tbl1 lateral view explode_split(k2, \",\") tmp as e1;";
String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true);
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:`k1`"));
Assert.assertTrue(explainString.contains("OUTPUT EXPRS:\n `k1`"));
Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE"));
Assert.assertTrue(
explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')"));