This is an automated email from the ASF dual-hosted git repository.
yiguolei 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 0de94e857f [Bug](materialized view) fix wrong match mv when mv have
where clause (#21797)
0de94e857f is described below
commit 0de94e857ff234d56eb6608b02c5d558335dcdf2
Author: Pxl <[email protected]>
AuthorDate: Wed Jul 19 01:11:39 2023 +0800
[Bug](materialized view) fix wrong match mv when mv have where clause
(#21797)
---
.../doris/nereids/jobs/executor/Rewriter.java | 1 +
.../mv/AbstractSelectMaterializedIndexRule.java | 55 +++++++---
.../mv/SelectMaterializedIndexWithAggregate.java | 18 ++--
.../SelectMaterializedIndexWithoutAggregate.java | 14 ++-
.../org/apache/doris/planner/OlapScanNode.java | 4 +-
.../java/org/apache/doris/planner/PlanNode.java | 2 +-
.../testAggQueryOnAggMV3/testAggQueryOnAggMV3.out | 2 +
.../data/mv_p0/where/k123_nereids/k123_nereids.out | 61 +++++++++++
.../testAggQueryOnAggMV3.groovy | 11 +-
.../mv_p0/where/k123_nereids/k123_nereids.groovy | 117 +++++++++++++++++++++
10 files changed, 244 insertions(+), 41 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
index d1d33d2514..a1008ff945 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
@@ -268,6 +268,7 @@ public class Rewriter extends AbstractBatchJobExecutor {
topDown(
new SelectMaterializedIndexWithAggregate(),
new SelectMaterializedIndexWithoutAggregate(),
+ new EliminateFilter(),
new PushdownFilterThroughProject(),
new MergeProjects(),
new PruneOlapScanTablet()
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java
index bc77b8d058..e91c685fc2 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.rewrite.mv;
import org.apache.doris.analysis.CreateMaterializedViewStmt;
import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.MaterializedIndex;
+import org.apache.doris.catalog.MaterializedIndexMeta;
import org.apache.doris.catalog.OlapTable;
import org.apache.doris.nereids.parser.NereidsParser;
import org.apache.doris.nereids.trees.expressions.Alias;
@@ -43,6 +44,7 @@ import
org.apache.doris.nereids.trees.expressions.functions.scalar.HllHash;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ScalarFunction;
import org.apache.doris.nereids.trees.expressions.functions.scalar.ToBitmap;
import
org.apache.doris.nereids.trees.expressions.functions.scalar.ToBitmapWithCheck;
+import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.nereids.trees.expressions.literal.TinyIntLiteral;
import
org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
@@ -55,6 +57,7 @@ import
org.apache.doris.nereids.trees.plans.logical.LogicalProject;
import org.apache.doris.nereids.trees.plans.logical.LogicalRepeat;
import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanVisitor;
import org.apache.doris.nereids.util.ExpressionUtils;
+import org.apache.doris.planner.PlanNode;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -90,27 +93,33 @@ public abstract class AbstractSelectMaterializedIndexRule {
}
}
- protected boolean containAllRequiredColumns(
- MaterializedIndex index,
- LogicalOlapScan scan,
- Set<Slot> requiredScanOutput,
- Set<? extends Expression> requiredExpr) {
-
+ protected boolean containAllRequiredColumns(MaterializedIndex index,
LogicalOlapScan scan,
+ Set<Slot> requiredScanOutput, Set<? extends Expression>
requiredExpr, Set<Expression> predicateExpr) {
OlapTable table = scan.getTable();
+ MaterializedIndexMeta meta =
table.getIndexMetaByIndexId(index.getId());
+
+ Set<String> predicateExprSql = predicateExpr.stream().map(e ->
e.toSql()).collect(Collectors.toSet());
+ Set<String> indexConjuncts =
PlanNode.splitAndCompoundPredicateToConjuncts(meta.getWhereClause()).stream()
+ .map(e -> new
NereidsParser().parseExpression(e.toSql()).toSql()).collect(Collectors.toSet());
+ Set<String> commonConjuncts = indexConjuncts.stream().filter(e ->
predicateExprSql.contains(e))
+ .collect(Collectors.toSet());
+ if (commonConjuncts.size() != indexConjuncts.size()) {
+ return false;
+ }
Set<String> requiredMvColumnNames = requiredScanOutput.stream()
.map(s ->
normalizeName(Column.getNameWithoutMvPrefix(s.getName())))
.collect(Collectors.toCollection(() -> new
TreeSet<String>(String.CASE_INSENSITIVE_ORDER)));
- Set<String> mvColNames = table.getSchemaByIndexId(index.getId(),
true).stream()
+ Set<String> mvColNames = meta.getSchema().stream()
.map(c ->
normalizeName(parseMvColumnToSql(c.getNameWithoutMvPrefix())))
.collect(Collectors.toCollection(() -> new
TreeSet<String>(String.CASE_INSENSITIVE_ORDER)));
+ mvColNames.addAll(indexConjuncts);
return mvColNames.containsAll(requiredMvColumnNames)
- || requiredExpr.stream()
-
.map(AbstractSelectMaterializedIndexRule::removeCastAndAlias)
- .filter(e -> !containsAllColumn(e, mvColNames))
- .collect(Collectors.toSet()).isEmpty();
+ && (indexConjuncts.isEmpty() || commonConjuncts.size() ==
predicateExprSql.size())
+ ||
requiredExpr.stream().map(AbstractSelectMaterializedIndexRule::removeCastAndAlias)
+ .filter(e -> !containsAllColumn(e,
mvColNames)).collect(Collectors.toSet()).isEmpty();
}
public static String parseMvColumnToSql(String mvName) {
@@ -386,7 +395,7 @@ public abstract class AbstractSelectMaterializedIndexRule {
Map<Slot, Slot> baseSlotToMvSlot = new HashMap<>();
Map<String, Slot> mvNameToMvSlot = new HashMap<>();
if (mvPlan.getSelectedIndexId() == mvPlan.getTable().getBaseIndexId())
{
- return new SlotContext(baseSlotToMvSlot, mvNameToMvSlot);
+ return new SlotContext(baseSlotToMvSlot, mvNameToMvSlot, new
TreeSet<Expression>());
}
for (Slot mvSlot :
mvPlan.getOutputByIndex(mvPlan.getSelectedIndexId())) {
boolean isPushed = false;
@@ -411,7 +420,12 @@ public abstract class AbstractSelectMaterializedIndexRule {
mvNameToMvSlot.put(normalizeName(mvSlot.getName()), mvSlot);
}
}
- return new SlotContext(baseSlotToMvSlot, mvNameToMvSlot);
+ OlapTable table = mvPlan.getTable();
+ MaterializedIndexMeta meta =
table.getIndexMetaByIndexId(mvPlan.getSelectedIndexId());
+
+ return new SlotContext(baseSlotToMvSlot, mvNameToMvSlot,
+
PlanNode.splitAndCompoundPredicateToConjuncts(meta.getWhereClause()).stream()
+ .map(e -> new
NereidsParser().parseExpression(e.toSql())).collect(Collectors.toSet()));
}
/** SlotContext */
@@ -422,9 +436,13 @@ public abstract class AbstractSelectMaterializedIndexRule {
// selected mv Slot name to mv Slot, we must use ImmutableSortedMap
because column name could be uppercase
public final ImmutableSortedMap<String, Slot> mvNameToMvSlot;
- public SlotContext(Map<Slot, Slot> baseSlotToMvSlot, Map<String, Slot>
mvNameToMvSlot) {
+ public final ImmutableSet<Expression> trueExprs;
+
+ public SlotContext(Map<Slot, Slot> baseSlotToMvSlot, Map<String, Slot>
mvNameToMvSlot,
+ Set<Expression> trueExprs) {
this.baseSlotToMvSlot = ImmutableMap.copyOf(baseSlotToMvSlot);
this.mvNameToMvSlot = ImmutableSortedMap.copyOf(mvNameToMvSlot,
String.CASE_INSENSITIVE_ORDER);
+ this.trueExprs = ImmutableSet.copyOf(trueExprs);
}
}
@@ -520,9 +538,12 @@ public abstract class AbstractSelectMaterializedIndexRule {
// selected mv Slot name to mv Slot, we must use ImmutableSortedMap
because column name could be uppercase
private final ImmutableSortedMap<String, Slot> mvNameToMvSlot;
+ private final ImmutableSet<String> trueExprs;
+
public ReplaceExpressionWithMvColumn(SlotContext slotContext) {
this.baseSlotToMvSlot =
ImmutableMap.copyOf(slotContext.baseSlotToMvSlot);
this.mvNameToMvSlot =
ImmutableSortedMap.copyOf(slotContext.mvNameToMvSlot,
String.CASE_INSENSITIVE_ORDER);
+ this.trueExprs = slotContext.trueExprs.stream().map(e ->
e.toSql()).collect(ImmutableSet.toImmutableSet());
}
public Expression replace(Expression expression) {
@@ -533,9 +554,11 @@ public abstract class AbstractSelectMaterializedIndexRule {
public Expression visit(Expression expr, Void context) {
if (notUseMv() ||
org.apache.doris.analysis.CreateMaterializedViewStmt.isMVColumn(expr.toSql())) {
return expr;
+ } else if (trueExprs.contains(expr.toSql())) {
+ return BooleanLiteral.TRUE;
} else if (checkExprIsMvColumn(expr)) {
- return mvNameToMvSlot.get(
-
org.apache.doris.analysis.CreateMaterializedViewStmt.mvColumnBuilder(expr.toSql()));
+ return mvNameToMvSlot
+
.get(org.apache.doris.analysis.CreateMaterializedViewStmt.mvColumnBuilder(expr.toSql()));
} else {
expr = super.visit(expr, context);
return expr;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
index 7d0b57d649..062119947b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
@@ -711,12 +711,11 @@ public class SelectMaterializedIndexWithAggregate extends
AbstractSelectMaterial
List<MaterializedIndex> haveAllRequiredColumns = Streams.concat(
candidatesWithoutRewriting.stream()
- .filter(index -> containAllRequiredColumns(
- index, scan, nonVirtualRequiredScanOutput,
requiredExpr)),
- candidatesWithRewriting
- .stream()
+ .filter(index -> containAllRequiredColumns(index,
scan, nonVirtualRequiredScanOutput,
+ requiredExpr, predicates)),
+ candidatesWithRewriting.stream()
.filter(aggRewriteResult ->
containAllRequiredColumns(aggRewriteResult.index, scan,
- aggRewriteResult.requiredScanOutput,
requiredExpr))
+ aggRewriteResult.requiredScanOutput,
requiredExpr, predicates))
.map(aggRewriteResult -> aggRewriteResult.index)
).collect(Collectors.toList());
@@ -757,11 +756,10 @@ public class SelectMaterializedIndexWithAggregate extends
AbstractSelectMaterial
return baseIndexSelectResult;
} else {
List<MaterializedIndex> rollupsWithAllRequiredCols =
- Stream.concat(candidatesWithoutRewriting.stream(),
- indexesGroupByIsBaseOrNot.get(true).stream())
- .filter(index -> containAllRequiredColumns(
- index, scan, nonVirtualRequiredScanOutput,
requiredExpr))
- .collect(Collectors.toList());
+ Stream.concat(candidatesWithoutRewriting.stream(),
indexesGroupByIsBaseOrNot.get(true).stream())
+ .filter(index ->
containAllRequiredColumns(index, scan, nonVirtualRequiredScanOutput,
+ requiredExpr, predicates))
+ .collect(Collectors.toList());
long selectedIndex =
selectBestIndex(rollupsWithAllRequiredCols, scan, predicates);
if (selectedIndex == scan.getTable().getBaseIndexId()) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java
index f38a4d3670..9a752db653 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithoutAggregate.java
@@ -183,11 +183,10 @@ public class SelectMaterializedIndexWithoutAggregate
extends AbstractSelectMater
}
if (scan.getTable().isDupKeysOrMergeOnWrite()) {
// Set pre-aggregation to `on` to keep consistency with legacy
logic.
- List<MaterializedIndex> candidates =
scan.getTable().getVisibleIndex().stream()
- .filter(index -> index.getId() != baseIndexId)
- .filter(index -> !indexHasAggregate(index, scan))
- .filter(index -> containAllRequiredColumns(index, scan,
- requiredScanOutputSupplier.get(), requiredExpr))
+ List<MaterializedIndex> candidates = scan
+ .getTable().getVisibleIndex().stream().filter(index ->
index.getId() != baseIndexId)
+ .filter(index -> !indexHasAggregate(index,
scan)).filter(index -> containAllRequiredColumns(index,
+ scan, requiredScanOutputSupplier.get(),
requiredExpr, predicatesSupplier.get()))
.collect(Collectors.toList());
long bestIndex = selectBestIndex(candidates, scan,
predicatesSupplier.get());
return scan.withMaterializedIndexSelected(PreAggStatus.on(),
bestIndex);
@@ -207,9 +206,8 @@ public class SelectMaterializedIndexWithoutAggregate
extends AbstractSelectMater
// So only base index and indexes that have all the keys could be
used.
List<MaterializedIndex> candidates =
table.getVisibleIndex().stream()
.filter(index ->
table.getKeyColumnsByIndexId(index.getId()).size() == baseIndexKeySize)
- .filter(index -> containAllRequiredColumns(
- index, scan, requiredScanOutputSupplier.get(),
- predicatesSupplier.get()))
+ .filter(index -> containAllRequiredColumns(index, scan,
requiredScanOutputSupplier.get(),
+ requiredExpr, predicatesSupplier.get()))
.collect(Collectors.toList());
if (candidates.size() == 1) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
index 1fcac274ec..6f10836a90 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
@@ -100,7 +100,6 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
@@ -359,8 +358,7 @@ public class OlapScanNode extends ScanNode {
return;
}
Expr vconjunct =
convertConjunctsToAndCompoundPredicate(conjuncts).replaceSubPredicate(whereExpr);
- conjuncts =
splitAndCompoundPredicateToConjuncts(vconjunct).stream().filter(Objects::nonNull)
- .collect(Collectors.toList());
+ conjuncts =
splitAndCompoundPredicateToConjuncts(vconjunct).stream().collect(Collectors.toList());
}
/**
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
index fe7f5c2e9b..568975b93d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
@@ -439,7 +439,7 @@ public abstract class PlanNode extends TreeNode<PlanNode>
implements PlanStats {
conjuncts.addAll(splitAndCompoundPredicateToConjuncts(vconjunct.getChild(1)));
}
}
- if (conjuncts.isEmpty()) {
+ if (vconjunct != null && conjuncts.isEmpty()) {
conjuncts.add(vconjunct);
}
return conjuncts;
diff --git
a/regression-test/data/mv_p0/ut/testAggQueryOnAggMV3/testAggQueryOnAggMV3.out
b/regression-test/data/mv_p0/ut/testAggQueryOnAggMV3/testAggQueryOnAggMV3.out
index 279e3ee410..0ae3aec19b 100644
---
a/regression-test/data/mv_p0/ut/testAggQueryOnAggMV3/testAggQueryOnAggMV3.out
+++
b/regression-test/data/mv_p0/ut/testAggQueryOnAggMV3/testAggQueryOnAggMV3.out
@@ -8,3 +8,5 @@
-- !select_mv --
4 4
+-- !select_mv --
+
diff --git a/regression-test/data/mv_p0/where/k123_nereids/k123_nereids.out
b/regression-test/data/mv_p0/where/k123_nereids/k123_nereids.out
new file mode 100644
index 0000000000..d5dc7d3c21
--- /dev/null
+++ b/regression-test/data/mv_p0/where/k123_nereids/k123_nereids.out
@@ -0,0 +1,61 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !select_star --
+1 1 1 a
+1 1 1 a
+2 2 2 b
+2 2 2 b
+3 -3 \N c
+3 -3 \N c
+
+-- !select_mv --
+1 2
+1 2
+2 4
+2 4
+3 \N
+3 \N
+
+-- !select_mv --
+1 2
+1 2
+
+-- !select_mv --
+2 4
+2 4
+
+-- !select_mv --
+1 2
+1 2
+
+-- !select_mv --
+2 4
+2 4
+
+-- !select_mv --
+1 2
+1 2
+
+-- !select_mv --
+2 4
+2 4
+
+-- !select_mv_constant --
+\N
+\N
+\N
+\N
+\N
+\N
+
+-- !select_mv --
+
+-- !select_mv --
+
+-- !select_mv --
+1 true
+1 true
+
+-- !select_mv --
+1 false
+1 false
+
diff --git
a/regression-test/suites/mv_p0/ut/testAggQueryOnAggMV3/testAggQueryOnAggMV3.groovy
b/regression-test/suites/mv_p0/ut/testAggQueryOnAggMV3/testAggQueryOnAggMV3.groovy
index 5d881724e0..cb66c8a461 100644
---
a/regression-test/suites/mv_p0/ut/testAggQueryOnAggMV3/testAggQueryOnAggMV3.groovy
+++
b/regression-test/suites/mv_p0/ut/testAggQueryOnAggMV3/testAggQueryOnAggMV3.groovy
@@ -39,7 +39,7 @@ suite ("testAggQueryOnAggMV3") {
- createMV("create materialized view emps_mv as select deptno, commission,
sum(salary) from emps group by deptno, commission ;")
+ createMV("create materialized view emps_mv as select deptno, commission,
sum(salary) from emps group by deptno, commission;")
explain {
@@ -49,10 +49,15 @@ suite ("testAggQueryOnAggMV3") {
qt_select_star "select * from emps order by empid;"
- explain {
+ explain {
sql("select commission, sum(salary) from emps where commission *
(deptno + commission) = 100 group by commission order by commission;")
contains "(emps_mv)"
}
qt_select_mv "select commission, sum(salary) from emps where commission *
(deptno + commission) = 100 group by commission order by commission;"
-}
\ No newline at end of file
+ explain {
+ sql("select commission, sum(salary) from emps where commission = 100
group by commission order by commission;")
+ contains "(emps_mv)"
+ }
+ qt_select_mv "select commission, sum(salary) from emps where commission =
100 group by commission order by commission;"
+}
diff --git
a/regression-test/suites/mv_p0/where/k123_nereids/k123_nereids.groovy
b/regression-test/suites/mv_p0/where/k123_nereids/k123_nereids.groovy
new file mode 100644
index 0000000000..e034beaf11
--- /dev/null
+++ b/regression-test/suites/mv_p0/where/k123_nereids/k123_nereids.groovy
@@ -0,0 +1,117 @@
+// 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 ("k123p_nereids") {
+ sql """ DROP TABLE IF EXISTS d_table; """
+ sql """set enable_nereids_planner=true"""
+ 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 k123p1w as select k1,k2+k3 from
d_table where k1 = 1;""")
+ createMV ("""create materialized view k123p4w as select k1,k2+k3 from
d_table where k4 = "b";""")
+ createMV ("""create materialized view kwh1 as select k2 from d_table where
k1=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';"
+
+ qt_select_star "select * from d_table order by k1;"
+
+ explain {
+ sql("select k1,k2+k3 from d_table order by k1;")
+ contains "(d_table)"
+ }
+ qt_select_mv "select k1,k2+k3 from d_table order by k1;"
+
+ explain {
+ sql("select k1,k2+k3 from d_table where k1 = 1 order by k1;")
+ contains "(k123p1w)"
+ }
+ qt_select_mv "select k1,k2+k3 from d_table where k1 = 1 order by k1;"
+
+ explain {
+ sql("select k1,k2+k3 from d_table where k1 = 2 order by k1;")
+ contains "(d_table)"
+ }
+ qt_select_mv "select k1,k2+k3 from d_table where k1 = 2 order by k1;"
+
+ explain {
+ sql("select k1,k2+k3 from d_table where k1 = '1' order by k1;")
+ contains "(k123p1w)"
+ }
+ qt_select_mv "select k1,k2+k3 from d_table where k1 = '1' order by k1;"
+
+ explain {
+ sql("select k1,k2+k3 from d_table where k4 = 'b' order by k1;")
+ contains "(k123p4w)"
+ }
+ qt_select_mv "select k1,k2+k3 from d_table where k4 = 'b' order by k1;"
+
+ explain {
+ sql("select k1,k2+k3 from d_table where k4 = 'a' order by k1;")
+ contains "(d_table)"
+ }
+ qt_select_mv "select k1,k2+k3 from d_table where k4 = 'a' order by k1;"
+
+ explain {
+ sql("""select k1,k2+k3 from d_table where k1 = 2 and k4 = "b";""")
+ contains "(k123p4w)"
+ }
+ qt_select_mv """select k1,k2+k3 from d_table where k1 = 2 and k4 = "b"
order by k1;"""
+
+ qt_select_mv_constant """select bitmap_empty() from d_table where true;"""
+
+ explain {
+ sql("select k2 from d_table where k1=1 and (k1>2 or k1 < 0) order by
k2;")
+ contains "(d_table)"
+ }
+ qt_select_mv "select k2 from d_table where k1=1 and (k1>2 or k1 < 0) order
by k2;"
+
+ explain {
+ sql("select k2 from d_table where k1=1 and (k2>2 or k2<0) order by
k2;")
+ contains "(kwh1)"
+ }
+ qt_select_mv "select k2 from d_table where k1=1 and (k2>2 or k2<0) order
by k2;"
+
+ explain {
+ sql("select k2,k1=1 from d_table where k1=1 order by k2;")
+ contains "(kwh1)"
+ }
+ qt_select_mv "select k2,k1=1 from d_table where k1=1 order by k2;"
+
+ explain {
+ sql("select k2,k1=2 from d_table where k1=1 order by k2;")
+ contains "(d_table)"
+ }
+ qt_select_mv "select k2,k1=2 from d_table where k1=1 order by k2;"
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]