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

morrysnow 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 ffbc24678a8 [Fix](Nereids) ntile function should check argument 
(#32994)
ffbc24678a8 is described below

commit ffbc24678a8a91e98bb68837895f357047964d6e
Author: LiBinfeng <46676950+libinfeng...@users.noreply.github.com>
AuthorDate: Tue Apr 2 10:42:09 2024 +0800

    [Fix](Nereids) ntile function should check argument (#32994)
    
    Problem:
    when ntile using 0 as parameter, be would core because no checking of 
parameter
    Solved:
    check parameter in fe analyze
---
 .../trees/expressions/functions/window/Ntile.java  | 24 ++++++++++++++++++++++
 .../window_functions/test_ntile_function.groovy    | 21 +++++++++++--------
 .../window_functions/test_ntile_function.groovy    | 10 +++++++++
 3 files changed, 47 insertions(+), 8 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/window/Ntile.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/window/Ntile.java
index 16321d68280..d1d2ee57736 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/window/Ntile.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/window/Ntile.java
@@ -18,12 +18,15 @@
 package org.apache.doris.nereids.trees.expressions.functions.window;
 
 import org.apache.doris.catalog.FunctionSignature;
+import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
+import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.IntegerType;
 import org.apache.doris.nereids.types.LargeIntType;
 import org.apache.doris.nereids.types.SmallIntType;
@@ -64,6 +67,27 @@ public class Ntile extends WindowFunction implements 
LeafExpression, AlwaysNotNu
         return new Ntile(children.get(0));
     }
 
+    @Override
+    public void checkLegalityBeforeTypeCoercion() {
+        DataType type = getBuckets().getDataType();
+        if (!type.isIntegralType()) {
+            throw new AnalysisException("The bucket of NTILE must be a 
integer: " + this.toSql());
+        }
+        if (!getBuckets().isConstant()) {
+            throw new AnalysisException(
+                "The bucket of NTILE must be a constant value: " + 
this.toSql());
+        }
+        if (getBuckets() instanceof Literal) {
+            if (((Literal) getBuckets()).getDouble() <= 0) {
+                throw new AnalysisException(
+                    "The bucket parameter of NTILE must be a constant positive 
integer: " + this.toSql());
+            }
+        } else {
+            throw new AnalysisException(
+                "The bucket parameter of NTILE must be a constant positive 
integer: " + this.toSql());
+        }
+    }
+
     @Override
     public List<FunctionSignature> getSignatures() {
         return SIGNATURES;
diff --git 
a/regression-test/suites/nereids_p0/sql_functions/window_functions/test_ntile_function.groovy
 
b/regression-test/suites/nereids_p0/sql_functions/window_functions/test_ntile_function.groovy
index 0767be9579f..9532fea2d29 100644
--- 
a/regression-test/suites/nereids_p0/sql_functions/window_functions/test_ntile_function.groovy
+++ 
b/regression-test/suites/nereids_p0/sql_functions/window_functions/test_ntile_function.groovy
@@ -68,14 +68,19 @@ suite("test_ntile_function") {
     }
     sql "sync"
 
-    // Nereids does't support window function
-    // qt_select "select k1, k2, k3, ntile(3) over (partition by k1 order by 
k2) as ntile from ${tableName} order by k1, k2, k3 desc;"
-    // Nereids does't support window function
-    // qt_select "select k1, k2, k3, ntile(5) over (partition by k1 order by 
k2) as ntile from ${tableName} order by k1, k2, k3 desc;"
-    // Nereids does't support window function
-    // qt_select "select k2, k1, k3, ntile(3) over (order by k2) as ntile from 
${tableName} order by k2, k1, k3 desc;"
-    // Nereids does't support window function
-    // qt_select "select k3, k2, k1, ntile(3) over (partition by k3 order by 
k2) as ntile from ${tableName} order by k3, k2, k1;"
+     qt_select "select k1, k2, k3, ntile(3) over (partition by k1 order by k2) 
as ntile from ${tableName} order by k1, k2, k3 desc;"
+     qt_select "select k1, k2, k3, ntile(5) over (partition by k1 order by k2) 
as ntile from ${tableName} order by k1, k2, k3 desc;"
+     qt_select "select k2, k1, k3, ntile(3) over (order by k2) as ntile from 
${tableName} order by k2, k1, k3 desc;"
+     qt_select "select k3, k2, k1, ntile(3) over (partition by k3 order by k2) 
as ntile from ${tableName} order by k3, k2, k1;"
+     test {
+         sql "select k1, k2, k3, ntile(0) over (partition by k1 order by k2) 
as ntile from ${tableName} order by k1, k2, k3 desc;"
+         exception "The bucket parameter of NTILE must be a constant positive 
integer: ntile(0)"
+     }
+     test {
+         sql "select k1, k2, k3, ntile(k1) over (partition by k1 order by k2) 
as ntile from ${tableName} order by k1, k2, k3 desc;"
+         exception "The bucket of NTILE must be a constant value: ntile(k1)"
+     }
+
 }
 
 
diff --git 
a/regression-test/suites/query_p0/sql_functions/window_functions/test_ntile_function.groovy
 
b/regression-test/suites/query_p0/sql_functions/window_functions/test_ntile_function.groovy
index 9eedc243c18..7a92095af29 100644
--- 
a/regression-test/suites/query_p0/sql_functions/window_functions/test_ntile_function.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/window_functions/test_ntile_function.groovy
@@ -70,6 +70,16 @@ suite("test_ntile_function") {
     qt_select "select k1, k2, k3, ntile(5) over (partition by k1 order by k2) 
as ntile from ${tableName} order by k1, k2, k3 desc;"
     qt_select "select k2, k1, k3, ntile(3) over (order by k2) as ntile from 
${tableName} order by k2, k1, k3 desc;"
     qt_select "select k3, k2, k1, ntile(3) over (partition by k3 order by k2) 
as ntile from ${tableName} order by k3, k2, k1;"
+
+    test {
+        sql "select k1, k2, k3, ntile(0) over (partition by k1 order by k2) as 
ntile from ${tableName} order by k1, k2, k3 desc;"
+        exception "Parameter n in ntile(n) should be positive."
+    }
+
+    test {
+        sql "select k1, k2, k3, ntile(k1) over (partition by k1 order by k2) 
as ntile from ${tableName} order by k1, k2, k3 desc;"
+        exception "Parameter n in ntile(n) should be constant positive 
integer."
+    }
 }
 
 


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

Reply via email to