diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java index a2d03c50ae..d4ad469142 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java @@ -2201,6 +2201,12 @@ public abstract class Expr extends TreeNode implements ParseNode, Cloneabl public boolean matchExprs(List exprs, SelectStmt stmt, boolean ignoreAlias, String tableName) throws AnalysisException { + List slots = new ArrayList<>(); + collect(SlotRef.class, slots); + if (slots.size() == 0) { + return true; + } + String name = MaterializedIndexMeta.normalizeName(toSqlWithoutTbl()); for (Expr expr : exprs) { if (CreateMaterializedViewStmt.isMVColumnNormal(name) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java index 8fc52fbe33..f966b2ab98 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java @@ -272,6 +272,9 @@ public abstract class QueryStmt extends StatementBase implements Queriable { } public boolean isDisableTuplesMVRewriter(Expr expr) { + if (disableTuplesMVRewriter.isEmpty()) { + return false; + } return expr.isBoundByTupleIds(disableTuplesMVRewriter.stream().collect(Collectors.toList())); } 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 9b7e716b9d..99ebfa929a 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 @@ -1327,6 +1327,7 @@ public class SingleNodePlanner { String errorMsg = "select fail reason: "; if (queryStmt instanceof SelectStmt) { SelectStmt selectStmt = (SelectStmt) queryStmt; + Set disableTuplesMVRewriter = Sets.newHashSet(); for (TableRef tableRef : selectStmt.getTableRefs()) { if (tableRef instanceof InlineViewRef) { selectFailed |= selectMaterializedView(((InlineViewRef) tableRef).getViewStmt(), @@ -1386,9 +1387,10 @@ public class SingleNodePlanner { } if (tupleSelectFailed) { selectFailed = true; - selectStmt.updateDisableTuplesMVRewriter(olapScanNode.getTupleId()); + disableTuplesMVRewriter.add(olapScanNode.getTupleId()); } } + selectStmt.updateDisableTuplesMVRewriter(disableTuplesMVRewriter); } else { Preconditions.checkState(queryStmt instanceof SetOperationStmt); SetOperationStmt unionStmt = (SetOperationStmt) queryStmt; diff --git a/regression-test/data/mv_p0/multi_slot_k123p/multi_slot_k123p.out b/regression-test/data/mv_p0/multi_slot_k123p/multi_slot_k123p.out index 8065838336..8cd7e32239 100644 --- a/regression-test/data/mv_p0/multi_slot_k123p/multi_slot_k123p.out +++ b/regression-test/data/mv_p0/multi_slot_k123p/multi_slot_k123p.out @@ -24,3 +24,29 @@ 3 \N 3 \N +-- !select_mv -- +-4 -4 +-4 -4 +-4 -4 +-4 -4 +1 1 +2 2 +3 -3 +3 -3 +3 -3 +3 -3 +3 -3 +3 -3 +3 -3 +3 -3 +3 -3 + +-- !select_mv -- +-4 5.7.99 +-4 5.7.99 +1 5.7.99 +2 5.7.99 +3 5.7.99 +3 5.7.99 +3 5.7.99 + diff --git a/regression-test/suites/mv_p0/multi_slot_k123p/multi_slot_k123p.groovy b/regression-test/suites/mv_p0/multi_slot_k123p/multi_slot_k123p.groovy index a8e6595d79..90e98a4dc3 100644 --- a/regression-test/suites/mv_p0/multi_slot_k123p/multi_slot_k123p.groovy +++ b/regression-test/suites/mv_p0/multi_slot_k123p/multi_slot_k123p.groovy @@ -56,4 +56,17 @@ suite ("multi_slot_k123p") { contains "(k123p)" } qt_select_mv "select k1,k2+k3 from d_table order by k1;" + + explain { + sql("select lhs.k1,rhs.k2 from d_table as lhs right join d_table as rhs on lhs.k1=rhs.k1;") + notContains "(k123p)" + notContains "`mv_" + } + qt_select_mv "select lhs.k1,rhs.k2 from d_table as lhs right join d_table as rhs on lhs.k1=rhs.k1 order by lhs.k1;" + + explain { + sql("select k1,version() from d_table;") + contains "(k123p)" + } + qt_select_mv "select k1,version() from d_table order by k1;" }