This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 c84b033df65 [Fix](Nereids) ntile function should check argument
(#32994) (#34661)
c84b033df65 is described below
commit c84b033df65b6595761407443ff2022a4495ed21
Author: LiBinfeng <[email protected]>
AuthorDate: Fri May 17 17:08:20 2024 +0800
[Fix](Nereids) ntile function should check argument (#32994) (#34661)
pick from master #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: [email protected]
For additional commands, e-mail: [email protected]