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

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit ec95cf430a0a8d3b8c3b41fc087be5a5479185f7
Author: xueweizhang <[email protected]>
AuthorDate: Tue Feb 14 00:11:56 2023 +0800

    [fix](subquery) fix bug of using constexpr and some agg func(like 
count,max) as subquery's output (#16579)
    
    
    Signed-off-by: nextdreamblue <[email protected]>
---
 .../java/org/apache/doris/analysis/SelectStmt.java |   7 +-
 .../test_outer_join_with_subquery.out              |  74 +++++++
 .../test_outer_join_with_subquery.groovy           | 229 +++++++++++++++++++++
 3 files changed, 308 insertions(+), 2 deletions(-)

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 a6986de668..7b72f44298 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
@@ -758,10 +758,13 @@ public class SelectStmt extends QueryStmt {
             }
             boolean hasConstant = resultExprs.stream().anyMatch(e -> 
e.isConstant() || e.refToCountStar());
             // In such case, agg output must be materialized whether outer 
query block required or not.
-            if (tableRef instanceof InlineViewRef && hasConstant) {
+            if (tableRef instanceof InlineViewRef) {
                 InlineViewRef inlineViewRef = (InlineViewRef) tableRef;
                 QueryStmt queryStmt = inlineViewRef.getQueryStmt();
-                queryStmt.resultExprs.forEach(Expr::materializeSrcExpr);
+                boolean inlineViewHasConstant = 
queryStmt.resultExprs.stream().anyMatch(Expr::isConstant);
+                if (hasConstant || inlineViewHasConstant) {
+                    queryStmt.resultExprs.forEach(Expr::materializeSrcExpr);
+                }
             }
         }
     }
diff --git 
a/regression-test/data/correctness_p0/test_outer_join_with_subquery.out 
b/regression-test/data/correctness_p0/test_outer_join_with_subquery.out
index 875d88ccc5..e7f2cb8a09 100644
--- a/regression-test/data/correctness_p0/test_outer_join_with_subquery.out
+++ b/regression-test/data/correctness_p0/test_outer_join_with_subquery.out
@@ -5,3 +5,77 @@
 -- !select --
 1
 
+-- !select --
+1
+
+-- !select --
+
+-- !select --
+aaa
+
+-- !select --
+1
+
+-- !select --
+1      aaa
+
+-- !select --
+0
+
+-- !select --
+1      aaa
+
+-- !select --
+0      aaa
+
+-- !select --
+1      aaa
+
+-- !select --
+0      aaa
+
+-- !select --
+1
+
+-- !select --
+0
+
+-- !select --
+1
+
+-- !select --
+0      \N
+
+-- !select --
+0      \N
+
+-- !select --
+1      100
+
+-- !select --
+1      100
+
+-- !select --
+1      0
+
+-- !select --
+1      100
+
+-- !select --
+\N
+
+-- !select --
+\N
+
+-- !select --
+100
+
+-- !select --
+100
+
+-- !select --
+0
+
+-- !select --
+100
+
diff --git 
a/regression-test/suites/correctness_p0/test_outer_join_with_subquery.groovy 
b/regression-test/suites/correctness_p0/test_outer_join_with_subquery.groovy
index 97de116ca1..c8ccb9d220 100644
--- a/regression-test/suites/correctness_p0/test_outer_join_with_subquery.groovy
+++ b/regression-test/suites/correctness_p0/test_outer_join_with_subquery.groovy
@@ -110,4 +110,233 @@ suite("test_outer_join_with_subquery") {
     sql """
         drop table if exists test_outer_join_with_subquery_outerjoin_B;
     """
+
+    ////////////////////////////////////
+
+    sql """
+        drop table if exists test_outer_join_with_subquery_outerjoin_A_1;
+    """
+
+    sql """
+        drop table if exists test_outer_join_with_subquery_outerjoin_B_1;
+    """
+
+    sql """
+        drop table if exists test_outer_join_with_subquery_outerjoin_C_1;
+    """
+
+    sql """
+        drop table if exists test_outer_join_with_subquery_outerjoin_D_1;
+    """
+
+    sql """
+        CREATE TABLE test_outer_join_with_subquery_outerjoin_A_1(user_id int 
NULL) 
+        ENGINE = OLAP DUPLICATE KEY(user_id) DISTRIBUTED BY HASH(user_id) 
BUCKETS 1 PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+        );
+    """    
+
+    sql """
+        CREATE TABLE test_outer_join_with_subquery_outerjoin_B_1(user_id int 
NULL) 
+        ENGINE = OLAP DUPLICATE KEY(user_id) DISTRIBUTED BY HASH(user_id) 
BUCKETS 1 PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+        );
+    """
+
+    sql """
+        CREATE TABLE test_outer_join_with_subquery_outerjoin_C_1(user_id int 
NULL) 
+        ENGINE = OLAP DUPLICATE KEY(user_id) DISTRIBUTED BY HASH(user_id) 
BUCKETS 1 PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+        );
+    """
+
+    sql """
+        CREATE TABLE test_outer_join_with_subquery_outerjoin_D_1(user_id int 
NULL) 
+        ENGINE = OLAP DUPLICATE KEY(user_id) DISTRIBUTED BY HASH(user_id) 
BUCKETS 1 PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+        );
+    """
+
+    qt_select """
+        WITH W1 AS (
+            SELECT
+                t.user_id
+            FROM
+                test_outer_join_with_subquery_outerjoin_A_1 t
+                JOIN test_outer_join_with_subquery_outerjoin_B_1 u ON 
u.user_id = t.user_id
+        ),
+        W2 AS (
+            SELECT
+                t.user_id
+            FROM
+                test_outer_join_with_subquery_outerjoin_C_1 t
+                JOIN test_outer_join_with_subquery_outerjoin_B_1 u ON 
u.user_id = t.user_id
+            GROUP BY
+                t.user_id
+        ),
+        W3 AS (
+            SELECT
+                t.user_id
+            FROM
+                test_outer_join_with_subquery_outerjoin_D_1 t
+                JOIN test_outer_join_with_subquery_outerjoin_B_1 u ON 
u.user_id = t.user_id
+            GROUP BY
+                t.user_id
+        )
+        SELECT
+            COUNT(dataset_30.reg_user_cnt) AS u_18efaea722a8747c_2
+        FROM
+            (
+                SELECT
+                    t1.reg_user_cnt,
+                    t2.commit_case_user_cnt,
+                    t3.watch_live_course_and_commit_case_user_cnt
+                FROM
+                    (
+                        SELECT
+                            COUNT(user_id) AS reg_user_cnt,
+                            '1' AS flag
+                        FROM
+                            W1
+                    ) t1
+                    JOIN (
+                        SELECT
+                            COUNT(user_id) AS commit_case_user_cnt,
+                            '1' AS flag
+                        FROM
+                            W2
+                    ) t2 ON t2.flag = t1.flag
+                    JOIN (
+                        SELECT
+                            COUNT(t1.user_id) AS 
watch_live_course_and_commit_case_user_cnt,
+                            '1' AS flag
+                        FROM
+                            W2 t1
+                            JOIN W3 t2 ON t2.user_id = t1.user_id
+                    ) t3 ON t3.flag = t1.flag
+            ) dataset_30
+        LIMIT
+            1000;
+    """        
+
+    qt_select """
+        select 'aaa' from(  select 'bbb' FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """    
+
+    qt_select """
+        select 'aaa' from(  select 'bbb' ,count(1) FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """    
+
+    qt_select """
+        select count(1) from(  select 'bbb' ,count(1) FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select count(1), 'aaa' from(  select 'bbb' ,count(1) FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select count(1) from(  select 'bbb' FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select count(1), 'aaa' from(  select count(1) FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select count(1), 'aaa' from(  select 'bbb' FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select count(1), 'aaa' from(  select count(1) FROM (  select count(1) 
FROM test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select count(1), 'aaa' from(  select 'bbb' FROM (  select 'bbb' FROM 
test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select count(1) from(  select count(1) FROM (  select count(1) FROM 
test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select count(1) from(  select 'bbb' FROM (  select 'bbb' FROM 
test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select count(1) from(  select 'bbb',count(1) FROM (  select 
'bbb',count(1) FROM test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select count(1), max(user_id) from(  select user_id FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select count(1), max(user_id) from(  select user_id FROM (  select 
user_id FROM test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select count(1), max(user_id) from(  select count(1), 100 as user_id 
FROM test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select count(1), max(user_id) from(  select 100 as user_id FROM (  
select max(user_id) FROM test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select count(1), max(user_id) from(  select user_id FROM (  select 
count(1) as user_id, 'abc' FROM test_outer_join_with_subquery_outerjoin_A_1 )s  
)t;
+    """
+
+    qt_select """
+        select count(1), max(user_id) from(  select max(user_id), 100 as 
user_id FROM test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+qt_select """
+        select max(user_id) from(  select user_id FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select max(user_id) from(  select user_id FROM (  select user_id FROM 
test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select max(user_id) from(  select count(1), 100 as user_id FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    qt_select """
+        select max(user_id) from(  select 100 as user_id FROM (  select 
max(user_id) FROM test_outer_join_with_subquery_outerjoin_A_1  )s  )t;
+    """
+
+    qt_select """
+        select max(user_id) from(  select user_id FROM (  select count(1) as 
user_id, 'abc' FROM test_outer_join_with_subquery_outerjoin_A_1 )s  )t;
+    """
+
+    qt_select """
+        select max(user_id) from(  select max(user_id), 100 as user_id FROM 
test_outer_join_with_subquery_outerjoin_A_1  )t;
+    """
+
+    sql """
+        drop table if exists test_outer_join_with_subquery_outerjoin_A_1;
+    """
+
+    sql """
+        drop table if exists test_outer_join_with_subquery_outerjoin_B_1;
+    """
+
+    sql """
+        drop table if exists test_outer_join_with_subquery_outerjoin_C_1;
+    """
+
+    sql """
+        drop table if exists test_outer_join_with_subquery_outerjoin_D_1;
+    """
 }
+


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to