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