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;";