[
https://issues.apache.org/jira/browse/CALCITE-2657?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16678576#comment-16678576
]
Julian Hyde commented on CALCITE-2657:
--------------------------------------
I don't have any problem with this PR in principle. If you would still like to
merge it, please tell us. As long as you take my point that RexCall should
probably not be sub-classed - and if you do, we won't do anything to make your
life easier.
> 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
> Priority: Major
> 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 override 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)