Ruben Q L created CALCITE-5839:
----------------------------------
Summary: EnumerableInterpretable#StaticFieldDetector can overwrite
its flag and return an incorrect result
Key: CALCITE-5839
URL: https://issues.apache.org/jira/browse/CALCITE-5839
Project: Calcite
Issue Type: Bug
Components: core
Reporter: Ruben Q L
Assignee: Ruben Q L
In EnumerableInterpretable, before using the bindable cache, it is verified
whether the class contains static fields (because in that case, the cache shall
not be used):
{code}
static Bindable getBindable(ClassDeclaration expr, ...) {
...
if (CalciteSystemProperty.BINDABLE_CACHE_MAX_SIZE.value() != 0) {
StaticFieldDetector detector = new StaticFieldDetector();
expr.accept(detector);
if (!detector.containsStaticField) {
return BINDABLE_CACHE.get(classBody, () ->
compileToBindable(expr.name, s, compiler));
}
}
....
/**
* A visitor detecting if the Java AST contains static fields.
*/
static class StaticFieldDetector extends VisitorImpl<Void> {
boolean containsStaticField = false;
@Override public Void visit(final FieldDeclaration fieldDeclaration) {
containsStaticField = (fieldDeclaration.modifier & Modifier.STATIC) != 0;
return containsStaticField ? null : super.visit(fieldDeclaration);
}
}
{code}
However, it seem that the {{containsStaticField}} flag in
{{{StaticFieldDetector}} can be overwritten when inspecting the field
declarations of the class, so that, if a non-static field is inspected after a
static field, the flag will be then (re)set to false; and the final result of
the shuttle will be wrong (false, when it should have been true).
--
This message was sent by Atlassian Jira
(v8.20.10#820010)