@Override
  public Operator<? extends OperatorDesc> clone()
    throws CloneNotSupportedException {

    List<Operator<? extends OperatorDesc>> parents = getParentOperators();
    List<Operator<? extends OperatorDesc>> parentClones =
      new ArrayList<Operator<? extends OperatorDesc>>();

    if (parents != null) {
      for (Operator<? extends OperatorDesc> parent : parents) {
        parentClones.add((parent.clone()));
      }
    }

    @SuppressWarnings("unchecked")
    T descClone = (T)conf.clone();
    // also clone the colExprMap by default
    // we need a deep copy
    ArrayList<ColumnInfo> colInfos =
        new ArrayList<>(getSchema().getSignature());
    Map<String, ExprNodeDesc> map = null;
    Map<String, ExprNodeDesc> colExprMap = getColumnExprMap();
    if (colExprMap != null) {
      map = new HashMap<>(colExprMap);
    }
    Operator<? extends OperatorDesc> ret = OperatorFactory.getAndMakeChild(
            cContext, descClone, new RowSchema(colInfos), map, parentClones);

    return ret;
  }
Called during semantic analysis as operators are being added
in order to give them a chance to compute any additional plan information
needed.  Does nothing by default.
ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java