You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/06/02 16:17:21 UTC

[incubator-doris] 02/04: [fix] fix invalid SQL rewrite for field in materialized view (#9877)

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

morningman pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git

commit 9a7d70b2f097d0c29ba85dca18f72018503cf71a
Author: Kikyou1997 <33...@users.noreply.github.com>
AuthorDate: Thu Jun 2 23:43:13 2022 +0800

    [fix] fix invalid SQL rewrite for field in materialized view (#9877)
---
 .../apache/doris/rewrite/mvrewrite/CountFieldToSum.java  | 16 +++++++++-------
 .../doris/planner/MaterializedViewFunctionTest.java      | 10 ++++++++++
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/mvrewrite/CountFieldToSum.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/mvrewrite/CountFieldToSum.java
index ec3ce7e670..0b06cd52eb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/mvrewrite/CountFieldToSum.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/mvrewrite/CountFieldToSum.java
@@ -22,7 +22,6 @@ import org.apache.doris.analysis.CreateMaterializedViewStmt;
 import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.FunctionCallExpr;
 import org.apache.doris.analysis.SlotRef;
-import org.apache.doris.analysis.TableName;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.OlapTable;
@@ -81,15 +80,18 @@ public class CountFieldToSum implements ExprRewriteRule {
         }
 
         // rewrite expr
-        return rewriteExpr(fnChild0, mvColumn, analyzer);
+        return rewriteExpr(mvColumn, analyzer);
     }
 
-    private Expr rewriteExpr(SlotRef queryColumnSlotRef, Column mvColumn, Analyzer analyzer) {
+    private Expr rewriteExpr(Column mvColumn, Analyzer analyzer) {
         Preconditions.checkNotNull(mvColumn);
-        Preconditions.checkNotNull(queryColumnSlotRef);
-        TableName tableName = queryColumnSlotRef.getTableName();
-        Preconditions.checkNotNull(tableName);
-        SlotRef mvSlotRef = new SlotRef(tableName, mvColumn.getName());
+        // Notice that we shouldn't set table name field of mvSlotRef here, for we will analyze the new mvSlotRef
+        // later, if the table name was set here, the Analyzer::registerColumnRef would invoke
+        // Analyzer::resolveColumnRef(TableName, String) which only try to find the column from the tupleByAlias,
+        // as at the most time the alias is not equal with the origin table name, so it would cause the unexpected
+        // exception to Unknown column, because we can't find an alias which named as origin table name that has
+        // required column.
+        SlotRef mvSlotRef = new SlotRef(null, mvColumn.getName());
         List<Expr> newFnParams = Lists.newArrayList();
         newFnParams.add(mvSlotRef);
         FunctionCallExpr result = new FunctionCallExpr("sum", newFnParams);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/MaterializedViewFunctionTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/MaterializedViewFunctionTest.java
index a980ff9a67..1e34a47b84 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/MaterializedViewFunctionTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/MaterializedViewFunctionTest.java
@@ -850,4 +850,14 @@ public class MaterializedViewFunctionTest {
         dorisAssert.query(query).explainContains("mv");
         dorisAssert.dropTable("agg_table", true);
     }
+
+    @Test
+    public void testSelectMVWithTableAlias() throws Exception {
+        String createUserTagMVSql = "create materialized view " + USER_TAG_MV_NAME + " as select user_id, "
+                + "count(tag_id) from " + USER_TAG_TABLE_NAME + " group by user_id;";
+        dorisAssert.withMaterializedView(createUserTagMVSql);
+        String query = "select count(tag_id) from " + USER_TAG_TABLE_NAME + " t ;";
+        String mvColumnName = CreateMaterializedViewStmt.mvColumnBuilder(FunctionSet.COUNT, "tag_id");
+        dorisAssert.query(query).explainContains(USER_TAG_MV_NAME, mvColumnName);
+    }
 }


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