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

panxiaolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new a92115f709 [Bug](materialized-view) fix select mv rollback fail on 
left join (#17850)
a92115f709 is described below

commit a92115f709a12b51b70ccfd795524132e4fb5d68
Author: Pxl <[email protected]>
AuthorDate: Mon Mar 20 19:14:17 2023 +0800

    [Bug](materialized-view) fix select mv rollback fail on left join (#17850)
    
    fix select mv rollback fail on left join
---
 be/src/olap/reader.cpp                             |  7 +--
 be/src/olap/reader.h                               |  2 +-
 be/src/olap/tablet_schema.cpp                      | 10 ++++
 be/src/olap/tablet_schema.h                        |  1 +
 be/src/vec/exprs/vslot_ref.cpp                     | 10 ++--
 .../main/java/org/apache/doris/analysis/Expr.java  | 13 ++++++
 .../apache/doris/analysis/ExprSubstitutionMap.java |  7 +--
 .../java/org/apache/doris/analysis/QueryStmt.java  |  6 +--
 .../java/org/apache/doris/analysis/SelectStmt.java | 16 +++++--
 .../java/org/apache/doris/analysis/SlotRef.java    |  5 ++
 .../doris/analysis/TupleIsNullPredicate.java       |  5 ++
 .../org/apache/doris/rewrite/ExprRewriter.java     |  6 ++-
 .../doris/rewrite/mvrewrite/ExprToSlotRefRule.java | 24 +++++++---
 .../data/mv_p0/join/rollback1/rollback1.out        | 51 +++++++++++++++++++++
 .../testIncorrectMVRewriteInSubquery.out           |  3 +-
 .../suites/mv_p0/join/rollback1/rollback1.groovy   | 53 ++++++++++++++++++++++
 .../testIncorrectMVRewriteInSubquery.groovy        |  2 +-
 17 files changed, 189 insertions(+), 32 deletions(-)

diff --git a/be/src/olap/reader.cpp b/be/src/olap/reader.cpp
index dba7f222ac..0d5dbf9fee 100644
--- a/be/src/olap/reader.cpp
+++ b/be/src/olap/reader.cpp
@@ -242,7 +242,7 @@ Status TabletReader::_init_params(const ReaderParams& 
read_params) {
     _tablet_schema = read_params.tablet_schema;
     _reader_context.runtime_state = read_params.runtime_state;
 
-    _init_conditions_param(read_params);
+    RETURN_IF_ERROR(_init_conditions_param(read_params));
     _init_conditions_param_except_leafnode_of_andnode(read_params);
 
     Status res = _init_delete_condition(read_params);
@@ -438,12 +438,12 @@ Status TabletReader::_init_orderby_keys_param(const 
ReaderParams& read_params) {
     return Status::OK();
 }
 
-void TabletReader::_init_conditions_param(const ReaderParams& read_params) {
+Status TabletReader::_init_conditions_param(const ReaderParams& read_params) {
     for (auto& condition : read_params.conditions) {
         // These conditions is passed from OlapScannode, but not set column 
unique id here, so that set it here because it
         // is too complicated to modify related interface
         TCondition tmp_cond = condition;
-
+        RETURN_IF_ERROR(_tablet_schema->have_column(tmp_cond.column_name));
         auto condition_col_uid = 
_tablet_schema->column(tmp_cond.column_name).unique_id();
         tmp_cond.__set_column_unique_id(condition_col_uid);
         ColumnPredicate* predicate =
@@ -513,6 +513,7 @@ void TabletReader::_init_conditions_param(const 
ReaderParams& read_params) {
             }
         }
     }
+    return Status::OK();
 }
 
 void TabletReader::_init_conditions_param_except_leafnode_of_andnode(
diff --git a/be/src/olap/reader.h b/be/src/olap/reader.h
index 813369fca9..d286bf42a6 100644
--- a/be/src/olap/reader.h
+++ b/be/src/olap/reader.h
@@ -201,7 +201,7 @@ protected:
 
     Status _init_orderby_keys_param(const ReaderParams& read_params);
 
-    void _init_conditions_param(const ReaderParams& read_params);
+    Status _init_conditions_param(const ReaderParams& read_params);
 
     void _init_conditions_param_except_leafnode_of_andnode(const ReaderParams& 
read_params);
 
diff --git a/be/src/olap/tablet_schema.cpp b/be/src/olap/tablet_schema.cpp
index dcfac6ef7e..b08bc10f99 100644
--- a/be/src/olap/tablet_schema.cpp
+++ b/be/src/olap/tablet_schema.cpp
@@ -19,6 +19,7 @@
 
 #include <gen_cpp/olap_file.pb.h>
 
+#include "common/status.h"
 #include "exec/tablet_info.h"
 #include "gen_cpp/descriptors.pb.h"
 #include "olap/utils.h"
@@ -849,6 +850,15 @@ void TabletSchema::update_indexes_from_thrift(const 
std::vector<doris::TOlapTabl
     _indexes = std::move(indexes);
 }
 
+Status TabletSchema::have_column(const std::string& field_name) const {
+    if (!_field_name_to_index.count(field_name)) {
+        return Status::Error<ErrorCode::INTERNAL_ERROR>(
+                "Not found field_name, field_name:{}, schema:{}", field_name,
+                get_all_field_names());
+    }
+    return Status::OK();
+}
+
 const TabletColumn& TabletSchema::column(const std::string& field_name) const {
     DCHECK(_field_name_to_index.count(field_name) != 0)
             << ", field_name=" << field_name << ", field_name_to_index=" << 
get_all_field_names();
diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h
index c298cc1e36..08654a4f09 100644
--- a/be/src/olap/tablet_schema.h
+++ b/be/src/olap/tablet_schema.h
@@ -186,6 +186,7 @@ public:
     int32_t field_index(int32_t col_unique_id) const;
     const TabletColumn& column(size_t ordinal) const;
     const TabletColumn& column(const std::string& field_name) const;
+    Status have_column(const std::string& field_name) const;
     const TabletColumn& column_by_uid(int32_t col_unique_id) const;
     const std::vector<TabletColumn>& columns() const;
     size_t num_columns() const { return _num_columns; }
diff --git a/be/src/vec/exprs/vslot_ref.cpp b/be/src/vec/exprs/vslot_ref.cpp
index 97645fb53d..fecb99cf4c 100644
--- a/be/src/vec/exprs/vslot_ref.cpp
+++ b/be/src/vec/exprs/vslot_ref.cpp
@@ -17,8 +17,7 @@
 
 #include "vec/exprs/vslot_ref.h"
 
-#include <fmt/format.h>
-
+#include "common/status.h"
 #include "runtime/descriptors.h"
 
 namespace doris::vectorized {
@@ -41,7 +40,8 @@ Status VSlotRef::prepare(doris::RuntimeState* state, const 
doris::RowDescriptor&
     }
     const SlotDescriptor* slot_desc = 
state->desc_tbl().get_slot_descriptor(_slot_id);
     if (slot_desc == nullptr) {
-        return Status::InternalError("couldn't resolve slot descriptor {}", 
_slot_id);
+        return Status::Error<ErrorCode::INTERNAL_ERROR>("couldn't resolve slot 
descriptor {}",
+                                                        _slot_id);
     }
     _column_name = &slot_desc->col_name();
     if (!slot_desc->need_materialize()) {
@@ -51,8 +51,8 @@ Status VSlotRef::prepare(doris::RuntimeState* state, const 
doris::RowDescriptor&
     }
     _column_id = desc.get_column_id(_slot_id);
     if (_column_id < 0) {
-        return Status::InternalError(
-                "VSlotRef have invalid slot id: {}, desc: {}, slot_desc: {}, 
desc_tbl: {}",
+        return Status::Error<ErrorCode::INTERNAL_ERROR>(
+                "VSlotRef {} have invalid slot id: {}, desc: {}, slot_desc: 
{}, desc_tbl: {}",
                 *_column_name, _slot_id, desc.debug_string(), 
slot_desc->debug_string(),
                 state->desc_tbl().debug_string());
     }
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 ef8b2e3fd2..71022ad81e 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
@@ -1224,6 +1224,19 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
         return true;
     }
 
+
+    /**
+     * Returns true if expr have child bound by tids, otherwise false.
+     */
+    public boolean isRelativedByTupleIds(List<TupleId> tids) {
+        for (Expr child : children) {
+            if (child.isRelativedByTupleIds(tids)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * Returns true if expr is fully bound by slotId, otherwise false.
      */
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java
index 9423d673b5..2cb6a5be2a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java
@@ -86,9 +86,10 @@ public final class ExprSubstitutionMap {
                 if (lhsExpr.notCheckDescIdEquals(lhs.get(i))) {
                     return rhs.get(i);
                 }
-            }
-            if (lhsExpr.equals(lhs.get(i))) {
-                return rhs.get(i);
+            } else {
+                if (lhsExpr.equals(lhs.get(i))) {
+                    return rhs.get(i);
+                }
             }
         }
         return null;
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 b399477dec..5ecb2a6838 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
@@ -281,14 +281,10 @@ public abstract class QueryStmt extends StatementBase 
implements Queriable {
         }
         ExprRewriter rewriter = analyzer.getMVExprRewriter();
         rewriter.reset();
-        rewriter.setDisableTuplesMVRewriter(disableTuplesMVRewriter);
+        rewriter.setInfoMVRewriter(disableTuplesMVRewriter, mvSMap, aliasSMap);
         rewriter.setUpBottom();
 
         Expr result = rewriter.rewrite(expr, analyzer);
-        if (result != expr) {
-            expr.analyze(analyzer);
-            mvSMap.put(result, expr);
-        }
         return result;
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
index 318426b1f7..9d1fe108d9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -86,7 +86,7 @@ public class SelectStmt extends QueryStmt {
 
     protected SelectList selectList;
     private final ArrayList<String> colLabels; // lower case column labels
-    protected final FromClause fromClause;
+    protected FromClause fromClause;
     protected GroupByClause groupByClause;
     private List<Expr> originalExpr;
 
@@ -122,6 +122,8 @@ public class SelectStmt extends QueryStmt {
     // Set in analyze().
     protected String sqlString;
 
+    boolean isReAnalyze = false;
+
     // Table alias generator used during query rewriting.
     private TableAliasGenerator tableAliasGenerator = null;
 
@@ -248,11 +250,14 @@ public class SelectStmt extends QueryStmt {
         if (whereClause != null) {
             whereClause = originalWhereClause;
         }
+
         for (TableRef tableRef : getTableRefs()) {
             if (tableRef instanceof InlineViewRef) {
                 ((InlineViewRef) tableRef).getViewStmt().resetSelectList();
             }
         }
+
+        isReAnalyze = true;
     }
 
     @Override
@@ -465,9 +470,9 @@ public class SelectStmt extends QueryStmt {
                 }
                 try {
                     Expr expr = tableRef.getOnClause();
-                    if 
(CreateMaterializedViewStmt.isMVColumn(expr.toSqlWithoutTbl())) {
-                        tableRef.setOnClause(expr.trySubstitute(mvSMap, 
analyzer, false));
-                    }
+                    Expr originalExpr = expr.clone().substituteImpl(mvSMap, 
null, analyzer);
+                    originalExpr.reset();
+                    tableRef.setOnClause(originalExpr);
                 } catch (Exception e) {
                     LOG.warn("", e);
                 }
@@ -2033,6 +2038,9 @@ public class SelectStmt extends QueryStmt {
      */
     private Expr rewriteSubquery(Expr expr, Analyzer analyzer)
             throws AnalysisException {
+        if (isReAnalyze) {
+            return null;
+        }
         if (expr instanceof Subquery) {
             if (!(((Subquery) expr).getStatement() instanceof SelectStmt)) {
                 throw new AnalysisException("Only support select subquery in 
case-when clause.");
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
index ffb8c2ef37..95e8c0038e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
@@ -383,6 +383,11 @@ public class SlotRef extends Expr {
         return false;
     }
 
+    @Override
+    public boolean isRelativedByTupleIds(List<TupleId> tids) {
+        return isBoundByTupleIds(tids);
+    }
+
     @Override
     public boolean isBound(SlotId slotId) {
         Preconditions.checkState(isAnalyzed);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/TupleIsNullPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TupleIsNullPredicate.java
index 98e51eca03..2f6c0955d3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/TupleIsNullPredicate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TupleIsNullPredicate.java
@@ -79,6 +79,11 @@ public class TupleIsNullPredicate extends Predicate {
         return false;
     }
 
+    @Override
+    public boolean isRelativedByTupleIds(List<TupleId> tids) {
+        return isBoundByTupleIds(tids);
+    }
+
     @Override
     public Expr clone() {
         return new TupleIsNullPredicate(this);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExprRewriter.java 
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExprRewriter.java
index 04ec7d24e0..dc74cb18ef 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExprRewriter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExprRewriter.java
@@ -22,6 +22,7 @@ package org.apache.doris.rewrite;
 
 import org.apache.doris.analysis.Analyzer;
 import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.ExprSubstitutionMap;
 import org.apache.doris.analysis.JoinOperator;
 import org.apache.doris.analysis.TupleId;
 import org.apache.doris.common.AnalysisException;
@@ -132,10 +133,11 @@ public class ExprRewriter {
         rules = Lists.newArrayList(rule);
     }
 
-    public void setDisableTuplesMVRewriter(Set<TupleId> 
disableTuplesMVRewriter) {
+    public void setInfoMVRewriter(Set<TupleId> disableTuplesMVRewriter, 
ExprSubstitutionMap mvSMap,
+            ExprSubstitutionMap aliasSMap) {
         for (ExprRewriteRule rule : rules) {
             if (rule instanceof ExprToSlotRefRule) {
-                ((ExprToSlotRefRule) 
rule).setDisableTuplesMVRewriter(disableTuplesMVRewriter);
+                ((ExprToSlotRefRule) 
rule).setInfoMVRewriter(disableTuplesMVRewriter, mvSMap, aliasSMap);
             }
         }
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/mvrewrite/ExprToSlotRefRule.java
 
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/mvrewrite/ExprToSlotRefRule.java
index 688600fbdc..b30428a802 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/mvrewrite/ExprToSlotRefRule.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/mvrewrite/ExprToSlotRefRule.java
@@ -20,6 +20,7 @@ package org.apache.doris.rewrite.mvrewrite;
 import org.apache.doris.analysis.Analyzer;
 import org.apache.doris.analysis.CreateMaterializedViewStmt;
 import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.ExprSubstitutionMap;
 import org.apache.doris.analysis.FunctionCallExpr;
 import org.apache.doris.analysis.SlotRef;
 import org.apache.doris.analysis.TableName;
@@ -50,9 +51,14 @@ import java.util.stream.Collectors;
 public class ExprToSlotRefRule implements ExprRewriteRule {
 
     private Set<TupleId> disableTuplesMVRewriter = Sets.newHashSet();
+    private ExprSubstitutionMap mvSMap;
+    private ExprSubstitutionMap aliasSMap;
 
-    public void setDisableTuplesMVRewriter(Set<TupleId> 
disableTuplesMVRewriter) {
+    public void setInfoMVRewriter(Set<TupleId> disableTuplesMVRewriter, 
ExprSubstitutionMap mvSMap,
+            ExprSubstitutionMap aliasSMap) {
         this.disableTuplesMVRewriter.addAll(disableTuplesMVRewriter);
+        this.mvSMap = mvSMap;
+        this.aliasSMap = aliasSMap;
     }
 
     private Pair<OlapTable, TableName> getTable(Expr expr) {
@@ -83,7 +89,7 @@ public class ExprToSlotRefRule implements ExprRewriteRule {
     public boolean isDisableTuplesMVRewriter(Expr expr) {
         boolean result;
         try {
-            result = 
expr.isBoundByTupleIds(disableTuplesMVRewriter.stream().collect(Collectors.toList()));
+            result = 
expr.isRelativedByTupleIds(disableTuplesMVRewriter.stream().collect(Collectors.toList()));
         } catch (Exception e) {
             result = true;
         }
@@ -178,7 +184,7 @@ public class ExprToSlotRefRule implements ExprRewriteRule {
 
         if (mvColumn != null) {
             expr = expr.clone();
-            expr.setChild(0, rewriteExpr(tableName, mvColumn, analyzer));
+            expr.setChild(0, rewriteExpr(tableName, mvColumn, analyzer, 
expr.getChild(0)));
         }
 
         return expr;
@@ -196,7 +202,7 @@ public class ExprToSlotRefRule implements ExprRewriteRule {
 
         if (mvColumn != null) {
             expr = expr.clone();
-            expr.setChild(0, rewriteExpr(tableName, mvColumn, analyzer));
+            expr.setChild(0, rewriteExpr(tableName, mvColumn, analyzer, 
expr.getChild(0)));
         }
 
         return expr;
@@ -245,7 +251,7 @@ public class ExprToSlotRefRule implements ExprRewriteRule {
 
         if (mvColumn != null) {
             expr = (FunctionCallExpr) expr.clone();
-            expr.setChild(0, rewriteExpr(tableName, mvColumn, analyzer));
+            expr.setChild(0, rewriteExpr(tableName, mvColumn, analyzer, 
expr.getChild(0)));
         }
 
         return expr;
@@ -266,14 +272,18 @@ public class ExprToSlotRefRule implements ExprRewriteRule 
{
             }
         }
 
-        return rewriteExpr(tableName, mvColumn, analyzer);
+        return rewriteExpr(tableName, mvColumn, analyzer, expr);
     }
 
-    private Expr rewriteExpr(TableName tableName, Column mvColumn, Analyzer 
analyzer) {
+    private Expr rewriteExpr(TableName tableName, Column mvColumn, Analyzer 
analyzer, Expr originExpr)
+            throws AnalysisException {
         Preconditions.checkNotNull(mvColumn);
         Preconditions.checkNotNull(tableName);
         SlotRef mvSlotRef = new SlotRef(tableName, mvColumn.getDefineName());
         mvSlotRef.analyzeNoThrow(analyzer);
+
+        originExpr.analyze(analyzer);
+        mvSMap.put(mvSlotRef, originExpr.trySubstitute(aliasSMap, analyzer, 
false).clone());
         return mvSlotRef;
     }
 }
diff --git a/regression-test/data/mv_p0/join/rollback1/rollback1.out 
b/regression-test/data/mv_p0/join/rollback1/rollback1.out
new file mode 100644
index 0000000000..2971ecda2d
--- /dev/null
+++ b/regression-test/data/mv_p0/join/rollback1/rollback1.out
@@ -0,0 +1,51 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !select_star --
+-4     -4      -4      d
+1      1       1       a
+2      2       2       b
+3      -3      \N      c
+
+-- !select_mv --
+-4
+1
+2
+3
+
+-- !select_mv --
+-4
+1
+2
+
+-- !select_mv --
+-4
+1
+2
+
+-- !select_mv --
+-4
+1
+2
+3
+
+-- !select_mv --
+-4
+-3
+1
+2
+
+-- !select_mv --
+-4
+1
+2
+
+-- !select_mv --
+-4
+1
+2
+
+-- !select_mv --
+-4
+-3
+1
+2
+
diff --git 
a/regression-test/data/mv_p0/ut/testIncorrectMVRewriteInSubquery/testIncorrectMVRewriteInSubquery.out
 
b/regression-test/data/mv_p0/ut/testIncorrectMVRewriteInSubquery/testIncorrectMVRewriteInSubquery.out
index 472739cdad..ab95a5b36f 100644
--- 
a/regression-test/data/mv_p0/ut/testIncorrectMVRewriteInSubquery/testIncorrectMVRewriteInSubquery.out
+++ 
b/regression-test/data/mv_p0/ut/testIncorrectMVRewriteInSubquery/testIncorrectMVRewriteInSubquery.out
@@ -1,8 +1,9 @@
 -- This file is automatically generated. You should know what you did if you 
want to edit this
 -- !select_star --
 2020-01-01     1       a       1
-2020-01-01     1       a       1
+2020-01-01     1       a       2
 2020-01-02     2       b       2
 
 -- !select_mv --
+1      \N
 
diff --git a/regression-test/suites/mv_p0/join/rollback1/rollback1.groovy 
b/regression-test/suites/mv_p0/join/rollback1/rollback1.groovy
new file mode 100644
index 0000000000..dfb29fa902
--- /dev/null
+++ b/regression-test/suites/mv_p0/join/rollback1/rollback1.groovy
@@ -0,0 +1,53 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+suite ("rollback1") {
+    sql """ DROP TABLE IF EXISTS d_table; """
+
+    sql """
+            create table d_table(
+                k1 int null,
+                k2 int not null,
+                k3 bigint null,
+                k4 varchar(100) null
+            )
+            duplicate key (k1,k2,k3)
+            distributed BY hash(k1) buckets 3
+            properties("replication_num" = "1");
+        """
+
+    sql "insert into d_table select 1,1,1,'a';"
+    sql "insert into d_table select 2,2,2,'b';"
+    sql "insert into d_table select 3,-3,null,'c';"
+
+    createMV("create materialized view k123p as select k1,k2+k3 from d_table;")
+
+    sql "insert into d_table select -4,-4,-4,'d';"
+
+    qt_select_star "select * from d_table order by k1;"
+
+    qt_select_mv "select k1 p from d_table as t where t.k1 in (select k1 from 
d_table) order by p;"
+    qt_select_mv "select k1 p from d_table as t where t.k1 in (select k2 from 
d_table) order by p;"
+    qt_select_mv "select k1 p from d_table as t where t.k2 in (select k1 from 
d_table) order by p;"
+    qt_select_mv "select k1 p from d_table as t where t.k2 in (select k2 from 
d_table) order by p;"
+    qt_select_mv "select k2 p from d_table as t where t.k1 in (select k1 from 
d_table) order by p;"
+    qt_select_mv "select k2 p from d_table as t where t.k1 in (select k2 from 
d_table) order by p;"
+    qt_select_mv "select k2 p from d_table as t where t.k2 in (select k1 from 
d_table) order by p;"
+    qt_select_mv "select k2 p from d_table as t where t.k2 in (select k2 from 
d_table) order by p;"
+}
diff --git 
a/regression-test/suites/mv_p0/ut/testIncorrectMVRewriteInSubquery/testIncorrectMVRewriteInSubquery.groovy
 
b/regression-test/suites/mv_p0/ut/testIncorrectMVRewriteInSubquery/testIncorrectMVRewriteInSubquery.groovy
index f086c72443..9f2472a896 100644
--- 
a/regression-test/suites/mv_p0/ut/testIncorrectMVRewriteInSubquery/testIncorrectMVRewriteInSubquery.groovy
+++ 
b/regression-test/suites/mv_p0/ut/testIncorrectMVRewriteInSubquery/testIncorrectMVRewriteInSubquery.groovy
@@ -33,7 +33,7 @@ suite ("testIncorrectMVRewriteInSubquery") {
 
     createMV("create materialized view user_tags_mv as select user_id, 
bitmap_union(to_bitmap(tag_id)) from user_tags group by user_id;")
 
-    sql """insert into user_tags values("2020-01-01",1,"a",1);"""
+    sql """insert into user_tags values("2020-01-01",1,"a",2);"""
 
     explain {
         sql("select * from user_tags order by time_col;")


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to