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 85bb1c5aa61 [fix](paimon)fix like predicate #28803 (#28937)
85bb1c5aa61 is described below
commit 85bb1c5aa61f8cdad61a20de15e9936a6c0f4a24
Author: wuwenchi <[email protected]>
AuthorDate: Sun Dec 24 22:42:54 2023 +0800
[fix](paimon)fix like predicate #28803 (#28937)
---
.../external/paimon/PaimonPredicateConverter.java | 17 +++++++++++++----
.../external_table_p0/paimon/test_paimon_catalog.out | 16 ++++++++++++++++
.../external_table_p0/paimon/test_paimon_catalog.groovy | 10 ++++++++++
3 files changed, 39 insertions(+), 4 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/paimon/PaimonPredicateConverter.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/paimon/PaimonPredicateConverter.java
index 9c997c03190..92900bc1a73 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/paimon/PaimonPredicateConverter.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/paimon/PaimonPredicateConverter.java
@@ -17,14 +17,15 @@
package org.apache.doris.planner.external.paimon;
-import org.apache.doris.analysis.BinaryPredicate;
import org.apache.doris.analysis.CastExpr;
import org.apache.doris.analysis.CompoundPredicate;
import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.FunctionCallExpr;
import org.apache.doris.analysis.LiteralExpr;
import org.apache.doris.analysis.SlotRef;
import org.apache.doris.thrift.TExprOpcode;
+import org.apache.paimon.data.BinaryString;
import org.apache.paimon.predicate.Predicate;
import org.apache.paimon.predicate.PredicateBuilder;
import org.apache.paimon.types.DataField;
@@ -84,10 +85,9 @@ public class PaimonPredicateConverter {
private Predicate binaryExprDesc(Expr dorisExpr) {
TExprOpcode opcode = dorisExpr.getOpcode();
- BinaryPredicate bp = (BinaryPredicate) dorisExpr;
// Make sure the col slot is always first
- SlotRef slotRef = convertDorisExprToSlotRef(bp.getChild(0));
- LiteralExpr literalExpr =
convertDorisExprToLiteralExpr(bp.getChild(1));
+ SlotRef slotRef = convertDorisExprToSlotRef(dorisExpr.getChild(0));
+ LiteralExpr literalExpr =
convertDorisExprToLiteralExpr(dorisExpr.getChild(1));
if (slotRef == null || literalExpr == null) {
return null;
}
@@ -113,6 +113,15 @@ public class PaimonPredicateConverter {
return builder.lessOrEqual(idx, value);
case LT:
return builder.lessThan(idx, value);
+ case INVALID_OPCODE:
+ if (dorisExpr instanceof FunctionCallExpr) {
+ String name = ((FunctionCallExpr)
dorisExpr).getFnName().getFunction().toLowerCase();
+ String s = value.toString();
+ if (name.equals("like") && !s.startsWith("%") &&
s.endsWith("%")) {
+ return builder.startsWith(idx,
BinaryString.fromString(s.substring(0, s.length() - 1)));
+ }
+ }
+ return null;
default:
return null;
}
diff --git
a/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out
b/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out
index a2e4f2752c0..b0c9eff5b0a 100644
--- a/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out
+++ b/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out
@@ -7,6 +7,22 @@
2 2 3 4 5 6 7 8 9.1 10.1
11.10 2020-02-02 13str 14varchar a true aaaa
2023-12-21T10:02:32.747
10 20 30 40 50 60 70 80 90.1 100.1
110.10 2020-03-02 130str 140varchar b false bbbb
2023-12-21T10:02:37.527
+-- !predict_like_1 --
+1 2 3 4 5 6 7 8 9.1 10.1
11.10 2020-02-02 13str 14varchar a true aaaa
2023-08-13T09:32:38.530
+10 20 30 40 50 60 70 80 90.1 100.1
110.10 2020-03-02 130str 140varchar b false bbbb
2023-08-14T08:32:52.821
+
+-- !predict_like_2 --
+1 2 3 4 5 6 7 8 9.1 10.1
11.10 2020-02-02 13str 14varchar a true aaaa
2023-08-13T09:32:38.530
+10 20 30 40 50 60 70 80 90.1 100.1
110.10 2020-03-02 130str 140varchar b false bbbb
2023-08-14T08:32:52.821
+
+-- !predict_like_3 --
+
+-- !predict_like_4 --
+10 20 30 40 50 60 70 80 90.1 100.1
110.10 2020-03-02 130str 140varchar b false bbbb
2023-08-14T08:32:52.821
+
+-- !predict_like_5 --
+10 20 30 40 50 60 70 80 90.1 100.1
110.10 2020-03-02 130str 140varchar b false bbbb
2023-08-14T08:32:52.821
+
-- !c1 --
1 2 3 4 5 6 7 8 9.1 10.1
11.10 2020-02-02 13str 14varchar a true aaaa
2023-08-13T09:32:38.530
diff --git
a/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy
b/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy
index ab5bf59a01b..70bbb40078c 100644
--- a/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy
+++ b/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy
@@ -56,6 +56,11 @@ suite("test_paimon_catalog",
"p0,external,doris,external_docker,external_docker_
if (enabled != null && enabled.equalsIgnoreCase("true")) {
def all = """select * from all_table order by c1;"""
def all_with_parquet = """select * from all_table_with_parquet
order by c1;"""
+ def predict_like_1 = """select * from all_table where c13 like
'%3%' order by c1"""
+ def predict_like_2 = """select * from all_table where c13 like
'13%' order by c1"""
+ def predict_like_3 = """select * from all_table where c13 like
'13' order by c1"""
+ def predict_like_4 = """select * from all_table where c13 like
'130str' order by c1"""
+ def predict_like_5 = """select * from all_table where c13 like
'130str%' order by c1"""
def c1 = """select * from all_table where c1=1;"""
def c2 = """select * from all_table where c2=2;"""
def c3 = """select * from all_table where c3=3;"""
@@ -175,6 +180,11 @@ suite("test_paimon_catalog",
"p0,external,doris,external_docker,external_docker_
qt_all all
qt_all_with_parquet all_with_parquet
+ qt_predict_like_1 predict_like_1
+ qt_predict_like_2 predict_like_2
+ qt_predict_like_3 predict_like_3
+ qt_predict_like_4 predict_like_4
+ qt_predict_like_5 predict_like_5
qt_c1 c1
qt_c2 c2
qt_c3 c3
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]