This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 59c8663abe7 [fix](nereids) convert stringLikeLiteral to double should
use byte length (#43776) branch-2.1 (#43911)
59c8663abe7 is described below
commit 59c8663abe786c046089d664c2e2a5ecc34a6aee
Author: minghong <[email protected]>
AuthorDate: Thu Nov 14 11:15:17 2024 +0800
[fix](nereids) convert stringLikeLiteral to double should use byte length
(#43776) branch-2.1 (#43911)
### What problem does this PR solve?
pick #43776
The optimizer maps different data types to Double, allowing for a
unified comparison of literals.
StringLikeLiteral is regarded as a long int, and map the long int to
double.
To extract the first N bytes from a string, you should use
String.getBytes().length instead of String.length().
、
---
.../expressions/literal/StringLikeLiteral.java | 5 ++--
.../expressions/literal/StringLikeLiteralTest.java | 34 ++++++++++++++++++++++
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteral.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteral.java
index dca604f9db2..f5fe33a0ab1 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteral.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteral.java
@@ -46,11 +46,12 @@ public abstract class StringLikeLiteral extends Literal {
* get double value
*/
public static double getDouble(String str) {
+ byte[] bytes = str.getBytes();
long v = 0;
int pos = 0;
- int len = Math.min(str.length(), 7);
+ int len = Math.min(bytes.length, 7);
while (pos < len) {
- v += Byte.toUnsignedLong(str.getBytes()[pos]) << ((6 - pos) * 8);
+ v += Byte.toUnsignedLong(bytes[pos]) << ((6 - pos) * 8);
pos++;
}
return (double) v;
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteralTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteralTest.java
new file mode 100644
index 00000000000..c1e9bc0e839
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteralTest.java
@@ -0,0 +1,34 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.expressions.literal;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class StringLikeLiteralTest {
+ @Test
+ public void testStrToDouble() {
+ // fix bug: maxStr.length = 4, maxStr.getBytes().length=12
+ // when converting str to double, bytes length is used instead of
string length
+ String minStr = "商家+店长+场地+设备类型维度";
+ String maxStr = "商家维度";
+ double d1 = StringLikeLiteral.getDouble(minStr);
+ double d2 = StringLikeLiteral.getDouble(maxStr);
+ Assertions.assertTrue(d1 < d2);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]