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]

Reply via email to