This is an automated email from the ASF dual-hosted git repository.
kxiao 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 e9d944c5f32 [branch-2.0](fix) Fix be crash about mark_first/last_n
#35884 (#36357)
e9d944c5f32 is described below
commit e9d944c5f327424721c07d694387cc864dd2599d
Author: zclllyybb <[email protected]>
AuthorDate: Wed Jun 19 12:17:51 2024 +0800
[branch-2.0](fix) Fix be crash about mark_first/last_n #35884 (#36357)
fix crash when mark_first/last_n gets negative 2nd arg input.
and make mark_first/last_n support literal only for 2nd arg
it's a part of https://github.com/apache/doris/pull/35884
---
be/src/vec/functions/function_string.h | 20 ++++++++++----------
.../expressions/functions/scalar/MaskFirstN.java | 8 ++++++++
.../expressions/functions/scalar/MaskLastN.java | 8 ++++++++
.../suites/correctness_p0/test_mask_function.groovy | 18 ++++++++++++++++++
4 files changed, 44 insertions(+), 10 deletions(-)
diff --git a/be/src/vec/functions/function_string.h
b/be/src/vec/functions/function_string.h
index 537b5748f3c..6b7bfca9808 100644
--- a/be/src/vec/functions/function_string.h
+++ b/be/src/vec/functions/function_string.h
@@ -506,28 +506,28 @@ public:
Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
size_t result, size_t input_rows_count) override {
- DCHECK_GE(arguments.size(), 1);
- DCHECK_LE(arguments.size(), 2);
-
- int n = -1;
+ int n = -1; // means unassigned
auto res = ColumnString::create();
auto col =
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
const ColumnString& source_column = assert_cast<const
ColumnString&>(*col);
if (arguments.size() == 2) {
- auto& col = *block.get_by_position(arguments[1]).column;
+ const auto& col = *block.get_by_position(arguments[1]).column;
+ // the 2nd arg is const. checked in fe.
+ if (col.get_int(0) < 0) [[unlikely]] {
+ return Status::InvalidArgument(
+ "function {} only accept non-negative input for 2nd
argument but got {}",
+ name, col.get_int(0));
+ }
n = col.get_int(0);
- } else if (arguments.size() > 2) {
- return Status::InvalidArgument(
- fmt::format("too many arguments for function {}",
get_name()));
}
- if (n == -1) {
+ if (n == -1) { // no 2nd arg, just mask all
FunctionMask::vector_mask(source_column, *res,
FunctionMask::DEFAULT_UPPER_MASK,
FunctionMask::DEFAULT_LOWER_MASK,
FunctionMask::DEFAULT_NUMBER_MASK);
- } else if (n >= 0) {
+ } else { // n >= 0
vector(source_column, n, *res);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MaskFirstN.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MaskFirstN.java
index 81a968067c2..33e19d468e8 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MaskFirstN.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MaskFirstN.java
@@ -18,6 +18,7 @@
package org.apache.doris.nereids.trees.expressions.functions.scalar;
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.functions.PropagateNullable;
@@ -65,6 +66,13 @@ public class MaskFirstN extends ScalarFunction implements
ExplicitlyCastableSign
return new MaskFirstN(children.get(0), children.get(1));
}
+ @Override
+ public void checkLegalityAfterRewrite() {
+ if (arity() == 2 && !child(1).isLiteral()) {
+ throw new AnalysisException("mask_first_n must accept literal for
2nd argument");
+ }
+ }
+
@Override
public List<FunctionSignature> getSignatures() {
return SIGNATURES;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MaskLastN.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MaskLastN.java
index cb8246f04ab..eafb85ee89b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MaskLastN.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MaskLastN.java
@@ -18,6 +18,7 @@
package org.apache.doris.nereids.trees.expressions.functions.scalar;
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.functions.PropagateNullable;
@@ -65,6 +66,13 @@ public class MaskLastN extends ScalarFunction implements
ExplicitlyCastableSigna
return new MaskLastN(children.get(0), children.get(1));
}
+ @Override
+ public void checkLegalityAfterRewrite() {
+ if (arity() == 2 && !child(1).isLiteral()) {
+ throw new AnalysisException("mask_last_n must accept literal for
2nd argument");
+ }
+ }
+
@Override
public List<FunctionSignature> getSignatures() {
return SIGNATURES;
diff --git a/regression-test/suites/correctness_p0/test_mask_function.groovy
b/regression-test/suites/correctness_p0/test_mask_function.groovy
index b242e72eccc..e487e51897c 100644
--- a/regression-test/suites/correctness_p0/test_mask_function.groovy
+++ b/regression-test/suites/correctness_p0/test_mask_function.groovy
@@ -16,6 +16,7 @@
// under the License.
suite("test_mask_function") {
+ sql " set enable_fallback_to_original_planner = false; "
sql """
drop table if exists table_mask_test;
"""
@@ -75,4 +76,21 @@ suite("test_mask_function") {
qt_select_digital_masking """
select digital_masking(13812345678);
"""
+
+ test {
+ sql """ select mask_last_n("12345", -100); """
+ exception "function mask_last_n only accept non-negative input for 2nd
argument but got -100"
+ }
+ test {
+ sql """ select mask_first_n("12345", -100); """
+ exception "function mask_first_n only accept non-negative input for
2nd argument but got -100"
+ }
+ test {
+ sql """ select mask_last_n("12345", id) from table_mask_test; """
+ exception "mask_last_n must accept literal for 2nd argument"
+ }
+ test {
+ sql """ select mask_first_n("12345", id) from table_mask_test; """
+ exception "mask_first_n must accept literal for 2nd argument"
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]