[fix](fe-ut) Fix FE ut when enable vectorized engine (#9958)

Some node name in query explain result will be changes.
eg:
Aggregate -> VAggregate
This commit is contained in:
Mingyu Chen
2022-06-07 09:13:47 +08:00
committed by GitHub
parent 856b421086
commit 0fa1615147
4 changed files with 104 additions and 80 deletions

View File

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

View File

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

View File

@ -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(<slot 3> 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(<slot 3> min(`k2`), ',')"));
Assert.assertTrue(explainString.contains("lateral view tuple id: 3"));
Assert.assertTrue(explainString.contains("output slot id: 2"));

View File

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