From 7e1faa7563507a3474755149775f70d5946d2d11 Mon Sep 17 00:00:00 2001 From: Song Jiacheng Date: Fri, 13 Dec 2024 17:08:24 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=9Cre-lint=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [Enhancement] Convert the constant value to target type while making kudu predicate. Signed-off-by: Song Jiacheng --- .../kudu/KuduPredicateConverter.java | 21 +++++++++++++++---- .../kudu/KuduPredicateConverterTest.java | 4 ++-- 2 files changed, 19 insertions(+), 6 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 6b185a2b3abe0..d6b018d7c0d8a 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 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 visitInPredicate(InPredicateOperator operator, Void c if (columnName == null) { return Lists.newArrayList(); } + ColumnSchema column = schema.getColumn(columnName); + Type targetType = ColumnTypeConverter.fromKuduType(column); List valuesOperatorList = operator.getListChildren(); List 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,11 +160,18 @@ public List 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; + Optional casted = constValue.castTo(targetType); + if (!casted.isPresent()) { + // Illegal cast. Do not push down the predicate. + return null; + } + constValue = casted.get(); switch (constValue.getType().getPrimitiveType()) { case BOOLEAN: return constValue.getBoolean(); @@ -202,7 +215,7 @@ public List visitLikePredicateOperator(LikePredicateOperator oper } private String getColumnName(ScalarOperator operator) { - if (operator == null || operator instanceof CastOperator) { + if (operator == null) { return null; } diff --git a/fe/fe-core/src/test/java/com/starrocks/connector/kudu/KuduPredicateConverterTest.java b/fe/fe-core/src/test/java/com/starrocks/connector/kudu/KuduPredicateConverterTest.java index 5baa9aa5a0f9d..00bb4998bcc97 100644 --- a/fe/fe-core/src/test/java/com/starrocks/connector/kudu/KuduPredicateConverterTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/connector/kudu/KuduPredicateConverterTest.java @@ -78,10 +78,10 @@ public void testEq() { @Test public void testEqCast() { - ConstantOperator value = ConstantOperator.createInt(5); + ConstantOperator value = ConstantOperator.createVarchar("5"); ScalarOperator op = new BinaryPredicateOperator(BinaryType.EQ, F0_CAST, value); List result = CONVERTER.convert(op); - Assert.assertEquals(result.size(), 0); + Assert.assertEquals(result.get(0).toString(), "`f0` = 5"); } @Test