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 beeb0ef3eb [Bug](lead) fix wrong child expression of `lead` function 
(#12587)
beeb0ef3eb is described below

commit beeb0ef3eb514603931f27856625761ed5425ef0
Author: Gabriel <[email protected]>
AuthorDate: Thu Sep 15 08:44:18 2022 +0800

    [Bug](lead) fix wrong child expression of `lead` function (#12587)
---
 .../org/apache/doris/analysis/AnalyticExpr.java    |  5 ++++-
 .../java/org/apache/doris/analysis/CastExpr.java   | 20 +------------------
 .../main/java/org/apache/doris/catalog/Type.java   | 23 ++++++++++++++++++++++
 .../data/correctness_p0/test_lag_lead_window.out   | 10 ++++++++++
 .../correctness_p0/test_lag_lead_window.groovy     | 11 +++++++++++
 5 files changed, 49 insertions(+), 20 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java
index 74ff1d809a..36895d8111 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java
@@ -691,7 +691,10 @@ public class AnalyticExpr extends Expr {
             Type type = getFnCall().getChildren().get(2).getType();
 
             try {
-                
getFnCall().uncheckedCastChild(getFnCall().getChildren().get(0).getType(), 2);
+                if 
(!Type.matchExactType(getFnCall().getChildren().get(0).getType(),
+                        getFnCall().getChildren().get(2).getType())) {
+                    
getFnCall().uncheckedCastChild(getFnCall().getChildren().get(0).getType(), 2);
+                }
             }  catch (Exception e) {
                 LOG.warn("", e);
                 throw new AnalysisException("Convert type error in offset 
fn(default value); old_type="
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
index 0c0a7e6346..2e32fc3ec0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
@@ -20,7 +20,6 @@
 
 package org.apache.doris.analysis;
 
-import org.apache.doris.catalog.ArrayType;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.FunctionSet;
@@ -269,24 +268,7 @@ public class CastExpr extends Expr {
         Type childType = getChild(0).getType();
 
         // this cast may result in loss of precision, but the user requested it
-        if (childType.matchesType(type)) {
-            if 
(PrimitiveType.typeWithPrecision.contains(type.getPrimitiveType())) {
-                // For types which has precision and scale, we also need to 
check quality between precisions and scales
-                if ((((ScalarType) type).decimalPrecision()
-                        == ((ScalarType) childType).decimalPrecision()) && 
(((ScalarType) type).decimalScale()
-                        == ((ScalarType) childType).decimalScale())) {
-                    noOp = true;
-                }
-            } else if (type.isArrayType()) {
-                // For types array, we also need to check contains null for 
case like
-                // cast(array<not_null(int)> as array<int>)
-                if (((ArrayType) type).getContainsNull() == ((ArrayType) 
childType).getContainsNull()) {
-                    noOp = true;
-                }
-            } else {
-                noOp = true;
-            }
-        }
+        noOp = Type.matchExactType(childType, type);
 
         if (noOp) {
             return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
index 257724038c..a832b853b6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
@@ -1637,4 +1637,27 @@ public abstract class Type {
             return this.getPrimitiveType().getOlapColumnIndexSize();
         }
     }
+
+    // Whether `type1` matches the exact type of `type2`.
+    public static boolean matchExactType(Type type1, Type type2) {
+        if (type1.matchesType(type2)) {
+            if 
(PrimitiveType.typeWithPrecision.contains(type2.getPrimitiveType())) {
+                // For types which has precision and scale, we also need to 
check quality between precisions and scales
+                if ((((ScalarType) type2).decimalPrecision()
+                        == ((ScalarType) type1).decimalPrecision()) && 
(((ScalarType) type2).decimalScale()
+                        == ((ScalarType) type1).decimalScale())) {
+                    return true;
+                }
+            } else if (type2.isArrayType()) {
+                // For types array, we also need to check contains null for 
case like
+                // cast(array<not_null(int)> as array<int>)
+                if (((ArrayType) type2).getContainsNull() == ((ArrayType) 
type1).getContainsNull()) {
+                    return true;
+                }
+            } else {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/regression-test/data/correctness_p0/test_lag_lead_window.out 
b/regression-test/data/correctness_p0/test_lag_lead_window.out
index c2a4258c0b..97462cc8a2 100644
--- a/regression-test/data/correctness_p0/test_lag_lead_window.out
+++ b/regression-test/data/correctness_p0/test_lag_lead_window.out
@@ -19,3 +19,13 @@ a    aa      /wyyt-image/2021/11/13/595345040188712460.jpg
 b      aa      /wyyt-image/2022/04/13/1434607674511761493.jpg  
/wyyt-image/2022/04/13/1434607674511761493.jpg
 c      cc      /wyyt-image/2022/04/13/1434607674511761493.jpg  
 
+-- !select_default --
+c      2022-09-06T00:00:02     2022-09-06T00:00:01
+b      2022-09-06T00:00:01     2022-09-06T00:00
+a      2022-09-06T00:00        2022-09-06T00:00
+
+-- !select_default --
+c      2022-09-06T00:00:02     2022-09-06T00:00:01
+b      2022-09-06T00:00:01     2022-09-06T00:00
+a      2022-09-06T00:00        2022-08-30T00:00
+
diff --git a/regression-test/suites/correctness_p0/test_lag_lead_window.groovy 
b/regression-test/suites/correctness_p0/test_lag_lead_window.groovy
index d269b1621d..44ccb66e14 100644
--- a/regression-test/suites/correctness_p0/test_lag_lead_window.groovy
+++ b/regression-test/suites/correctness_p0/test_lag_lead_window.groovy
@@ -54,4 +54,15 @@ suite("test_lag_lead_window") {
                                   lead(cc,1,'') over (PARTITION by cc  order 
by aa) as lead_cc 
                            from ${tableName} 
                            order by aa; """
+    sql """ DROP TABLE IF EXISTS test1 """
+    sql """ CREATE TABLE IF NOT EXISTS test1 (id varchar(255), create_time 
datetime)
+            DISTRIBUTED BY HASH(id) PROPERTIES("replication_num" = "1"); """
+    sql """ INSERT INTO test1 VALUES
+            ('a','2022-09-06 00:00:00'),
+            ('b','2022-09-06 00:00:01'),
+            ('c','2022-09-06 00:00:02') """
+    qt_select_default """ select id, create_time, lead(create_time, 1, 
'2022-09-06 00:00:00') over
+                          (order by create_time desc) as "prev_time" from 
test1; """
+    qt_select_default """ select id, create_time, lead(create_time, 1, 
date_sub('2022-09-06 00:00:00', interval 7 day)) over (order by create_time 
desc) as "prev_time" from test1; """
+    sql """ DROP TABLE IF EXISTS test1 """
 }


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

Reply via email to