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 6c6328fc6d [fix](join)fix outer join bug when a subquery as nullable 
side #11700
6c6328fc6d is described below

commit 6c6328fc6d8e094ebe66ce7870001bb5eee0769e
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Fri Aug 12 11:50:15 2022 +0800

    [fix](join)fix outer join bug when a subquery as nullable side #11700
---
 .../apache/doris/analysis/AggregateInfoBase.java   |   6 ++
 .../java/org/apache/doris/analysis/Analyzer.java   |  27 ++++++
 .../correctness/test_outer_join_with_subquery.out  |   5 +
 .../test_outer_join_with_subquery.groovy           | 104 +++++++++++++++++++++
 4 files changed, 142 insertions(+)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfoBase.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfoBase.java
index d9366b8d80..88cd05c78f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfoBase.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfoBase.java
@@ -132,6 +132,11 @@ public abstract class AggregateInfoBase {
         boolean isGroupingSet = !groupingExprs.isEmpty()
                 && groupingExprs.get(groupingExprs.size() - 1) instanceof 
VirtualSlotRef;
 
+        // the agg node may output slots from child outer join node
+        // to make the agg node create the output tuple desc correctly, we 
need change the slots' to nullable
+        // from all outer join nullable side temporarily
+        // after create the output tuple we need revert the change by call 
analyzer.changeSlotsToNotNullable(slots)
+        List<SlotDescriptor> slots = 
analyzer.changeSlotToNullableOfOuterJoinedTuples();
         for (int i = 0; i < exprs.size(); ++i) {
             Expr expr = exprs.get(i);
             SlotDescriptor slotDesc = analyzer.addSlotDescriptor(result);
@@ -177,6 +182,7 @@ public abstract class AggregateInfoBase {
                 }
             }
         }
+        analyzer.changeSlotsToNotNullable(slots);
 
         if (LOG.isTraceEnabled()) {
             String prefix = (isOutputTuple ? "result " : "intermediate ");
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index 77ede5e754..995bdccfba 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -2330,4 +2330,31 @@ public class Analyzer {
         }
         return false;
     }
+
+
+    /**
+     * Change all outer joined slots to nullable
+     * Returns the slots actually be changed from not nullable to nullable
+     */
+    public List<SlotDescriptor> changeSlotToNullableOfOuterJoinedTuples() {
+        List<SlotDescriptor> result = new ArrayList<>();
+        for (TupleId id : globalState.outerJoinedTupleIds.keySet()) {
+            TupleDescriptor tupleDescriptor = 
globalState.descTbl.getTupleDesc(id);
+            if (tupleDescriptor != null) {
+                for (SlotDescriptor desc : tupleDescriptor.getSlots()) {
+                    if (!desc.getIsNullable()) {
+                        desc.setIsNullable(true);
+                        result.add(desc);
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    public void changeSlotsToNotNullable(List<SlotDescriptor> slots) {
+        for (SlotDescriptor slot : slots) {
+            slot.setIsNullable(false);
+        }
+    }
 }
diff --git a/regression-test/data/correctness/test_outer_join_with_subquery.out 
b/regression-test/data/correctness/test_outer_join_with_subquery.out
new file mode 100644
index 0000000000..694e2bfae7
--- /dev/null
+++ b/regression-test/data/correctness/test_outer_join_with_subquery.out
@@ -0,0 +1,5 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !select --
+\N
+2022-08-01
+
diff --git 
a/regression-test/suites/correctness/test_outer_join_with_subquery.groovy 
b/regression-test/suites/correctness/test_outer_join_with_subquery.groovy
new file mode 100644
index 0000000000..2021a27e2e
--- /dev/null
+++ b/regression-test/suites/correctness/test_outer_join_with_subquery.groovy
@@ -0,0 +1,104 @@
+// 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("test_outer_join_with_subquery") {
+     sql """ DROP TABLE IF EXISTS dim_comp_tags """
+     sql """ DROP TABLE IF EXISTS ods_comp_info_q """
+     sql """
+        CREATE TABLE `dim_comp_tags`
+        (
+            `stock_code` varchar(100) NULL COMMENT "",
+            `first_tag`  varchar(100) NULL COMMENT "",
+            `second_tag` varchar(100) NULL COMMENT ""
+        ) ENGINE=OLAP
+        UNIQUE KEY(`stock_code`, `first_tag`, `second_tag`)
+        COMMENT ""
+        DISTRIBUTED BY HASH(`stock_code`) BUCKETS 10
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1",
+        "in_memory" = "false",
+        "storage_format" = "V2"
+        );
+     """
+     sql """
+        CREATE TABLE `ods_comp_info_q`
+        (
+            `stock_code`             varchar(100) NULL COMMENT "",
+            `data_time`              date NOT NULL COMMENT "",
+            `employee`               int(11) NULL COMMENT "",
+            `oper_rev`               decimal(27, 2) NULL COMMENT "",
+            `net_profit`             decimal(27, 2) NULL COMMENT "",
+            `roe_diluted`            decimal(27, 2) NULL COMMENT "",
+            `roe_forecast1`          decimal(27, 2) NULL COMMENT "",
+            `roe_forecast2`          decimal(27, 2) NULL COMMENT "",
+            `roe_forecast3`          decimal(27, 2) NULL COMMENT "",
+            `segment_sales_industry` varchar(2000) NULL COMMENT "",
+            `segment_sales_product`  varchar(2000) NULL COMMENT "",
+            `segment_sales_region`   varchar(2000) NULL COMMENT "",
+            `cont_liab`              decimal(27, 2) NULL COMMENT "",
+            `rd_exp`                 decimal(27, 2) NULL COMMENT "",
+            `cash_end_bal_cf`        decimal(27, 2) NULL COMMENT "",
+            `deductedprofit`         decimal(27, 2) NULL COMMENT "",
+            `extraordinary`          decimal(27, 2) NULL COMMENT "",
+            `capex`                  decimal(27, 2) NULL COMMENT "",
+            `update_time`            datetime NULL COMMENT ""
+        ) ENGINE=OLAP
+        UNIQUE KEY(`stock_code`, `data_time`)
+        COMMENT ""
+        DISTRIBUTED BY HASH(`stock_code`) BUCKETS 10
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1",
+        "in_memory" = "false",
+        "storage_format" = "V2"
+        );
+     """
+
+     sql """
+        INSERT INTO dim_comp_tags (stock_code,first_tag,second_tag) VALUES
+        ('e','a','a'),
+        ('a','a','a'),
+        ('a','e','e'),
+        (NULL,'b','d'),
+        (NULL,'c','c'),
+        (NULL,'c','d'),
+        ('c','c','b'),
+        ('c','e','b'),
+        ('d','e','a'),
+        ('d','e','d');
+     """
+
+     sql """
+        INSERT INTO ods_comp_info_q 
(stock_code,data_time,employee,oper_rev,net_profit,roe_diluted,roe_forecast1,roe_forecast2,roe_forecast3,segment_sales_industry,segment_sales_product,segment_sales_region,cont_liab,rd_exp,cash_end_bal_cf,deductedprofit,extraordinary,capex,update_time)
 VALUES
+        
('b','2022-08-01',3,705091149953414452.46,747823572268070011.12,27359935448400379.28,499659240437828403.4,328974174261964288.43,224982925762347928.61,'a','b',NULL,699686029559044363.29,NULL,565258647647190196.8,280880206593919322.57,234915543693063635.1,2319457526991656.56,'2022-08-01
 00:00:00'),
+        
(NULL,'2022-08-01',6,794180259997275010.71,889165000079374948.86,615566875134080159.47,55766577026010060.64,692384373205823149.29,917992076378031973.99,'b','a','a',531161365155959323.76,442733481509055860.8,672559382305200707.53,863561269567335566.38,727794355006653392.98,716698894949586778.75,'2022-08-01
 00:00:00'),
+        
('e','2022-08-01',4,459847697542436646.78,958176162478193747.23,715826630793028044.88,541967646169735759.63,795134975489939217.17,87108238990117448.77,'e','d','c',807748584393533437.58,895417761167717963.91,591333902513658995.88,66421280517330023.75,939346464324951973.46,490845810509366157.35,'2022-08-01
 00:00:00'),
+        
('a','2022-08-01',2,587325832204376329.26,875352826279802899.12,399232951346418221.82,414030170209762738.14,671245100753215734.46,13826319122152913.65,'b','a','b',3579634985545821,154791373958795843.54,472864641422522739.74,905921613564175878.11,NULL,553229819135054741.53,'2022-08-01
 00:00:00'),
+        
('d','2022-08-01',4,35163815958145692.63,106458565436056336.19,NULL,845068137933809321.6,173641241393263805.39,148425884326276338.96,'e','b','c',848579524158656737.66,134243691765872795.44,442037721152552222.33,271698192570079341.11,879629131111041234.86,251623556843023676.15,'2022-08-01
 00:00:00');
+     """
+
+     order_qt_select """
+        with temp as (select 
+        t2.data_time
+        from dim_comp_tags t1
+        left join ods_comp_info_q t2 on t2.stock_code = t1.stock_code
+        group by t2.data_time)
+        select tt1.data_time
+        from temp tt1
+        left join temp tt2 on tt2.data_time = tt1.data_time order by 
tt1.data_time;
+     """
+ }
+


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

Reply via email to