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

starocean999 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 b124c560f78 [fix](nereids) fix ExtractAndNormalizeWindowExpression bug 
(#45553)
b124c560f78 is described below

commit b124c560f78320ba8982698c06a07e5af6c50cd4
Author: feiniaofeiafei <moail...@selectdb.com>
AuthorDate: Thu Dec 19 15:11:02 2024 +0800

    [fix](nereids) fix ExtractAndNormalizeWindowExpression bug (#45553)
    
    Problem Summary:
    In ExtractAndNormalizeWindowExpression, some expressions are pushed down
    and output by the bottom LogicalProject. If a window expression depends
    on these pushed-down expressions, those parts should be replaced
    accordingly. However, when a Literal is pushed down, it should not be
    used as a replacement.
    
    Example:
    For the window expression:
    last_value(c1, false) over()
    
    If the expression false is pushed down as alias1, the window expression
    would incorrectly be replaced as:
    last_value(c1, alias1) over()
    
    This PR fixes the issue by ensuring Literals are not replaced when
    pushed down.
---
 .../ExtractAndNormalizeWindowExpression.java       |  3 +-
 .../normalize_window_nullable_agg_test.out         |  4 ++
 .../normalize_window_nullable_agg_test.groovy      | 57 ++++++++++++++++++++++
 3 files changed, 63 insertions(+), 1 deletion(-)

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 2cfe4523003..a74ebe4b76b 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
@@ -27,6 +27,7 @@ import 
org.apache.doris.nereids.trees.expressions.OrderExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.WindowExpression;
 import 
org.apache.doris.nereids.trees.expressions.functions.agg.NullableAggregateFunction;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.trees.plans.logical.LogicalWindow;
@@ -117,7 +118,7 @@ public class ExtractAndNormalizeWindowExpression extends 
OneRewriteRuleFactory i
         // we need replace alias's child expr with corresponding alias's slot 
in output
         // so create a customNormalizeMap alias's child -> alias.toSlot to do 
it
         Map<Expression, Slot> customNormalizeMap = toBePushedDown.stream()
-                .filter(expr -> expr instanceof Alias)
+                .filter(expr -> expr instanceof Alias && !(expr.child(0) 
instanceof Literal))
                 .collect(Collectors.toMap(expr -> ((Alias) expr).child(), expr 
-> ((Alias) expr).toSlot(),
                         (oldExpr, newExpr) -> oldExpr));
 
diff --git 
a/regression-test/data/nereids_rules_p0/normalize_window/normalize_window_nullable_agg_test.out
 
b/regression-test/data/nereids_rules_p0/normalize_window/normalize_window_nullable_agg_test.out
index 2df25bb0d3b..f910333a57e 100644
--- 
a/regression-test/data/nereids_rules_p0/normalize_window/normalize_window_nullable_agg_test.out
+++ 
b/regression-test/data/nereids_rules_p0/normalize_window/normalize_window_nullable_agg_test.out
@@ -291,3 +291,7 @@ false
 false
 false
 
+-- !fold_window --
+0      false   0       be
+9999-12-31 23:59:59    false   9999-12-31 23:59:59     b
+
diff --git 
a/regression-test/suites/nereids_rules_p0/normalize_window/normalize_window_nullable_agg_test.groovy
 
b/regression-test/suites/nereids_rules_p0/normalize_window/normalize_window_nullable_agg_test.groovy
index 9617e8bb19c..df3fd63d750 100644
--- 
a/regression-test/suites/nereids_rules_p0/normalize_window/normalize_window_nullable_agg_test.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/normalize_window/normalize_window_nullable_agg_test.groovy
@@ -72,4 +72,61 @@ suite("normalize_window_nullable_agg") {
         sql "select group_concat(xwho order by xwhat) over(partition by xwhen) 
from windowfunnel_test_normalize_window;"
         exception "order by is not supported"
     }
+
+    sql "set enable_fold_constant_by_be = 1;"
+    sql "drop table if exists fold_window1"
+    sql """create table fold_window1 (
+            pk int,
+                    col_char_255__undef_signed char(255)  null  ,
+            col_char_100__undef_signed char(100)  null  ,
+            col_varchar_255__undef_signed varchar(255)  null  ,
+            col_char_255__undef_signed_not_null char(255)  not null  ,
+                    col_char_100__undef_signed_not_null char(100)  not null  ,
+            col_varchar_255__undef_signed_not_null varchar(255)  not null  ,
+            col_varchar_1000__undef_signed varchar(1000)  null  ,
+            col_varchar_1000__undef_signed_not_null varchar(1000)  not null  ,
+                    col_varchar_1001__undef_signed varchar(1001)  null  ,
+            col_varchar_1001__undef_signed_not_null varchar(1001)  not null  ,
+                    col_string_undef_signed string  null  ,
+                    col_string_undef_signed_not_null string  not null
+    ) engine=olap
+    DUPLICATE KEY(pk, col_char_255__undef_signed, col_char_100__undef_signed, 
col_varchar_255__undef_signed)
+    distributed by hash(pk) buckets 10
+    properties("bloom_filter_columns" = "col_char_255__undef_signed, 
col_char_100__undef_signed, col_varchar_255__undef_signed ", "replication_num" 
= "1");"""
+    sql """insert into 
fold_window1(pk,col_char_255__undef_signed,col_char_255__undef_signed_not_null,col_char_100__undef_signed
+    
,col_char_100__undef_signed_not_null,col_varchar_255__undef_signed,col_varchar_255__undef_signed_not_null,col_varchar_1000__undef_signed,col_varchar_1000__undef_signed_not_null
+    
,col_varchar_1001__undef_signed,col_varchar_1001__undef_signed_not_null,col_string_undef_signed,col_string_undef_signed_not_null)
+     values (0,'like','9999-12-31 23:59:59','9999-12-31 
23:59:59','c','20240803','2024-08-03 
13:08:30','300.343','2024-07-01','that''s','9999-12-31 23:59:59','s','b'),
+     (1,'be','g','f','not','20240803','20240803','2024-08-03 
13:08:30','g','20240803','0','2024-07-01','be')"""
+
+    sql "drop table if exists fold_window2"
+    sql """create table fold_window2 (
+            pk int,
+                    col_char_255__undef_signed char(255)  null  ,
+            col_char_255__undef_signed_not_null char(255)  not null  ,
+                    col_char_100__undef_signed char(100)  null  ,
+            col_char_100__undef_signed_not_null char(100)  not null  ,
+                    col_varchar_255__undef_signed varchar(255)  null  ,
+            col_varchar_255__undef_signed_not_null varchar(255)  not null  ,
+                    col_varchar_1000__undef_signed varchar(1000)  null  ,
+            col_varchar_1000__undef_signed_not_null varchar(1000)  not null  ,
+                    col_varchar_1001__undef_signed varchar(1001)  null  ,
+            col_varchar_1001__undef_signed_not_null varchar(1001)  not null  ,
+                    col_string_undef_signed string  null  ,
+                    col_string_undef_signed_not_null string  not null
+    ) engine=olap
+    DUPLICATE KEY(pk)
+    distributed by hash(pk) buckets 10
+    properties ("bloom_filter_columns" = "col_char_255__undef_signed, 
col_char_100__undef_signed, col_varchar_255__undef_signed ", "replication_num" 
= "1");"""
+    sql """insert into 
fold_window2(pk,col_char_255__undef_signed,col_char_255__undef_signed_not_null,col_char_100__undef_signed
+    
,col_char_100__undef_signed_not_null,col_varchar_255__undef_signed,col_varchar_255__undef_signed_not_null,col_varchar_1000__undef_signed
+    
,col_varchar_1000__undef_signed_not_null,col_varchar_1001__undef_signed,col_varchar_1001__undef_signed_not_null,col_string_undef_signed,col_string_undef_signed_not_null)
+    values (0,'some','2024-07-01','9999-12-31 23:59:59','9999-12-31 
23:59:59','9999-12-31 
23:59:59','300.343','2024-07-01','1','1','2024-07-01','2024-08-03 
13:08:30','2024-08-03 13:08:30');"""
+
+    qt_fold_window """
+    select initcap(col_varchar_1001__undef_signed_not_null)  col_alias97650 , 
starts_with('ourBZbRijD', "e")  AS col_alias97651 ,
+    col_varchar_1001__undef_signed_not_null  AS col_alias97652 , 
LAST_VALUE(col_string_undef_signed_not_null , false) over ( order by pk ) 
+     AS col_alias97653  from fold_window1 where 'DCOFMrybqf' <> (select min (  
col_char_255__undef_signed ) 
+     from fold_window2)  ORDER BY 
col_alias97650,col_alias97651,col_alias97652,col_alias97653 ;
+    """
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to