You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/10 03:35:54 UTC

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

This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new a6e4c88663 [improve](planner): split output expr to multiple line. (#10710)
a6e4c88663 is described below

commit a6e4c8866356f0de1028815a4a47ef92e7e677e9
Author: jakevin <ja...@gmail.com>
AuthorDate: Sun Jul 10 11:35:48 2022 +0800

    [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.
---
 .../org/apache/doris/planner/PlanFragment.java     |  4 +--
 .../apache/doris/analysis/StmtRewriterTest.java    |  6 ++--
 .../org/apache/doris/planner/QueryPlanTest.java    | 40 +++++++++++-----------
 .../doris/planner/TableFunctionPlanTest.java       |  2 +-
 .../data/performance/redundant_conjuncts.out       |  6 ++--
 regression-test/suites/demo/explain_action.groovy  |  4 +--
 6 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java
index 487240d226..e3fb413d1a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java
@@ -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");
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
index 7625921f23..73c18db8d0 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/StmtRewriterTest.java
@@ -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`");
     }
 
     /**
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index b8499836df..01e2527542 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -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
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
index 1bc7e2a077..2ffb7093e2 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/TableFunctionPlanTest.java
@@ -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`, ',')"));
diff --git a/regression-test/data/performance/redundant_conjuncts.out b/regression-test/data/performance/redundant_conjuncts.out
index 5e54f0858d..af1a71aff6 100644
--- a/regression-test/data/performance/redundant_conjuncts.out
+++ b/regression-test/data/performance/redundant_conjuncts.out
@@ -1,7 +1,8 @@
 -- This file is automatically generated. You should know what you did if you want to edit this
 -- !redundant_conjuncts --
 PLAN FRAGMENT 0
-  OUTPUT EXPRS:`v1`
+  OUTPUT EXPRS:
+    `v1`
   PARTITION: HASH_PARTITIONED: `default_cluster:regression_test`.`redundant_conjuncts`.`k1`
 
   VRESULT SINK
@@ -15,7 +16,8 @@ PLAN FRAGMENT 0
 
 -- !redundant_conjuncts_gnerated_by_extract_common_filter --
 PLAN FRAGMENT 0
-  OUTPUT EXPRS:`v1`
+  OUTPUT EXPRS:
+    `v1`
   PARTITION: HASH_PARTITIONED: `default_cluster:regression_test`.`redundant_conjuncts`.`k1`
 
   VRESULT SINK
diff --git a/regression-test/suites/demo/explain_action.groovy b/regression-test/suites/demo/explain_action.groovy
index 80b8a2902d..bbc69ed393 100644
--- a/regression-test/suites/demo/explain_action.groovy
+++ b/regression-test/suites/demo/explain_action.groovy
@@ -19,8 +19,8 @@ suite("explain_action", "demo") {
     explain {
         sql("select 100")
 
-        // contains("OUTPUT EXPRS:<slot 0> 100\n") && contains("PARTITION: UNPARTITIONED\n")
-        contains "OUTPUT EXPRS:<slot 0> 100\n"
+        // contains("OUTPUT EXPRS:\n    <slot 0> 100\n") && contains("PARTITION: UNPARTITIONED\n")
+        contains "OUTPUT EXPRS:\n    <slot 0> 100\n"
         contains "PARTITION: UNPARTITIONED\n"
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org