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

zclllyybb 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 f318357c820 [Fix](topn) Reject non-positive topn count argument 
(#63350)
f318357c820 is described below

commit f318357c8202a8c15d376ce688bd313fbb3ec8fe
Author: linrrarity <[email protected]>
AuthorDate: Tue May 19 17:40:57 2026 +0800

    [Fix](topn) Reject non-positive topn count argument (#63350)
    
    Problem Summary:
    
    According to Doris doc: `topn count must be a positive integer`, but
    before this, negative numbers and 0 were not handled specially,
    returning `{}`, leading to unexpected results.
    
    before
    ```sql
    Doris> SELECT TOPN(page_id, 0) as top_zero_pages FROM page_visits;
    +----------------+
    | top_zero_pages |
    +----------------+
    | {}             |
    +----------------+
    
    Doris> SELECT TOPN(page_id, -1) as top_neg_one_pages FROM page_visits;
    +-------------------+
    | top_neg_one_pages |
    +-------------------+
    | {}                |
    +-------------------+
    ```
    
    now:
    ```sql
    Doris> SELECT TOPN(page_id, 0) as top_pages FROM page_visits;
    ERROR 1105 (HY000): errCode = 2, detailMessage = topn requires second 
parameter must be a constant positive integer: topn(cast(page_id as 
VARCHAR(65533)), 0)
    
    Doris> SELECT TOPN(page_id, -1) as top_pages FROM page_visits;
    ERROR 1105 (HY000): errCode = 2, detailMessage = topn requires second 
parameter must be a constant positive integer: topn(cast(page_id as 
VARCHAR(65533)), -1)
    ```
---
 .../trees/expressions/functions/agg/TopN.java      | 14 ++++++++++
 .../trees/expressions/functions/agg/TopNArray.java | 14 ++++++++++
 .../expressions/functions/agg/TopNWeighted.java    | 14 ++++++++++
 .../agg_function/topn/topn.groovy                  | 32 ++++++++++++++++++++++
 4 files changed, 74 insertions(+)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopN.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopN.java
index 5033b96e809..b223b130cc0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopN.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopN.java
@@ -21,6 +21,7 @@ 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.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.IntegerType;
 import org.apache.doris.nereids.types.VarcharType;
@@ -97,6 +98,19 @@ public class TopN extends NullableAggregateFunction
         }
     }
 
+    @Override
+    public void checkLegalityAfterRewrite() {
+        Expression topNCount = getArgument(1);
+        if (topNCount.isNullLiteral()) {
+            return;
+        }
+        if (!(topNCount instanceof Literal) || ((Literal) 
topNCount).getDouble() <= 0) {
+            throw new AnalysisException(
+                    "topn requires second parameter must be a constant 
positive integer: "
+                            + this.toSql());
+        }
+    }
+
     /**
      * withDistinctAndChildren.
      */
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNArray.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNArray.java
index 7a6f82db99c..bc370be9619 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNArray.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNArray.java
@@ -21,6 +21,7 @@ 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.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.IntegerType;
@@ -100,6 +101,19 @@ public class TopNArray extends NullableAggregateFunction
         }
     }
 
+    @Override
+    public void checkLegalityAfterRewrite() {
+        Expression topNCount = getArgument(1);
+        if (topNCount.isNullLiteral()) {
+            return;
+        }
+        if (!(topNCount instanceof Literal) || ((Literal) 
topNCount).getDouble() <= 0) {
+            throw new AnalysisException(
+                    "topn_array requires second parameter must be a constant 
positive integer: "
+                            + this.toSql());
+        }
+    }
+
     /**
      * withDistinctAndChildren.
      */
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNWeighted.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNWeighted.java
index 1ed1586f99f..9297e7f1ae0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNWeighted.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/TopNWeighted.java
@@ -21,6 +21,7 @@ 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.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.ArrayType;
 import org.apache.doris.nereids.types.BigIntType;
@@ -205,4 +206,17 @@ public class TopNWeighted extends NullableAggregateFunction
                             + this.toSql());
         }
     }
+
+    @Override
+    public void checkLegalityAfterRewrite() {
+        Expression topNCount = getArgument(2);
+        if (topNCount.isNullLiteral()) {
+            return;
+        }
+        if (!(topNCount instanceof Literal) || ((Literal) 
topNCount).getDouble() <= 0) {
+            throw new AnalysisException(
+                    "topn_weighted requires third parameter must be a constant 
positive integer: "
+                            + this.toSql());
+        }
+    }
 }
diff --git 
a/regression-test/suites/nereids_function_p0/agg_function/topn/topn.groovy 
b/regression-test/suites/nereids_function_p0/agg_function/topn/topn.groovy
index e29cafa29bd..004c758ff36 100644
--- a/regression-test/suites/nereids_function_p0/agg_function/topn/topn.groovy
+++ b/regression-test/suites/nereids_function_p0/agg_function/topn/topn.groovy
@@ -51,21 +51,53 @@ suite("topn") {
        exception "errCode = 2"
     }
 
+    test {
+        sql """select topn(id,-1) from test_topn;"""
+        exception "topn requires second parameter must be a constant positive 
integer"
+    }
+
+    test {
+        sql """select topn(id,0) from test_topn;"""
+        exception "topn requires second parameter must be a constant positive 
integer"
+    }
+
     test {
         sql """select topn_array(id,id) from test_topn;"""
        exception "errCode = 2"
     }
+
     test {
         sql """select topn_array(id,1,id) from test_topn;"""
        exception "errCode = 2"
     }
 
+    test {
+        sql """select topn_array(id,-1) from test_topn;"""
+        exception "topn_array requires second parameter must be a constant 
positive integer"
+    }
+
+    test {
+        sql """select topn_array(id,0) from test_topn;"""
+        exception "topn_array requires second parameter must be a constant 
positive integer"
+    }
+
     test {
         sql """select topn_weighted(id,id,id) from test_topn;"""
        exception "errCode = 2"
     }
+
     test {
         sql """select topn_weighted(id,id,1,id) from test_topn;"""
        exception "errCode = 2"
     }
+
+    test {
+        sql """select topn_weighted(id,id,-1) from test_topn;"""
+        exception "topn_weighted requires third parameter must be a constant 
positive integer"
+    }
+
+    test {
+        sql """select topn_weighted(id,id,0) from test_topn;"""
+        exception "topn_weighted requires third parameter must be a constant 
positive integer"
+    }
 }


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

Reply via email to