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: