diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/QueryStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/QueryStmtTest.java index f21f291ceb..de0d525daa 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/QueryStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/QueryStmtTest.java @@ -21,7 +21,9 @@ import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.UserException; +import org.apache.doris.common.VecNotImplException; import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.SessionVariable; import org.apache.doris.rewrite.FoldConstantsRule; import org.apache.doris.thrift.TExpr; import org.apache.doris.utframe.DorisAssert; @@ -218,36 +220,39 @@ public class QueryStmtTest { Assert.assertEquals(1, constMap.size()); // expr in subquery associate with column in grandparent level - sql = "WITH aa AS\n" - + " (SELECT DATE_FORMAT(workDateTime, '%Y-%m') mon,\n" - + " siteid\n" + sql = "WITH aa AS\n" + " (SELECT DATE_FORMAT(workDateTime, '%Y-%m') mon,\n" + " siteid\n" + " FROM db1.table1\n" + " WHERE workDateTime >= concat(year(now())-1, '-01-01 00:00:00')\n" - + " AND workDateTime < now()\n" - + " GROUP BY siteid,\n" - + " DATE_FORMAT(workDateTime, '%Y-%m')),\n" - + " bb AS\n" - + " (SELECT mon,\n" - + " count(DISTINCT siteid) total\n" - + " FROM aa\n" - + " GROUP BY mon),\n" - + " cc AS\n" - + " (SELECT mon,\n" - + " count(DISTINCT siteid) num\n" - + " FROM aa\n" - + " GROUP BY mon)\n" - + "SELECT bb.mon,\n" - + " round(cc.num / bb.total, 4) rate\n" - + "FROM bb\n" - + "LEFT JOIN cc ON cc.mon = bb.mon\n" + + " AND workDateTime < now()\n" + " GROUP BY siteid,\n" + + " DATE_FORMAT(workDateTime, '%Y-%m')),\n" + " bb AS\n" + + " (SELECT mon,\n" + " count(DISTINCT siteid) total\n" + + " FROM aa\n" + " GROUP BY mon),\n" + " cc AS\n" + + " (SELECT mon,\n" + " count(DISTINCT siteid) num\n" + + " FROM aa\n" + " GROUP BY mon)\n" + "SELECT bb.mon,\n" + + " round(cc.num / bb.total, 4) rate\n" + "FROM bb\n" + "LEFT JOIN cc ON cc.mon = bb.mon\n" + "ORDER BY mon;"; - stmt = (QueryStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, ctx); - exprsMap.clear(); - stmt.collectExprs(exprsMap); - Assert.assertEquals(18, exprsMap.size()); - constMap.clear(); - constMap = getConstantExprMap(exprsMap, analyzer); - Assert.assertEquals(4, constMap.size()); + + // When disable vec engine, this sql can be analyzed successfully. + // But when enable vec engine and for now, it will throw VecNotImplException + // with msg: "could not be changed to nullable". + // So here we make a "if else" check, and once this VecNotImplException is fixed, we should remove this check. + SessionVariable sv = new SessionVariable(); + if (!sv.enableVectorizedEngine) { + stmt = (QueryStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, ctx); + exprsMap.clear(); + stmt.collectExprs(exprsMap); + Assert.assertEquals(18, exprsMap.size()); + constMap.clear(); + constMap = getConstantExprMap(exprsMap, analyzer); + Assert.assertEquals(4, constMap.size()); + } else { + try { + UtFrameUtils.parseAndAnalyzeStmt(sql, ctx); + Assert.fail(); + } catch (VecNotImplException e) { + Assert.assertTrue(e.getMessage().contains("could not be changed to nullable")); + } + } } @Test 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 8c92582c90..ffbac35ec5 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 @@ -46,6 +46,7 @@ import org.apache.doris.qe.QueryState.MysqlStateType; import org.apache.doris.rewrite.RewriteDateLiteralRuleTest; import org.apache.doris.thrift.TRuntimeFilterType; import org.apache.doris.utframe.TestWithFeService; +import org.apache.doris.utframe.UtFrameUtils; import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; @@ -423,22 +424,22 @@ public class QueryPlanTest extends TestWithFeService { @Test public void testBitmapInsertInto() throws Exception { - assertSQLPlanOrErrorMsgContains( - "INSERT INTO test.bitmap_table (id, id2) VALUES (1001, to_bitmap(1000)), (1001, to_bitmap(2000));", - "OLAP TABLE SINK"); + String sql = "INSERT INTO test.bitmap_table (id, id2) VALUES (1001, to_bitmap(1000)), (1001, to_bitmap(2000));"; + String explainString = getSQLPlanOrErrorMsg("explain " + sql); + Assert.assertTrue(explainString.contains("OLAP TABLE SINK")); - assertSQLPlanOrErrorMsgContains( - "insert into test.bitmap_table select id, bitmap_union(id2) from test.bitmap_table_2 group by id;", - "OLAP TABLE SINK", - "bitmap_union", - "1:AGGREGATE", - "0:OlapScanNode"); + sql = "insert into test.bitmap_table select id, bitmap_union(id2) from test.bitmap_table_2 group by id;"; + explainString = getSQLPlanOrErrorMsg("explain " + sql); + Assert.assertTrue(explainString.contains("OLAP TABLE SINK")); + Assert.assertTrue(explainString.contains("bitmap_union")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "AGGREGATE")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 0, "OlapScanNode")); - assertSQLPlanOrErrorMsgContains( - "insert into test.bitmap_table select id, id2 from test.bitmap_table_2;", - "OLAP TABLE SINK", - "OUTPUT EXPRS:`id` | `id2`", - "0:OlapScanNode"); + 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(UtFrameUtils.checkPlanResultContainsNode(explainString, 0, "OlapScanNode")); assertSQLPlanOrErrorMsgContains("insert into test.bitmap_table select id, id from test.bitmap_table_2;", "bitmap column require the function return type is BITMAP"); @@ -1184,12 +1185,12 @@ public class QueryPlanTest extends TestWithFeService { String queryStr = "explain select * from mysql_table t2, jointest t1 where t1.k1 = t2.k1"; String explainString = getSQLPlanOrErrorMsg(queryStr); Assert.assertTrue(explainString.contains("INNER JOIN (BROADCAST)")); - Assert.assertTrue(explainString.contains("1:SCAN MYSQL")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "SCAN MYSQL")); queryStr = "explain select * from jointest t1, mysql_table t2 where t1.k1 = t2.k1"; explainString = getSQLPlanOrErrorMsg(queryStr); Assert.assertTrue(explainString.contains("INNER JOIN (BROADCAST)")); - Assert.assertTrue(explainString.contains("1:SCAN MYSQL")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "SCAN MYSQL")); queryStr = "explain select * from jointest t1, mysql_table t2, mysql_table t3 where t1.k1 = t3.k1"; explainString = getSQLPlanOrErrorMsg(queryStr); @@ -1231,12 +1232,12 @@ public class QueryPlanTest extends TestWithFeService { String queryStr = "explain select * from odbc_mysql t2, jointest t1 where t1.k1 = t2.k1"; String explainString = getSQLPlanOrErrorMsg(queryStr); Assert.assertTrue(explainString.contains("INNER JOIN (BROADCAST)")); - Assert.assertTrue(explainString.contains("1:SCAN ODBC")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "SCAN ODBC")); queryStr = "explain select * from jointest t1, odbc_mysql t2 where t1.k1 = t2.k1"; explainString = getSQLPlanOrErrorMsg(queryStr); Assert.assertTrue(explainString.contains("INNER JOIN (BROADCAST)")); - Assert.assertTrue(explainString.contains("1:SCAN ODBC")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "SCAN ODBC")); queryStr = "explain select * from jointest t1, odbc_mysql t2, odbc_mysql t3 where t1.k1 = t3.k1"; explainString = getSQLPlanOrErrorMsg(queryStr); @@ -1319,7 +1320,6 @@ public class QueryPlanTest extends TestWithFeService { Assert.assertTrue(explainString.contains("EnableTransaction: true")); } - @Test public void testPreferBroadcastJoin() throws Exception { connectContext.setDatabase("default_cluster:test"); @@ -1926,7 +1926,7 @@ public class QueryPlanTest extends TestWithFeService { String sql = "select * from issue7929.t1 left join (select max(j1) over() as x from issue7929.t2) a" + " on t1.k1 = a.x where 1 = 0;"; String explainStr = getSQLPlanOrErrorMsg(sql, true); - Assert.assertTrue(explainStr.contains("4:EMPTYSET")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainStr, 4, "EMPTYSET")); Assert.assertTrue(explainStr.contains("tuple ids: 0 1 5")); } 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 ae8e17a645..82736b912e 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 @@ -74,8 +74,9 @@ public class TableFunctionPlanTest { public void normalTableFunction() throws Exception { String sql = "desc verbose select k1, e1 from db1.tbl1 lateral view explode_split(k2, \",\") tmp as e1;"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("tuple ids: 0 1")); Assert.assertTrue(explainString.contains("TupleDescriptor{id=1, tbl=tmp, byteSize=32, materialized=true}")); Assert.assertTrue(explainString.contains("SlotDescriptor{id=1, col=e1, type=VARCHAR(*)}")); @@ -89,8 +90,9 @@ public class TableFunctionPlanTest { 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("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("tuple ids: 0 1")); Assert.assertTrue(explainString.contains("TupleDescriptor{id=1, tbl=tmp, byteSize=32, materialized=true}")); Assert.assertTrue(explainString.contains("SlotDescriptor{id=1, col=e1, type=VARCHAR(*)}")); @@ -101,15 +103,17 @@ public class TableFunctionPlanTest { */ @Test public void groupByExplodeColumn() throws Exception { - String sql = "desc verbose select k1, e1, count(*) from db1.tbl1 lateral view explode_split(k2, \",\") tmp as e1 " - + "group by k1, e1;"; + String sql = + "desc verbose select k1, e1, count(*) from db1.tbl1 lateral view explode_split(k2, \",\") tmp as e1 " + + "group by k1, e1;"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); // group by node with k1, e1 - Assert.assertTrue(explainString.contains("2:AGGREGATE (update finalize)")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 2, "AGGREGATE (update finalize)")); Assert.assertTrue(explainString.contains("group by: `k1`, `e1`")); // table function node - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("tuple ids: 0 1")); Assert.assertTrue(explainString.contains("TupleDescriptor{id=1, tbl=tmp, byteSize=32, materialized=true}")); Assert.assertTrue(explainString.contains("SlotDescriptor{id=1, col=e1, type=VARCHAR(*)}")); @@ -125,8 +129,9 @@ public class TableFunctionPlanTest { String sql = "desc verbose select k1, e1 from db1.tbl1 lateral view explode_split(k2, \",\") tmp as e1 " + "where e1='1'; "; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("PREDICATES: `e1` = '1'")); Assert.assertTrue(explainString.contains("tuple ids: 0 1")); Assert.assertTrue(explainString.contains("TupleDescriptor{id=1, tbl=tmp, byteSize=32, materialized=true}")); @@ -141,12 +146,13 @@ public class TableFunctionPlanTest { String sql = "desc verbose select k1, e1 from db1.tbl1 lateral view explode_split(k2, \",\") tmp as e1 " + "where k1=1; "; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("tuple ids: 0 1")); Assert.assertTrue(explainString.contains("TupleDescriptor{id=1, tbl=tmp, byteSize=32, materialized=true}")); Assert.assertTrue(explainString.contains("SlotDescriptor{id=1, col=e1, type=VARCHAR(*)}")); - Assert.assertTrue(explainString.contains("0:OlapScanNode")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 0, "OlapScanNode")); Assert.assertTrue(explainString.contains("PREDICATES: `k1` = 1")); } @@ -159,8 +165,9 @@ public class TableFunctionPlanTest { String sql = "desc verbose select k1, e1, e2 from db1.tbl1 lateral view explode_split(k2, \",\") tmp1 as e1" + " lateral view explode_split(k2, \",\") tmp2 as e2;"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',') explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue(explainString.contains( + "table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',') explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 1 2")); // lateral view 2 tuple Assert.assertTrue(explainString.contains("TupleDescriptor{id=1, tbl=tmp2, byteSize=32, materialized=true}")); @@ -209,8 +216,9 @@ public class TableFunctionPlanTest { public void nonProjectSourceColumn() throws Exception { String sql = "desc verbose select k1, e1 from db1.tbl1 lateral view explode_split(k2, \",\") tmp1 as e1;"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 1")); Assert.assertTrue(explainString.contains("output slot id: 1 2")); } @@ -223,11 +231,13 @@ public class TableFunctionPlanTest { */ @Test public void projectLateralViewColumn() throws Exception { - String sql = "desc verbose select k1, sum(cast(e1 as int)) from db1.tbl1 lateral view explode_split(k2, \",\") tmp1 as e1" - + " group by k1;"; + String sql = + "desc verbose select k1, sum(cast(e1 as int)) from db1.tbl1 lateral view explode_split(k2, \",\") tmp1 as e1" + + " group by k1;"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 1")); Assert.assertTrue(explainString.contains("output slot id: 1 2")); } @@ -243,8 +253,9 @@ public class TableFunctionPlanTest { String sql = "desc verbose select k1, e1 from db1.tbl1 lateral view explode_split(k2, \",\") tmp1 as e1" + " where k2=1;"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(`default_cluster:db1`.`tbl1`.`k2`, ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 1")); Assert.assertTrue(explainString.contains("output slot id: 1 2")); } @@ -260,7 +271,7 @@ public class TableFunctionPlanTest { String sql = "desc verbose select a.k1, tmp1.e1 from db1.tbl1 a lateral view explode_split(k2, \",\") tmp1 as e1" + " right join db1.tbl1 b on a.k1=b.k1 where a.k2=1;"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); Assert.assertTrue(explainString.contains("table function: explode_split(`a`.`k2`, ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 1")); Assert.assertTrue(explainString.contains("output slot id: 0 1 2")); @@ -278,7 +289,7 @@ public class TableFunctionPlanTest { String sql = "desc verbose select a.k1 from db1.tbl1 a lateral view explode_split(k2, \",\") tmp1 as e1" + " left join db1.tbl1 b on a.k1=b.k1 where a.k2=1"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); Assert.assertTrue(explainString.contains("table function: explode_split(`a`.`k2`, ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 1")); Assert.assertTrue(explainString.contains("output slot id: 2")); @@ -331,10 +342,12 @@ public class TableFunctionPlanTest { */ @Test public void scalarFunctionInLateralView() throws Exception { - String sql = "desc verbose select a.k1 from db1.tbl1 a lateral view explode_split(concat(k2, ',' , k3), \",\") tmp1 as e1 "; + String sql = + "desc verbose select a.k1 from db1.tbl1 a lateral view explode_split(concat(k2, ',' , k3), \",\") tmp1 as e1 "; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); - Assert.assertTrue(explainString.contains("table function: explode_split(concat(`a`.`k2`, ',', `a`.`k3`), ',')")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); + Assert.assertTrue( + explainString.contains("table function: explode_split(concat(`a`.`k2`, ',', `a`.`k3`), ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 1")); Assert.assertTrue(explainString.contains("output slot id: 3")); Assert.assertTrue(explainString.contains("SlotDescriptor{id=0, col=k2, type=VARCHAR(1)}")); @@ -350,7 +363,7 @@ public class TableFunctionPlanTest { public void lateralViewColumnOfReduceTuple() throws Exception { String sql = "desc verbose select e1 from (select k2 as c1 from db1.tbl1) a lateral view explode_split(c1, \",\") tmp1 as e1 "; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("1:TABLE FUNCTION NODE")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 1, "TABLE FUNCTION NODE")); Assert.assertTrue(explainString.contains("table function: explode_split(`k2`, ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 2")); Assert.assertTrue(explainString.contains("output slot id: 2")); @@ -366,7 +379,7 @@ public class TableFunctionPlanTest { public void aggInlineView() throws Exception { String sql = "desc verbose select e1 from (select k2 as c1 from db1.tbl1 group by c1) a lateral view explode_split(c1, \",\") tmp1 as e1 "; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("2:TABLE FUNCTION NODE")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 2, "TABLE FUNCTION NODE")); Assert.assertTrue(explainString.contains("table function: explode_split( `k2`, ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 3")); Assert.assertTrue(explainString.contains("output slot id: 3")); @@ -383,7 +396,7 @@ public class TableFunctionPlanTest { String sql = "desc verbose select c1, e1 from (select k1 as c1, min(k2) as c2 from db1.tbl1 group by c1) a " + "lateral view explode_split(c2, \",\") tmp1 as e1"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("2:TABLE FUNCTION NODE")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 2, "TABLE FUNCTION NODE")); Assert.assertTrue(explainString.contains("table function: explode_split( min(`k2`), ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 3")); Assert.assertTrue(explainString.contains("output slot id: 2 6")); @@ -469,7 +482,7 @@ public class TableFunctionPlanTest { String sql = "desc verbose select min(c1) from (select c1 from (select k1 as c1, min(k2) as c2 from db1.tbl1 group by c1) a " + "lateral view explode_split(c2, \",\") tmp1 as e1) tmp2"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(ctx, sql, true); - Assert.assertTrue(explainString.contains("2:TABLE FUNCTION NODE")); + Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainString, 2, "TABLE FUNCTION NODE")); Assert.assertTrue(explainString.contains("table function: explode_split( min(`k2`), ',')")); Assert.assertTrue(explainString.contains("lateral view tuple id: 3")); Assert.assertTrue(explainString.contains("output slot id: 2")); 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 555ee92feb..37a8285003 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 @@ -313,4 +313,10 @@ public class UtFrameUtils { String digest = queryStmt.toDigest(); return DigestUtils.md5Hex(digest); } + + public static boolean checkPlanResultContainsNode(String planResult, int idx, String nodeName) { + String realNodeName = idx + ":" + nodeName; + String realVNodeName = idx + ":V" + nodeName; + return planResult.contains(realNodeName) || planResult.contains(realVNodeName); + } }