This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 50e81d9db74 [feat](nereids) add more rules to eliminate empty relation
(#34997) -branch-2.1 (#35534)
50e81d9db74 is described below
commit 50e81d9db748c24a07262048975cf17dcd466224
Author: minghong <[email protected]>
AuthorDate: Tue May 28 18:12:42 2024 +0800
[feat](nereids) add more rules to eliminate empty relation (#34997)
-branch-2.1 (#35534)
eliminate empty relations for following patterns:
topn->empty
sort->empty
distribute->empty
project->empty
(cherry picked from commit 8340f23946c0c8e40510ce937acd3342cb2e28b7)
## Proposed changes
Issue Number: close #xxx
<!--Describe your changes.-->
## Further comments
If this is a relatively large or complex change, kick off the discussion
at [[email protected]](mailto:[email protected]) by explaining why
you chose the solution you did and what alternatives you considered,
etc...
---
.../org/apache/doris/nereids/rules/RuleType.java | 4 +
.../rules/rewrite/EliminateEmptyRelation.java | 38 +++++-
.../nereids/rules/rewrite/EliminateLimit.java | 6 +-
.../doris/nereids/jobs/joinorder/TPCHTest.java | 1 +
.../rules/rewrite/EliminateGroupByTest.java | 20 +--
.../nereids/rules/rewrite/EliminateLimitTest.java | 1 +
.../nereids/rules/rewrite/EliminateSortTest.java | 3 +
.../org/apache/doris/nereids/util/PlanChecker.java | 5 +
.../data/empty_relation/eliminate_empty.out | 6 +-
.../load_p0/insert/insert_select_empty_table.out | 7 +-
.../eliminate_empty/query10_empty.out | 5 +
.../suites/empty_relation/eliminate_empty.groovy | 9 +-
.../insert/insert_select_empty_table.groovy | 31 ++---
.../suites/nereids_p0/union/test_union.groovy | 7 +-
.../eliminate_nullaware_anti_join.groovy | 7 +-
.../eliminate_empty/query10_empty.groovy | 150 +++++++++++++++++++++
16 files changed, 247 insertions(+), 53 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
index 71218bd2e8d..1090855190c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
@@ -117,7 +117,11 @@ public enum RuleType {
ELIMINATE_JOIN_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
ELIMINATE_FILTER_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
ELIMINATE_AGG_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
+ ELIMINATE_PROJECT_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
ELIMINATE_UNION_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
+ ELIMINATE_TOPN_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
+ ELIMINATE_SORT_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
+
ELIMINATE_INTERSECTION_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
ELIMINATE_EXCEPT_ON_EMPTYRELATION(RuleTypeClass.REWRITE),
INFER_PREDICATES(RuleTypeClass.REWRITE),
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateEmptyRelation.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateEmptyRelation.java
index 2c0f9116ca2..204499fd9b9 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateEmptyRelation.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateEmptyRelation.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.rules.rewrite;
import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
+import org.apache.doris.nereids.trees.UnaryNode;
import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.ExprId;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
@@ -51,11 +52,12 @@ public class EliminateEmptyRelation implements
RewriteRuleFactory {
return ImmutableList.of(
// join->empty
logicalJoin(any(), any())
- .when(this::hasEmptyRelationChild)
- .when(this::canReplaceJoinByEmptyRelation)
+ .when(join -> hasEmptyRelationChild(join) &&
canReplaceJoinByEmptyRelation(join)
+ || bothChildrenEmpty(join))
.then(join -> new LogicalEmptyRelation(
-
ConnectContext.get().getStatementContext().getNextRelationId(),
- join.getOutput()))
+
ConnectContext.get().getStatementContext().getNextRelationId(),
+ join.getOutput())
+ )
.toRule(RuleType.ELIMINATE_JOIN_ON_EMPTYRELATION),
logicalFilter(logicalEmptyRelation())
.then(filter -> new LogicalEmptyRelation(
@@ -68,7 +70,13 @@ public class EliminateEmptyRelation implements
RewriteRuleFactory {
ConnectContext.get().getStatementContext().getNextRelationId(),
agg.getOutput())
).toRule(RuleType.ELIMINATE_AGG_ON_EMPTYRELATION),
-
+ // proj->empty
+ logicalProject(logicalEmptyRelation())
+ .thenApply(ctx -> {
+ LogicalProject<? extends Plan> project = ctx.root;
+ return new
LogicalEmptyRelation(ConnectContext.get().getStatementContext().getNextRelationId(),
+ project.getOutputs());
+ }).toRule(RuleType.ELIMINATE_AGG_ON_EMPTYRELATION),
// after BuildAggForUnion rule, union may have more than 2
children.
logicalUnion(multi()).then(union -> {
if (union.children().isEmpty()) {
@@ -116,6 +124,18 @@ public class EliminateEmptyRelation implements
RewriteRuleFactory {
return null;
}
}).toRule(RuleType.ELIMINATE_UNION_ON_EMPTYRELATION),
+ // topn->empty
+ logicalTopN(logicalEmptyRelation())
+ .then(topn -> new LogicalEmptyRelation(
+
ConnectContext.get().getStatementContext().getNextRelationId(),
+ topn.getOutput()))
+ .toRule(RuleType.ELIMINATE_TOPN_ON_EMPTYRELATION),
+ // sort->empty
+ logicalSort(logicalEmptyRelation())
+ .then(sort -> new LogicalEmptyRelation(
+
ConnectContext.get().getStatementContext().getNextRelationId(),
+ sort.getOutput()))
+ .toRule(RuleType.ELIMINATE_SORT_ON_EMPTYRELATION),
// set intersect
logicalIntersect(multi()).then(intersect -> {
List<Plan> emptyChildren = intersect.children().stream()
@@ -131,6 +151,10 @@ public class EliminateEmptyRelation implements
RewriteRuleFactory {
intersect.getOutput());
}
}).toRule(RuleType.ELIMINATE_INTERSECTION_ON_EMPTYRELATION),
+ // limit -> empty
+ logicalLimit(logicalEmptyRelation())
+ .then(UnaryNode::child)
+ .toRule(RuleType.ELIMINATE_LIMIT_ON_EMPTY_RELATION),
// set except
logicalExcept(multi()).then(except -> {
Plan first = except.child(0);
@@ -186,6 +210,10 @@ public class EliminateEmptyRelation implements
RewriteRuleFactory {
return join.left() instanceof EmptyRelation || join.right() instanceof
EmptyRelation;
}
+ private boolean bothChildrenEmpty(LogicalJoin<?, ?> join) {
+ return join.left() instanceof EmptyRelation && join.right() instanceof
EmptyRelation;
+ }
+
private boolean canReplaceJoinByEmptyRelation(LogicalJoin<?, ?> join) {
return !join.isMarkJoin() && ((join.getJoinType() ==
JoinType.INNER_JOIN
|| join.getJoinType() == JoinType.LEFT_SEMI_JOIN
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateLimit.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateLimit.java
index 8fbfc13934d..b3d8cac3a1c 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateLimit.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateLimit.java
@@ -19,7 +19,6 @@ package org.apache.doris.nereids.rules.rewrite;
import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
-import org.apache.doris.nereids.trees.UnaryNode;
import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator;
import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
@@ -44,10 +43,7 @@ public class EliminateLimit implements RewriteRuleFactory {
.then(limit -> limit.getLimit() > 0 &&
limit.getOffset() == 0
? limit.child() : new
LogicalEmptyRelation(StatementScopeIdGenerator.newRelationId(),
limit.child().getOutput()))
- .toRule(RuleType.ELIMINATE_LIMIT_ON_ONE_ROW_RELATION),
- logicalLimit(logicalEmptyRelation())
- .then(UnaryNode::child)
- .toRule(RuleType.ELIMINATE_LIMIT_ON_EMPTY_RELATION)
+ .toRule(RuleType.ELIMINATE_LIMIT_ON_ONE_ROW_RELATION)
);
}
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/TPCHTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/TPCHTest.java
index 3e88ac73bd0..9eefe62ea82 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/TPCHTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/TPCHTest.java
@@ -60,6 +60,7 @@ public class TPCHTest extends TPCHTestBase implements
MemoPatternMatchSupported
// o_orderstatus is smaller than o_orderdate, but o_orderstatus is not
used in this sql
// it is better to choose the column which is already used to
represent count(*)
PlanChecker.from(connectContext)
+ .disableNereidsRules("PRUNE_EMPTY_PARTITION")
.analyze(sql)
.rewrite()
.matches(
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateGroupByTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateGroupByTest.java
index 9c8c2babec7..0b6d2f199fc 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateGroupByTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateGroupByTest.java
@@ -46,13 +46,12 @@ class EliminateGroupByTest extends TestWithFeService
implements MemoPatternMatch
// -> select id, age as max(age) from t;
String sql = "select id, max(age) from t group by id";
- PlanChecker.from(connectContext)
+ PlanChecker cheker = PlanChecker.from(connectContext)
.analyze(sql)
- .rewrite()
- .matches(
- logicalProject().when(p ->
p.getProjects().get(0).toSql().equals("id")
- && p.getProjects().get(1).toSql().equals("age
AS `max(age)`"))
- );
+ .rewrite();
+ cheker.matches(
+ logicalEmptyRelation().when(p ->
p.getProjects().get(0).toSql().equals("id")
+ && p.getProjects().get(1).toSql().equals("age
AS `max(age)`")));
}
@Test
@@ -64,7 +63,7 @@ class EliminateGroupByTest extends TestWithFeService
implements MemoPatternMatch
.analyze(sql)
.rewrite()
.matches(
- logicalProject().when(p ->
p.getProjects().get(0).toSql().equals("id")
+ logicalEmptyRelation().when(p ->
p.getProjects().get(0).toSql().equals("id")
&& p.getProjects().get(1).toSql().equals("age
AS `min(age)`"))
);
}
@@ -78,7 +77,7 @@ class EliminateGroupByTest extends TestWithFeService
implements MemoPatternMatch
.analyze(sql)
.rewrite()
.matches(
- logicalProject().when(p ->
p.getProjects().get(0).toSql().equals("id")
+ logicalEmptyRelation().when(p ->
p.getProjects().get(0).toSql().equals("id")
&&
p.getProjects().get(1).toSql().equals("cast(age as BIGINT) AS `sum(age)`"))
);
}
@@ -92,8 +91,9 @@ class EliminateGroupByTest extends TestWithFeService
implements MemoPatternMatch
.analyze(sql)
.rewrite()
.matches(
- logicalProject().when(p ->
p.getProjects().get(0).toSql().equals("id")
- &&
p.getProjects().get(1).toSql().equals("if(age IS NULL, 0, 1) AS `if(age IS
NULL, 0, 1)`")
+ logicalEmptyRelation().when(p ->
p.getProjects().get(0).toSql().equals("id")
+ && p.getProjects().get(1).toSql()
+ .equals("if(age IS NULL, 0, 1) AS `if(age IS
NULL, 0, 1)`")
)
);
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateLimitTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateLimitTest.java
index 1b28978e76c..bfd8caf3ac1 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateLimitTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateLimitTest.java
@@ -53,6 +53,7 @@ class EliminateLimitTest implements MemoPatternMatchSupported
{
.limit(1, 1).build();
PlanChecker.from(MemoTestUtils.createConnectContext(), limit)
+ .disableNereidsRules("PRUNE_EMPTY_PARTITION")
.rewrite()
.matches(logicalTopN());
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateSortTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateSortTest.java
index 5df92782527..5787229c5ba 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateSortTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateSortTest.java
@@ -63,6 +63,7 @@ class EliminateSortTest extends TestWithFeService implements
MemoPatternMatchSup
.nonMatch(logicalSort());
PlanChecker.from(connectContext)
+ .disableNereidsRules("PRUNE_EMPTY_PARTITION")
.analyze("with cte_test as (\n"
+ "select id, name, age from student\n"
+ ")\n"
@@ -74,6 +75,7 @@ class EliminateSortTest extends TestWithFeService implements
MemoPatternMatchSup
.matches(logicalSort());
PlanChecker.from(connectContext)
+ .disableNereidsRules("PRUNE_EMPTY_PARTITION")
.analyze("select t.age from\n"
+ "(\n"
+ "with cte_test as (\n"
@@ -99,6 +101,7 @@ class EliminateSortTest extends TestWithFeService implements
MemoPatternMatchSup
new ArrayList<>(),
plan.getOutput().stream().map(NamedExpression.class::cast).collect(
Collectors.toList()), false, DMLCommandType.NONE, plan);
PlanChecker.from(MemoTestUtils.createConnectContext(), plan)
+ .disableNereidsRules("PRUNE_EMPTY_PARTITION")
.rewrite()
.nonMatch(logicalSort())
.matches(logicalTopN());
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/PlanChecker.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/PlanChecker.java
index d0bd735ae92..fdce1c0b9af 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/PlanChecker.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/PlanChecker.java
@@ -162,6 +162,11 @@ public class PlanChecker {
return this;
}
+ public PlanChecker disableNereidsRules(String rules) {
+ connectContext.getSessionVariable().setDisableNereidsRules(rules);
+ return this;
+ }
+
public PlanChecker printPlanProcess(String sql) {
List<PlanProcess> planProcesses = explainPlanProcess(sql);
for (PlanProcess row : planProcesses) {
diff --git a/regression-test/data/empty_relation/eliminate_empty.out
b/regression-test/data/empty_relation/eliminate_empty.out
index 1732199a898..ca0d2a4641a 100644
--- a/regression-test/data/empty_relation/eliminate_empty.out
+++ b/regression-test/data/empty_relation/eliminate_empty.out
@@ -72,13 +72,11 @@ PhysicalResultSink
-- !prune_partition1 --
PhysicalResultSink
---PhysicalProject
-----PhysicalEmptyRelation
+--PhysicalEmptyRelation
-- !prune_partition2 --
PhysicalResultSink
---PhysicalProject
-----PhysicalEmptyRelation
+--PhysicalEmptyRelation
-- !join_with_empty_child --
2 8 e v 3
diff --git a/regression-test/data/load_p0/insert/insert_select_empty_table.out
b/regression-test/data/load_p0/insert/insert_select_empty_table.out
index f6dfe47dfa0..c66018a3121 100644
--- a/regression-test/data/load_p0/insert/insert_select_empty_table.out
+++ b/regression-test/data/load_p0/insert/insert_select_empty_table.out
@@ -9,14 +9,11 @@ PhysicalOlapTableSink
-- !test_shape_join --
PhysicalOlapTableSink
---PhysicalProject
-----PhysicalEmptyRelation
+--PhysicalEmptyRelation
-- !test_shape_agg_filter_limit --
PhysicalOlapTableSink
---PhysicalLimit[GLOBAL]
-----PhysicalLimit[LOCAL]
-------PhysicalEmptyRelation
+--PhysicalEmptyRelation
-- !test_insert_empty_agg --
1
diff --git
a/regression-test/data/nereids_tpcds_shape_sf1000_p0/eliminate_empty/query10_empty.out
b/regression-test/data/nereids_tpcds_shape_sf1000_p0/eliminate_empty/query10_empty.out
new file mode 100644
index 00000000000..ed7fd6ec910
--- /dev/null
+++
b/regression-test/data/nereids_tpcds_shape_sf1000_p0/eliminate_empty/query10_empty.out
@@ -0,0 +1,5 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !ds_shape_10 --
+PhysicalResultSink
+--PhysicalEmptyRelation
+
diff --git a/regression-test/suites/empty_relation/eliminate_empty.groovy
b/regression-test/suites/empty_relation/eliminate_empty.groovy
index 0aaa2bad06b..ffe3fe17cd5 100644
--- a/regression-test/suites/empty_relation/eliminate_empty.groovy
+++ b/regression-test/suites/empty_relation/eliminate_empty.groovy
@@ -20,9 +20,12 @@
suite("eliminate_empty") {
String db = context.config.getDbNameByFile(context.file)
sql "use ${db}"
- sql 'set enable_nereids_planner=true'
- sql 'set enable_fallback_to_original_planner=false'
- sql 'set forbid_unknown_col_stats=false'
+ multi_sql """
+ SET enable_nereids_planner=true;
+ SET enable_fallback_to_original_planner=false;
+ set disable_nereids_rules='PRUNE_EMPTY_PARTITION';
+ set forbid_unknown_col_stats=false;
+ """
qt_onerow_union """
select * from (select 1, 2 union select 3, 4) T
"""
diff --git
a/regression-test/suites/load_p0/insert/insert_select_empty_table.groovy
b/regression-test/suites/load_p0/insert/insert_select_empty_table.groovy
index 320d1820d64..00186e13fa4 100644
--- a/regression-test/suites/load_p0/insert/insert_select_empty_table.groovy
+++ b/regression-test/suites/load_p0/insert/insert_select_empty_table.groovy
@@ -16,25 +16,22 @@
// under the License.
suite("insert_select_empty_table") {
- sql "SET enable_nereids_planner=true"
- sql "SET enable_fallback_to_original_planner=false"
- sql """
- DROP TABLE IF EXISTS insert_select_empty_table1
- """
+ multi_sql """
+ SET enable_nereids_planner=true;
+ SET enable_fallback_to_original_planner=false;
- sql """
- create table insert_select_empty_table1(pk int, a int, b int)
distributed by hash(pk) buckets 10
- properties('replication_num' = '1');
- """
- sql """
- DROP TABLE IF EXISTS insert_select_empty_table2
- """
+ DROP TABLE IF EXISTS insert_select_empty_table1;
- sql """
- create table insert_select_empty_table2(pk int, a int, b int)
distributed by hash(pk) buckets 10
- properties('replication_num' = '1');
- """
- sql "insert into insert_select_empty_table1 select * from
insert_select_empty_table2;"
+ create table insert_select_empty_table1(pk int, a int, b int) distributed
by hash(pk) buckets 10
+ properties('replication_num' = '1');
+
+ DROP TABLE IF EXISTS insert_select_empty_table2;
+
+ create table insert_select_empty_table2(pk int, a int, b int) distributed
by hash(pk) buckets 10
+ properties('replication_num' = '1');
+
+ insert into insert_select_empty_table1 select * from
insert_select_empty_table2;
+ """
qt_test_shape "explain shape plan insert into insert_select_empty_table1
select * from insert_select_empty_table2;"
sql """insert into insert_select_empty_table1 select * from
insert_select_empty_table2
diff --git a/regression-test/suites/nereids_p0/union/test_union.groovy
b/regression-test/suites/nereids_p0/union/test_union.groovy
index 81502fc1b43..5e9a9e71bf3 100644
--- a/regression-test/suites/nereids_p0/union/test_union.groovy
+++ b/regression-test/suites/nereids_p0/union/test_union.groovy
@@ -16,8 +16,11 @@
// under the License.
suite("test_union") {
- sql "SET enable_nereids_planner=true"
- sql "SET enable_fallback_to_original_planner=false"
+ multi_sql """
+ SET enable_nereids_planner=true;
+ SET enable_fallback_to_original_planner=false;
+ set disable_nereids_rules='PRUNE_EMPTY_PARTITION';
+ """
def db = "nereids_test_query_db"
sql "use ${db}"
diff --git
a/regression-test/suites/nereids_syntax_p0/eliminate_nullaware_anti_join.groovy
b/regression-test/suites/nereids_syntax_p0/eliminate_nullaware_anti_join.groovy
index e6c9d2f29c3..fe9c81a2911 100644
---
a/regression-test/suites/nereids_syntax_p0/eliminate_nullaware_anti_join.groovy
+++
b/regression-test/suites/nereids_syntax_p0/eliminate_nullaware_anti_join.groovy
@@ -16,8 +16,11 @@
// under the License.
suite("eliminate_nullaware_anti_join") {
- sql "SET enable_nereids_planner=true"
- sql "SET enable_fallback_to_original_planner=false"
+ multi_sql """
+ SET enable_nereids_planner=true;
+ SET enable_fallback_to_original_planner=false;
+ set disable_nereids_rules='PRUNE_EMPTY_PARTITION';
+ """
sql """drop table if exists eliminate_nullaware_anti_join_A;"""
sql """drop table if exists eliminate_nullaware_anti_join_B;"""
diff --git
a/regression-test/suites/nereids_tpcds_shape_sf1000_p0/eliminate_empty/query10_empty.groovy
b/regression-test/suites/nereids_tpcds_shape_sf1000_p0/eliminate_empty/query10_empty.groovy
new file mode 100644
index 00000000000..e9f4418d59c
--- /dev/null
+++
b/regression-test/suites/nereids_tpcds_shape_sf1000_p0/eliminate_empty/query10_empty.groovy
@@ -0,0 +1,150 @@
+/*
+ * 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.
+ */
+
+suite("query10") {
+ String db = context.config.getDbNameByFile(new File(context.file.parent))
+ sql "use ${db}"
+ sql 'set enable_nereids_planner=true'
+ sql 'set enable_fallback_to_original_planner=false'
+ sql 'set exec_mem_limit=21G'
+ sql 'set be_number_for_test=3'
+ sql 'set parallel_fragment_exec_instance_num=8; '
+ sql 'set parallel_pipeline_task_num=8; '
+ sql 'set forbid_unknown_col_stats=true'
+ sql 'set enable_nereids_timeout = false'
+ sql 'set enable_runtime_filter_prune=false'
+ sql 'set runtime_filter_type=8'
+ sql 'set dump_nereids_memo=false'
+
+ def ds = """select
+ cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ count(*) cnt1,
+ cd_purchase_estimate,
+ count(*) cnt2,
+ cd_credit_rating,
+ count(*) cnt3,
+ cd_dep_count,
+ count(*) cnt4,
+ cd_dep_employed_count,
+ count(*) cnt5,
+ cd_dep_college_count,
+ count(*) cnt6
+ from
+ customer c,customer_address ca,customer_demographics
+ where
+ c.c_current_addr_sk = ca.ca_address_sk and
+ ca_county in ('Fairfield County','Campbell County','Washtenaw
County','Escambia County','Cleburne County') and
+ cd_demo_sk = c.c_current_cdemo_sk and
+ exists (select *
+ from store_sales,date_dim
+ where c.c_customer_sk = ss_customer_sk and
+ ss_sold_date_sk = d_date_sk and
+ d_year = 2001 and
+ d_moy between 3 and 3+3) and
+ (exists (select *
+ from web_sales,date_dim
+ where c.c_customer_sk = ws_bill_customer_sk and
+ ws_sold_date_sk = d_date_sk and
+ d_year = 2001 and
+ d_moy between 3 ANd 3+3) or
+ exists (select *
+ from catalog_sales,date_dim
+ where c.c_customer_sk = cs_ship_customer_sk and
+ cs_sold_date_sk = d_date_sk and
+ d_year = 2001 and
+ d_moy between 3 and 3+3))
+ group by cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ cd_purchase_estimate,
+ cd_credit_rating,
+ cd_dep_count,
+ cd_dep_employed_count,
+ cd_dep_college_count
+ order by cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ cd_purchase_estimate,
+ cd_credit_rating,
+ cd_dep_count,
+ cd_dep_employed_count,
+ cd_dep_college_count
+limit 100"""
+ qt_ds_shape_10 '''
+ explain shape plan
+ select
+ cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ count(*) cnt1,
+ cd_purchase_estimate,
+ count(*) cnt2,
+ cd_credit_rating,
+ count(*) cnt3,
+ cd_dep_count,
+ count(*) cnt4,
+ cd_dep_employed_count,
+ count(*) cnt5,
+ cd_dep_college_count,
+ count(*) cnt6
+ from
+ customer c,customer_address ca,customer_demographics
+ where
+ c.c_current_addr_sk = ca.ca_address_sk and
+ ca_county in ('Fairfield County','Campbell County','Washtenaw
County','Escambia County','Cleburne County') and
+ cd_demo_sk = c.c_current_cdemo_sk and
+ exists (select *
+ from store_sales,date_dim
+ where c.c_customer_sk = ss_customer_sk and
+ ss_sold_date_sk = d_date_sk and
+ d_year = 2001 and
+ d_moy between 3 and 3+3) and
+ (exists (select *
+ from web_sales,date_dim
+ where c.c_customer_sk = ws_bill_customer_sk and
+ ws_sold_date_sk = d_date_sk and
+ d_year = 2001 and
+ d_moy between 3 ANd 3+3) or
+ exists (select *
+ from catalog_sales,date_dim
+ where c.c_customer_sk = cs_ship_customer_sk and
+ cs_sold_date_sk = d_date_sk and
+ d_year = 2001 and
+ d_moy between 3 and 3+3))
+ group by cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ cd_purchase_estimate,
+ cd_credit_rating,
+ cd_dep_count,
+ cd_dep_employed_count,
+ cd_dep_college_count
+ order by cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ cd_purchase_estimate,
+ cd_credit_rating,
+ cd_dep_count,
+ cd_dep_employed_count,
+ cd_dep_college_count
+limit 100
+ '''
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]