This is an automated email from the ASF dual-hosted git repository.
yiguolei 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 d2612d4c16b [bugfix](nerids) align locate function behavior with BE
side (#50797)
d2612d4c16b is described below
commit d2612d4c16b30f990596a839cf290042298bbce3
Author: XLPE <[email protected]>
AuthorDate: Tue May 13 09:00:27 2025 +0800
[bugfix](nerids) align locate function behavior with BE side (#50797)
In Doris versions above 2.1.8 and above 3.0.3, , the newly added locate
function does not behave consistently with the BE.
**Refer to the example below.**
**Constant folding is enabled by default, and the result calculated by
the FE is returned.**
mysql> select locate('', 'εεπππ€£π€£π', 26);
| locate('', 'εεπππ€£π€£π', 26) |
|--------------------------------|
| 1 |
mysql> select locate('bc', 'abcabcabc', 4);
| locate('bc', 'abcabcabc', 4) |
|------------------------------|
| 2 |
**Set to disable constant folding and return the result calculated by
the BE.**
mysql> set debug_skip_fold_constant=true;
mysql> select locate('', 'εεπππ€£π€£π', 26);
| locate('', 'εεπππ€£π€£π', 26) |
|--------------------------------|
| 26 |
mysql> select locate('bc', 'abcabcabc', 4);
| locate('bc', 'abcabcabc', 4) |
|------------------------------|
| 5 |
---
.../functions/executable/StringArithmetic.java | 23 ++++++++++++++++------
.../fold_constant_string_arithmatic.groovy | 17 ++++++++++++++++
2 files changed, 34 insertions(+), 6 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/StringArithmetic.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/StringArithmetic.java
index 2909c46abc8..221208dc9eb 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/StringArithmetic.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/StringArithmetic.java
@@ -346,7 +346,7 @@ public class StringArithmetic {
*/
@ExecFunction(name = "locate")
public static Expression locate(StringLikeLiteral first, StringLikeLiteral
second) {
- return new IntegerLiteral(second.getValue().indexOf(first.getValue())
+ 1);
+ return locate(first, second, new IntegerLiteral(1));
}
/**
@@ -354,12 +354,23 @@ public class StringArithmetic {
*/
@ExecFunction(name = "locate")
public static Expression locate(StringLikeLiteral first, StringLikeLiteral
second, IntegerLiteral third) {
- int result = second.getValue().indexOf(first.getValue()) + 1;
- if (third.getValue() <= 0 || !substringImpl(second.getValue(),
third.getValue(),
- second.getValue().codePointCount(0,
second.getValue().length())).contains(first.getValue())) {
- result = 0;
+ String searchStr = first.getValue();
+ String targetStr = second.getValue();
+ int startPos = third.getValue();
+ if (searchStr.isEmpty()) {
+ int byteLength = targetStr.getBytes(StandardCharsets.UTF_8).length;
+ return (startPos >= 1 && startPos <= byteLength)
+ ? new IntegerLiteral(startPos)
+ : new IntegerLiteral(startPos == 1 ? 1 : 0);
}
- return new IntegerLiteral(result);
+
+ int strLength = targetStr.codePointCount(0, targetStr.length());
+ if (startPos < 1 || startPos > strLength) {
+ return new IntegerLiteral(0);
+ }
+ int offset = targetStr.offsetByCodePoints(0, startPos - 1);
+ int loc = targetStr.indexOf(searchStr, offset);
+ return loc == -1 ? new IntegerLiteral(0) : new
IntegerLiteral(targetStr.codePointCount(0, loc) + 1);
}
/**
diff --git
a/regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_string_arithmatic.groovy
b/regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_string_arithmatic.groovy
index ac8a97c705e..4a85deedd53 100644
---
a/regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_string_arithmatic.groovy
+++
b/regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_string_arithmatic.groovy
@@ -430,6 +430,23 @@ suite("fold_constant_string_arithmatic") {
testFoldConst("select locate('εδΊ¬', 'δΈζ΅·ε€©ζ΄₯εδΊ¬ζε·', -4)")
testFoldConst("select locate('εδΊ¬', 'δΈζ΅·ε€©ζ΄₯εδΊ¬ζε·', -5)")
testFoldConst("select locate('2', ' 123 ', 1)")
+ testFoldConst("select locate('bc', 'abcbcbc', 4)")
+ testFoldConst("select locate('a', 'a')")
+ testFoldConst("select locate('', '')")
+ testFoldConst("select locate('', '', 2)")
+ testFoldConst("select locate('abc', 'abcd')")
+ testFoldConst("select locate('', 'hello', 5)")
+ testFoldConst("select locate('', 'hello', 6)")
+ testFoldConst("select locate('', 'εεπππ€£π€£π')")
+ testFoldConst("select locate('', 'εεπππ€£π€£π', 26)")
+ testFoldConst("select locate('', 'εεπππ€£π€£π', 27)")
+ testFoldConst("select locate('π€£π€£', 'εεπππ€£π€£π', 5)")
+ testFoldConst("select locate('π€£π€£π€£', 'εεπππ€£π€£π', 5)")
+ testFoldConst("select locate('π€£', 'εεπππ€£π€£π', 6)")
+ testFoldConst("select locate('π
', 'εεπππ€£π€£π', 6)")
+ testFoldConst("select locate('μλ
', 'εεγγγ«γ‘μλ
νμΈ', 6)")
+ testFoldConst("select locate('νμΈ', 'εεγγγ«γ‘μλ
νμΈ', 9)")
+ testFoldConst("select locate('μΈ', 'εεγγγ«γ‘μλ
νμΈ', 11)")
// lower
testFoldConst("select lower('AbC123')")
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]