From bfd7f3171dd70bc554879994f6dc6dfa44641b28 Mon Sep 17 00:00:00 2001
From: Song Jiacheng <songjiacheng@thinkingdata.cn>
Date: Fri, 13 Dec 2024 17:08:24 +0800
Subject: [PATCH] [Enhancement] Convert the constant value to target type while
 making kudu predicate.

Signed-off-by: Song Jiacheng <songjiacheng@thinkingdata.cn>
---
 .../connector/kudu/KuduPredicateConverter.java   | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/fe/fe-core/src/main/java/com/starrocks/connector/kudu/KuduPredicateConverter.java b/fe/fe-core/src/main/java/com/starrocks/connector/kudu/KuduPredicateConverter.java
index 6b185a2b3abe0d..7c356b1d08eaea 100644
--- a/fe/fe-core/src/main/java/com/starrocks/connector/kudu/KuduPredicateConverter.java
+++ b/fe/fe-core/src/main/java/com/starrocks/connector/kudu/KuduPredicateConverter.java
@@ -16,6 +16,8 @@
 
 import com.google.common.collect.Lists;
 import com.starrocks.analysis.BinaryType;
+import com.starrocks.catalog.Type;
+import com.starrocks.connector.ColumnTypeConverter;
 import com.starrocks.sql.optimizer.operator.scalar.BinaryPredicateOperator;
 import com.starrocks.sql.optimizer.operator.scalar.CastOperator;
 import com.starrocks.sql.optimizer.operator.scalar.ColumnRefOperator;
@@ -103,7 +105,9 @@ public List<KuduPredicate> visitBinaryPredicate(BinaryPredicateOperator operator
         if (columnName == null) {
             return Lists.newArrayList();
         }
-        Object literal = getLiteral(operator.getChild(1));
+        ColumnSchema column = schema.getColumn(columnName);
+        Type targetType = ColumnTypeConverter.fromKuduType(column);
+        Object literal = getLiteral(operator.getChild(1), targetType);
         if (literal == null) {
             return Lists.newArrayList();
         }
@@ -137,10 +141,12 @@ public List<KuduPredicate> visitInPredicate(InPredicateOperator operator, Void c
         if (columnName == null) {
             return Lists.newArrayList();
         }
+        ColumnSchema column = schema.getColumn(columnName);
+        Type targetType = ColumnTypeConverter.fromKuduType(column);
         List<ScalarOperator> valuesOperatorList = operator.getListChildren();
         List<Object> literalValues = new ArrayList<>(valuesOperatorList.size());
         for (ScalarOperator valueOperator : valuesOperatorList) {
-            Object literal = getLiteral(valueOperator);
+            Object literal = getLiteral(valueOperator, targetType);
             if (literal == null) {
                 return Lists.newArrayList();
             }
@@ -154,12 +160,14 @@ public List<KuduPredicate> visitInPredicate(InPredicateOperator operator, Void c
         return Lists.newArrayList();
     }
 
-    private Object getLiteral(ScalarOperator operator) {
+    private Object getLiteral(ScalarOperator operator, Type targetType) {
         if (!(operator instanceof ConstantOperator)) {
             return null;
         }
+
         ConstantOperator constValue = (ConstantOperator) operator;
-        switch (constValue.getType().getPrimitiveType()) {
+        Optional<ConstantOperator> casted = constValue.castTo(targetType);
+        switch (casted.isPresent() ? casted.get().getType().getPrimitiveType() : constValue.getType().getPrimitiveType()) {
             case BOOLEAN:
                 return constValue.getBoolean();
             case TINYINT: