You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/07/20 03:48:02 UTC
[doris] branch master updated: [fix](nereids) ExtractAndNormalizeWindowExpression rule should push down correct exprs to child (#21827)
This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 86d7233b06 [fix](nereids) ExtractAndNormalizeWindowExpression rule should push down correct exprs to child (#21827)
86d7233b06 is described below
commit 86d7233b060edc05bbf3bfbb52ae416563d0a083
Author: starocean999 <40...@users.noreply.github.com>
AuthorDate: Thu Jul 20 11:47:55 2023 +0800
[fix](nereids) ExtractAndNormalizeWindowExpression rule should push down correct exprs to child (#21827)
consider the window function:
```sql
substr(
ref_1.cp_type,
sum(CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END) OVER (),
1)
```
Before the pr, only "CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END" is pushed down.
But both "ref_1.cp_type" and "CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END"
should be pushed down.
This pr fix it
---
.../rewrite/ExtractAndNormalizeWindowExpression.java | 18 ++++++------------
.../data/nereids_p0/aggregate/agg_window_project.out | 3 +++
.../nereids_p0/aggregate/agg_window_project.groovy | 10 ++++++++++
3 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java
index 946e8ebbec..5181c978ed 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ExtractAndNormalizeWindowExpression.java
@@ -34,7 +34,6 @@ import com.google.common.collect.Sets;
import java.util.List;
import java.util.Set;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
@@ -98,21 +97,16 @@ public class ExtractAndNormalizeWindowExpression extends OneRewriteRuleFactory i
if (expression.anyMatch(WindowExpression.class::isInstance)) {
Set<Slot> inputSlots = Sets.newHashSet(expression.getInputSlots());
Set<WindowExpression> collects = expression.collect(WindowExpression.class::isInstance);
- Set<Slot> windowInputSlots = collects.stream()
- .flatMap(win -> win.getInputSlots().stream())
- .collect(Collectors.toSet());
// substr(
// ref_1.cp_type,
- // max(
- // cast(ref_1.`cp_catalog_page_number` as int)) over (...)
- // ),
- // 1)
+ // sum(CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END) OVER (),
+ // 1),
//
- // in above case, ref_1.cp_type should be pushed down. ref_1.cp_type is in
- // substr.inputSlots, but not in windowExpression.inputSlots
+ // in above case,
+ // ref_1.cp_type and CASE WHEN ref_1.cp_type = 0 THEN 3 ELSE 2 END
+ // should be pushed down.
//
// inputSlots= {ref_1.cp_type}
- inputSlots.removeAll(windowInputSlots);
return Stream.concat(
collects.stream().flatMap(windowExpression ->
windowExpression.getExpressionsInWindowSpec().stream()
@@ -121,7 +115,7 @@ public class ExtractAndNormalizeWindowExpression extends OneRewriteRuleFactory i
.filter(expr -> !expr.isConstant())
),
inputSlots.stream()
- );
+ ).distinct();
}
return ImmutableList.of(expression).stream();
})
diff --git a/regression-test/data/nereids_p0/aggregate/agg_window_project.out b/regression-test/data/nereids_p0/aggregate/agg_window_project.out
index 508108c7c5..60f8b9a6f9 100644
--- a/regression-test/data/nereids_p0/aggregate/agg_window_project.out
+++ b/regression-test/data/nereids_p0/aggregate/agg_window_project.out
@@ -5,3 +5,6 @@
-- !select2 --
10.00000000000000
+-- !select3 --
+1
+
diff --git a/regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy b/regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy
index 1ec29524f4..794ccf3002 100644
--- a/regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy
+++ b/regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy
@@ -64,5 +64,15 @@ suite("agg_window_project") {
order_qt_select2 """select b / 1 * 10 from test_window_table;"""
+ order_qt_select3 """SELECT
+ CASE
+ WHEN b != 0
+ AND sum(CASE WHEN b = 0 THEN 3 ELSE 2 END) OVER () < 50000
+ THEN 1
+ ELSE 0
+ END AS val
+ FROM
+ test_window_table;"""
+
sql "DROP TABLE IF EXISTS test_window_table;"
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org