git.net

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jira] [Created] (CALCITE-2657) use RexCall#clone instead of constructor to make a new RexCall in RexShuttle for more scalability


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)