From 578147a4689e9d9f6eadfa7b7daeae247dbe6d69 Mon Sep 17 00:00:00 2001 From: cambyzju Date: Thu, 15 Sep 2022 19:36:33 +0800 Subject: [PATCH 1/2] fix lateral view explode_split with temp table --- .../doris/planner/TableFunctionNode.java | 20 +++++++++++++++++++ .../table_function/explode_split.out | 10 ++++++++++ .../table_function/explode_split.groovy | 10 +++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java index 9b0373f4cf5eae..7e517e22c99d81 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java @@ -107,6 +107,26 @@ public void projectSlots(Analyzer analyzer, SelectStmt selectStmt) throws Analys dst.getSlotRefsBoundByTupleIds(tupleIds, outputSlotRef); } } + /** + * For case: WITH example1 AS ( select 6 AS k1 ,'a,b,c' AS k2) select k1, e1 from example1 + * lateral view explode_split(k2, ',') tmp as e1; + * baseTblResultExprs do not include SlotRef(K1), but resultExprs include it. + * So here we travel resultExprs to get correct outputSlotRef. + * + * TODO: maybe we should make sure baseTblResultExprs include SlotRef(k1), + * after function SelectStmt::resolveInlineViewRefs called. + */ + List resultExprs = selectStmt.getResultExprs(); + for (Expr resultExpr : resultExprs) { + // find all slotRef bound by tupleIds in resultExpr + resultExpr.getSlotRefsBoundByTupleIds(tupleIds, outputSlotRef); + + // For vec engine while lateral view involves subquery + Expr dst = outputSmap.get(resultExpr); + if (dst != null) { + dst.getSlotRefsBoundByTupleIds(tupleIds, outputSlotRef); + } + } // case2 List remainConjuncts = analyzer.getRemainConjuncts(tupleIds); for (Expr expr : remainConjuncts) { diff --git a/regression-test/data/query_p0/sql_functions/table_function/explode_split.out b/regression-test/data/query_p0/sql_functions/table_function/explode_split.out index 4439d5e676f77f..2a439f67b766fe 100644 --- a/regression-test/data/query_p0/sql_functions/table_function/explode_split.out +++ b/regression-test/data/query_p0/sql_functions/table_function/explode_split.out @@ -15,6 +15,11 @@ 1 a,b,c c b 1 a,b,c c c +-- !explode_split -- +6 a +6 b +6 c + -- !explode_split -- 1 a,b,c a 1 a,b,c b @@ -31,3 +36,8 @@ 1 a,b,c c b 1 a,b,c c c +-- !explode_split -- +6 a +6 b +6 c + diff --git a/regression-test/suites/query_p0/sql_functions/table_function/explode_split.groovy b/regression-test/suites/query_p0/sql_functions/table_function/explode_split.groovy index 95dc6bca55ebb8..a3ae36ac0fedac 100644 --- a/regression-test/suites/query_p0/sql_functions/table_function/explode_split.groovy +++ b/regression-test/suites/query_p0/sql_functions/table_function/explode_split.groovy @@ -29,6 +29,7 @@ suite("explode_split") { sql """ INSERT INTO ${tableName} VALUES (1, 'a,b,c') """ // not_vectorized + sql """ set enable_vectorized_engine = false """ qt_explode_split """ select * from ${tableName} lateral view explode_split(k2, ',') tmp1 as e1 """ @@ -36,9 +37,12 @@ suite("explode_split") { lateral view explode_split(k2, ',') tmp1 as e1 lateral view explode_split(k2, ',') tmp2 as e2 """ + qt_explode_split """ WITH example1 AS ( select 6 AS k1 ,'a,b,c' AS k2) + select k1, e1 from example1 + lateral view explode_split(k2, ',') tmp as e1 """ + // vectorized sql """ set enable_vectorized_engine = true """ - qt_explode_split """ select * from ${tableName} lateral view explode_split(k2, ',') tmp1 as e1 """ @@ -46,4 +50,8 @@ suite("explode_split") { lateral view explode_split(k2, ',') tmp1 as e1 lateral view explode_split(k2, ',') tmp2 as e2 """ + qt_explode_split """ WITH example1 AS ( select 6 AS k1 ,'a,b,c' AS k2) + select k1, e1 from example1 + lateral view explode_split(k2, ',') tmp as e1 """ + } From f6a0b31deb0b01edc5880102530e6b656b92d746 Mon Sep 17 00:00:00 2001 From: cambyzju Date: Fri, 16 Sep 2022 11:09:36 +0800 Subject: [PATCH 2/2] use another method to fix --- .../doris/planner/SingleNodePlanner.java | 1 + .../doris/planner/TableFunctionNode.java | 20 ------------------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java index d201b21938e239..0a68abfc64329e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java @@ -1399,6 +1399,7 @@ private PlanNode createInlineViewPlan(Analyzer analyzer, InlineViewRef inlineVie unionNode.init(analyzer); //set outputSmap to substitute literal in outputExpr unionNode.setWithoutTupleIsNullOutputSmap(inlineViewRef.getSmap()); + unionNode.setOutputSmap(inlineViewRef.getSmap()); if (analyzer.isOuterJoined(inlineViewRef.getId())) { List nullableRhs; if (analyzer.isOuterJoinedLeftSide(inlineViewRef.getId())) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java index 7e517e22c99d81..9b0373f4cf5eae 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java @@ -107,26 +107,6 @@ public void projectSlots(Analyzer analyzer, SelectStmt selectStmt) throws Analys dst.getSlotRefsBoundByTupleIds(tupleIds, outputSlotRef); } } - /** - * For case: WITH example1 AS ( select 6 AS k1 ,'a,b,c' AS k2) select k1, e1 from example1 - * lateral view explode_split(k2, ',') tmp as e1; - * baseTblResultExprs do not include SlotRef(K1), but resultExprs include it. - * So here we travel resultExprs to get correct outputSlotRef. - * - * TODO: maybe we should make sure baseTblResultExprs include SlotRef(k1), - * after function SelectStmt::resolveInlineViewRefs called. - */ - List resultExprs = selectStmt.getResultExprs(); - for (Expr resultExpr : resultExprs) { - // find all slotRef bound by tupleIds in resultExpr - resultExpr.getSlotRefsBoundByTupleIds(tupleIds, outputSlotRef); - - // For vec engine while lateral view involves subquery - Expr dst = outputSmap.get(resultExpr); - if (dst != null) { - dst.getSlotRefsBoundByTupleIds(tupleIds, outputSlotRef); - } - } // case2 List remainConjuncts = analyzer.getRemainConjuncts(tupleIds); for (Expr expr : remainConjuncts) {