Chunwei Lei created CALCITE-2657:
------------------------------------
Summary: use RexCall#clone instead of constructor to make a new
RexCall in RexShuttle for more scalability
Key: CALCITE-2657
URL: https://issues.apache.org/jira/browse/CALCITE-2657
Project: Calcite
Issue Type: Bug
Components: core
Affects Versions: 1.17.0
Reporter: Chunwei Lei
Assignee: Julian Hyde
Fix For: 1.18.0
RexShuttle uses constructor of RexCall to generate a new RexCall, as followings:
{code:java}
public RexNode visitCall(final RexCall call) {
boolean[] update = {false};
List<RexNode> clonedOperands = visitList(call.operands, update);
if (update[0]) {
// REVIEW jvs 8-Mar-2005: This doesn't take into account
// the fact that a rewrite may have changed the result type.
// To do that, we would need to take a RexBuilder and
// watch out for special operators like CAST and NEW where
// the type is embedded in the original call.
return new RexCall(
call.getType(),
call.getOperator(),
clonedOperands);
} else {
return call;
}
}
{code}
It is more scalability when using RexCall#clone() for those using sub-class of
RexCall since function clone can be overwrite by sub-class, as followings:
{code:java}
public RexNode visitCall(final RexCall call) {
boolean[] update = {false};
List<RexNode> clonedOperands = visitList(call.operands, update);
if (update[0]) {
// REVIEW jvs 8-Mar-2005: This doesn't take into account
// the fact that a rewrite may have changed the result type.
// To do that, we would need to take a RexBuilder and
// watch out for special operators like CAST and NEW where
// the type is embedded in the original call.
return call.clone(call.getType(), clonedOperands);
} else {
return call;
}
}
{code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)