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

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 87edfb5c09f [fix](window_function) window function 
first_value/last_value should be always nullable (#26014) (#26260)
87edfb5c09f is described below

commit 87edfb5c09f716fe0784401773a0022136d52d28
Author: Jerry Hu <mrh...@gmail.com>
AuthorDate: Thu Nov 2 14:13:09 2023 +0800

    [fix](window_function) window function first_value/last_value should be 
always nullable (#26014) (#26260)
---
 .../apache/doris/catalog/AggregateFunction.java    |  3 +-
 .../functions/window/FirstOrLastValue.java         |  4 +--
 .../correctness_p0/test_first_value_window.out     |  7 +++++
 .../correctness_p0/test_first_value_window.groovy  | 34 ++++++++++++++++++++++
 4 files changed, 45 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
index bfaa07aa326..594516fe59f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
@@ -58,7 +58,8 @@ public class AggregateFunction extends Function {
             FunctionSet.COLLECT_LIST, FunctionSet.COLLECT_SET);
 
     public static ImmutableSet<String> 
ALWAYS_NULLABLE_AGGREGATE_FUNCTION_NAME_SET =
-            ImmutableSet.of("stddev_samp", "variance_samp", "var_samp", 
"percentile_approx");
+            ImmutableSet.of("stddev_samp", "variance_samp", "var_samp", 
"percentile_approx", "first_value",
+                    "last_value");
 
     public static ImmutableSet<String> CUSTOM_AGGREGATE_FUNCTION_NAME_SET =
             ImmutableSet.of("group_concat");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/window/FirstOrLastValue.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/window/FirstOrLastValue.java
index 44bcf40ec36..12fba8478ce 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/window/FirstOrLastValue.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/window/FirstOrLastValue.java
@@ -19,8 +19,8 @@ package 
org.apache.doris.nereids.trees.expressions.functions.window;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import org.apache.doris.nereids.trees.expressions.functions.IdenticalSignature;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
 
 import com.google.common.collect.ImmutableList;
@@ -30,7 +30,7 @@ import java.util.List;
 
 /** parent class for first_value() and last_value() */
 public abstract class FirstOrLastValue extends WindowFunction
-        implements UnaryExpression, PropagateNullable, IdenticalSignature, 
RequireTrivialTypes {
+        implements UnaryExpression, AlwaysNullable, IdenticalSignature, 
RequireTrivialTypes {
 
     static {
         List<FunctionSignature> signatures = Lists.newArrayList();
diff --git a/regression-test/data/correctness_p0/test_first_value_window.out 
b/regression-test/data/correctness_p0/test_first_value_window.out
index 5a2ad3022b8..2913dbd01d2 100644
--- a/regression-test/data/correctness_p0/test_first_value_window.out
+++ b/regression-test/data/correctness_p0/test_first_value_window.out
@@ -6,3 +6,10 @@
 23     04-23-10        1       1
 24     02-24-10-21     1       1
 
+-- !select_always_nullable --
+21     04-21-11        ["amory", "clever"]     \N      \N
+22     04-22-10-21     ["doris", "aws", "greate"]      \N      \N
+22     04-22-10-21     ["is ", "cute", "tea"]  1       999
+23     04-23-10        ["p7", "year4"] \N      \N
+24     02-24-10-21     [""]    \N      \N
+
diff --git 
a/regression-test/suites/correctness_p0/test_first_value_window.groovy 
b/regression-test/suites/correctness_p0/test_first_value_window.groovy
index dd56e9ac2db..374290e7a34 100644
--- a/regression-test/suites/correctness_p0/test_first_value_window.groovy
+++ b/regression-test/suites/correctness_p0/test_first_value_window.groovy
@@ -45,4 +45,38 @@ suite("test_first_value_window") {
 
     qt_select_default """ select *,first_value(state) over(partition by myday 
order by time_col range between current row and unbounded following) from 
${tableName} order by myday, time_col, state; """
 
+
+    def tableName1 = "test_first_value_window_array"
+
+    sql """ DROP TABLE IF EXISTS ${tableName1} """
+    sql """
+            CREATE TABLE IF NOT EXISTS ${tableName1} (
+            `myday` INT,
+            `time_col` VARCHAR(40) NOT NULL,
+            `state` ARRAY<STRING>
+            ) ENGINE=OLAP
+            DUPLICATE KEY(`myday`,time_col)
+            COMMENT "OLAP"
+            DISTRIBUTED BY HASH(`myday`) BUCKETS 2
+            PROPERTIES (
+            "replication_num" = "1",
+            "in_memory" = "false",
+            "storage_format" = "V2"
+            );
+    """
+
+    sql """ INSERT INTO ${tableName1} VALUES
+            (21,"04-21-11",["amory", "clever"]),
+            (22,"04-22-10-21",["is ", "cute", "tea"]),
+            (22,"04-22-10-21",["doris", "aws", "greate"]),
+            (23,"04-23-10", ["p7", "year4"]),
+            (24,"02-24-10-21",[""]); """
+
+    qt_select_always_nullable """
+        select
+            *,
+            first_value(1) over(partition by myday order by time_col rows  
between 1 preceding and 1 preceding) first_value,
+            last_value(999) over(partition by myday order by time_col rows  
between 1 preceding and 1 preceding) last_value
+        from test_first_value_window_array order by myday, time_col;
+    """
 }


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

Reply via email to