-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Enhancement] Convert the constant value to target type while making kudu predicate. #53936
base: main
Are you sure you want to change the base?
Conversation
…kudu predicate. Signed-off-by: Song Jiacheng <[email protected]>
for (ScalarOperator valueOperator : valuesOperatorList) { | ||
Object literal = getLiteral(valueOperator); | ||
for (int i = 0; i < valuesOperatorList.size(); i++) { | ||
Object literal = getLiteral(casted.get(i).isPresent() ? casted.get(i).get() : valuesOperatorList.get(i)); | ||
if (literal == null) { | ||
return Lists.newArrayList(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The most risky bug in this code is:
The updated castTo
operation assumes that all ScalarOperator
objects are of type ConstantOperator
, which can lead to a ClassCastException
if any operator is not a ConstantOperator
.
You can modify the code like this:
@@ -103,7 +105,14 @@ 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);
+ ScalarOperator childOperator = operator.getChild(1);
+ Optional<ConstantOperator> casted = Optional.empty();
+ if (childOperator instanceof ConstantOperator) {
+ casted = ((ConstantOperator) childOperator).castTo(targetType);
+ }
+ Object literal = getLiteral(casted.isPresent() ? casted.get() : childOperator);
if (literal == null) {
return Lists.newArrayList();
}
@@ -137,10 +145,19 @@ 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<Optional<ConstantOperator>> castedValues = valuesOperatorList.stream()
+ .map(op -> op instanceof ConstantOperator ? ((ConstantOperator) op).castTo(targetType) : Optional.empty())
+ .collect(Collectors.toList());
List<Object> literalValues = new ArrayList<>(valuesOperatorList.size());
- for (ScalarOperator valueOperator : valuesOperatorList) {
- Object literal = getLiteral(valueOperator);
+ for (int i = 0; i < valuesOperatorList.size(); i++) {
+ ScalarOperator valueOperator = valuesOperatorList.get(i);
+ Object literal;
+ if (valueOperator instanceof ConstantOperator && castedValues.get(i).isPresent()) {
+ literal = getLiteral(castedValues.get(i).get());
+ } else {
+ literal = getLiteral(valueOperator);
+ }
if (literal == null) {
return Lists.newArrayList();
}
Quality Gate failedFailed conditions See analysis details on SonarQube Cloud Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE |
[Java-Extensions Incremental Coverage Report]✅ pass : 0 / 0 (0%) |
[BE Incremental Coverage Report]✅ pass : 0 / 0 (0%) |
Why I'm doing:
For now, the following fails.
select * from (select cast(coin_num as varchar) tmp from kudu.user_3) where tmp = '145';
The error showed below:
coin_num's type isn't [Type: string, Type: varchar]
, it's double`The error is raised by Kudu client, it builds the predicate by the type of the literal value we passed in. For this sql, we passed a string '145' but the column type is actually a double, so the error occurred.
What I'm doing:
Cast the constant operator to the target type to get the correct literal value while building the kudu predicate.
Fixes #issue
What type of PR is this:
Does this PR entail a change in behavior?
If yes, please specify the type of change:
Checklist:
Bugfix cherry-pick branch check: