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

morningman 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 46d20818f1 [fix][vectorized] Fix bug the of window function result not 
match plan nullable (#10340)
46d20818f1 is described below

commit 46d20818f1d71431b0c4fa8d097fd3e32b6c1521
Author: HappenLee <[email protected]>
AuthorDate: Thu Jun 23 08:40:12 2022 +0800

    [fix][vectorized] Fix bug the of window function result not match plan 
nullable (#10340)
    
    Co-authored-by: lihaopeng <[email protected]>
---
 .../org/apache/doris/analysis/AggregateInfoBase.java   |  2 +-
 .../java/org/apache/doris/analysis/AnalyticInfo.java   | 18 ++++++++++++++++++
 .../java/org/apache/doris/planner/QueryPlanTest.java   |  2 +-
 .../window_functions/test_window_function.out          |  9 +++++++++
 .../window_functions/test_window_function.groovy       |  8 +++++++-
 5 files changed, 36 insertions(+), 3 deletions(-)

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 f0298afff6..69d833e86f 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
@@ -117,7 +117,7 @@ public abstract class AggregateInfoBase {
      * Also updates the appropriate substitution map, and creates and 
registers auxiliary
      * equality predicates between the grouping slots and the grouping exprs.
      */
-    private TupleDescriptor createTupleDesc(Analyzer analyzer, boolean 
isOutputTuple) {
+    protected TupleDescriptor createTupleDesc(Analyzer analyzer, boolean 
isOutputTuple) {
         TupleDescriptor result =
                 analyzer.getDescTbl().createTupleDescriptor(
                         tupleDebugName() + (isOutputTuple ? "-out" : 
"-intermed"));
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticInfo.java
index aa993e34bf..6f79057697 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticInfo.java
@@ -114,6 +114,24 @@ public final class AnalyticInfo extends AggregateInfoBase {
         return result;
     }
 
+    /**
+     * Creates the intermediate and output tuple descriptors. If no agg expr 
has an
+     * intermediate type different from its output type, then only the output 
tuple
+     * descriptor is created and the intermediate tuple is set to the output 
tuple.
+     * TODO: Rethink we really need to use Analyticinfo be subclass of 
AggregateInfoBase,
+     * it seems only use the aggregateExprs
+     */
+    protected void createTupleDescs(Analyzer analyzer) {
+        // Create the intermediate tuple desc first, so that the tuple ids are 
increasing
+        // from bottom to top in the plan tree.
+        intermediateTupleDesc = createTupleDesc(analyzer, false);
+        if (requiresIntermediateTuple(aggregateExprs, false)) {
+            outputTupleDesc = createTupleDesc(analyzer, true);
+        } else {
+            outputTupleDesc = intermediateTupleDesc;
+        }
+    }
+
     /**
      * Returns the intersection of the partition exprs of all the
      * analytic functions.
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index a2a6c9e107..a71d484d5e 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -1927,7 +1927,7 @@ public class QueryPlanTest extends TestWithFeService {
                 + " on t1.k1 = a.x where 1 = 0;";
         String explainStr = getSQLPlanOrErrorMsg(sql, true);
         Assert.assertTrue(UtFrameUtils.checkPlanResultContainsNode(explainStr, 
4, "EMPTYSET"));
-        Assert.assertTrue(explainStr.contains("tuple ids: 0 1 5"));
+        Assert.assertTrue(explainStr.contains("tuple ids: 0 1 4"));
     }
 
     @Ignore
diff --git 
a/regression-test/data/query/sql_functions/window_functions/test_window_function.out
 
b/regression-test/data/query/sql_functions/window_functions/test_window_function.out
index 57d5dd3e86..aa397abf64 100644
--- 
a/regression-test/data/query/sql_functions/window_functions/test_window_function.out
+++ 
b/regression-test/data/query/sql_functions/window_functions/test_window_function.out
@@ -17,6 +17,15 @@ JDR  2014-10-06T00:00        14.03   higher
 JDR    2014-10-07T00:00        14.75   flat or lower
 JDR    2014-10-08T00:00        13.98   flat or lower
 
+-- !sql --
+2014-10-07T00:00
+2014-10-06T00:00
+2014-10-05T00:00
+2014-10-04T00:00
+2014-10-03T00:00
+2014-10-02T00:00
+2014-10-02T00:00
+
 -- !sql --
 JDR    2014-10-02T00:00        12.86   0
 JDR    2014-10-03T00:00        12.89   12.86
diff --git 
a/regression-test/suites/query/sql_functions/window_functions/test_window_function.groovy
 
b/regression-test/suites/query/sql_functions/window_functions/test_window_function.groovy
index 69e4a4726c..da6b76e0f7 100644
--- 
a/regression-test/suites/query/sql_functions/window_functions/test_window_function.groovy
+++ 
b/regression-test/suites/query/sql_functions/window_functions/test_window_function.groovy
@@ -20,7 +20,7 @@ suite("test_window_function", "query") {
 
     def windowFunctionTable1 = "test_window_function1"
     sql """ DROP TABLE IF EXISTS ${windowFunctionTable1} """
-    sql """ create table ${windowFunctionTable1} (stock_symbol varchar(64), 
closing_price decimal(8,2), closing_date datetime) duplicate key (stock_symbol) 
distributed by hash (stock_symbol) PROPERTIES("replication_num" = "1") """
+    sql """ create table ${windowFunctionTable1} (stock_symbol varchar(64), 
closing_price decimal(8,2), closing_date datetime not null) duplicate key 
(stock_symbol) distributed by hash (stock_symbol) PROPERTIES("replication_num" 
= "1") """
 
     sql """ INSERT INTO ${windowFunctionTable1} VALUES 
('JDR',12.86,'2014-10-02 00:00:00'),('JDR',12.89,'2014-10-03 
00:00:00'),('JDR',12.94,'2014-10-04 00:00:00'),('JDR',12.55,'2014-10-05 
00:00:00'),('JDR',14.03,'2014-10-06 00:00:00'),('JDR',14.75,'2014-10-07 
00:00:00'),('JDR',13.98,'2014-10-08 00:00:00') """
 
@@ -47,6 +47,12 @@ suite("test_window_function", "query") {
              ORDER BY
                 closing_date;
             """
+
+    // LEAD not nullable coredump
+    qt_sql """
+           select t1.new_time from (select closing_date, lead(closing_date, 1, 
'2014-10-02 00:00:00') over () as new_time from ${windowFunctionTable1}) as t1 
left join ${windowFunctionTable1} t2 on t2.closing_date = t1.closing_date;
+           """
+
     // LAG
     qt_sql """ 
              SELECT


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

Reply via email to