From 55828efae8c60fc9514df08a70eb794042236ae0 Mon Sep 17 00:00:00 2001 From: Mryange Date: Wed, 9 Sep 2026 22:12:30 +0800 Subject: [PATCH] [fix](fe) Validate ngram search gram number --- .../functions/scalar/NgramSearch.java | 24 +++++++++++++------ .../test_string_function.groovy | 8 +++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NgramSearch.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NgramSearch.java index f1a0524ef5c536..45d35150c92f07 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NgramSearch.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/NgramSearch.java @@ -22,6 +22,7 @@ import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; +import org.apache.doris.nereids.trees.expressions.literal.IntegerLikeLiteral; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.DoubleType; import org.apache.doris.nereids.types.IntegerType; @@ -47,19 +48,28 @@ public class NgramSearch extends ScalarFunction */ public NgramSearch(Expression arg0, Expression arg1, Expression arg2) { super("ngram_search", arg0, arg1, arg2); - if (!(arg1.isConstant())) { + } + + /** constructor for withChildren and reuse signature */ + private NgramSearch(ScalarFunctionParams functionParams) { + super(functionParams); + } + + @Override + public void checkLegalityBeforeTypeCoercion() { + if (!child(1).isConstant()) { throw new AnalysisException( "ngram_search(text,pattern,gram_num): pattern support const value only."); } - if (!(arg2.isConstant())) { + Expression gramNum = child(2); + if (!gramNum.isConstant()) { throw new AnalysisException( "ngram_search(text,pattern,gram_num): gram_num support const value only."); } - } - - /** constructor for withChildren and reuse signature */ - private NgramSearch(ScalarFunctionParams functionParams) { - super(functionParams); + if (!(gramNum instanceof IntegerLikeLiteral) || ((IntegerLikeLiteral) gramNum).getIntValue() <= 0) { + throw new AnalysisException( + "ngram_search(text,pattern,gram_num): gram_num must be a positive constant."); + } } /** diff --git a/regression-test/suites/query_p0/sql_functions/string_functions/test_string_function.groovy b/regression-test/suites/query_p0/sql_functions/string_functions/test_string_function.groovy index 9db9777b1c895d..30aa358015b584 100644 --- a/regression-test/suites/query_p0/sql_functions/string_functions/test_string_function.groovy +++ b/regression-test/suites/query_p0/sql_functions/string_functions/test_string_function.groovy @@ -536,6 +536,14 @@ suite("test_string_function", "arrow_flight_sql") { qt_ngram_search2 """select ngram_search('abc','abc1313131',3); """ qt_ngram_search3 """select ngram_search('abc1313131','abc1313131',3); """ qt_ngram_search3 """select ngram_search('1313131','abc1313131',3); """ + test { + sql "select ngram_search('abc', 'abc', 0);" + exception "gram_num must be a positive constant" + } + test { + sql "select ngram_search('abc', 'abc', -1);" + exception "gram_num must be a positive constant" + } sql "drop table if exists test_function_ngram_search;";