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]