[fix](paimon)fix like predicate (#28803)

fix like predict
This commit is contained in:
wuwenchi
2023-12-23 22:25:55 +08:00
committed by GitHub
parent 96d4778f2e
commit 1d8822b2b7
3 changed files with 39 additions and 4 deletions

View File

@ -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 = dorisExpr.getExprName().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;
}