@Override
    public Object process(Node nd, Stack<Node> stack, NodeProcessorCtx procCtx,
        Object... nodeOutputs) throws SemanticException {
      ExprWalkerInfo ctx = (ExprWalkerInfo) procCtx;
      ExprNodeColumnDesc colref = (ExprNodeColumnDesc) nd;
      RowSchema toRS = ctx.getOp().getSchema();
      Operator<? extends OperatorDesc> op = ctx.getOp();
      ColumnInfo ci = toRS.getColumnInfo(colref.getColumn());
      String tabAlias = null;
      if (ci != null) {
        tabAlias = ci.getTabAlias();
      }

      ExprInfo colExprInfo = null;
      boolean isCandidate = true;
      if (op.getColumnExprMap() != null) {
        // replace the output expression with the input expression so that
        // parent op can understand this expression
        ExprNodeDesc exp = op.getColumnExprMap().get(colref.getColumn());
        // if the operator is a groupby and we are referencing the grouping
        // id column, we cannot push the predicate
        if (op instanceof GroupByOperator) {
          GroupByOperator groupBy = (GroupByOperator) op;
          if (groupBy.getConf().isGroupingSetsPresent()) {
            int groupingSetPlaceholderPos = groupBy.getConf().getKeys().size() - 1;
            if (colref.getColumn().equals(groupBy.getSchema().getColumnNames().get(groupingSetPlaceholderPos))) {
              exp = null;
            }
          }
        }
        if (exp == null) {
          // means that expression can't be pushed either because it is value in
          // group by
          colExprInfo = ctx.addOrGetExprInfo(colref);
          colExprInfo.isCandidate = false;
          return false;
        } else {
          if (exp instanceof ExprNodeGenericFuncDesc) {
            if (isDeterministic((ExprNodeGenericFuncDesc) exp)) {
              isCandidate = true;
            } else {
              isCandidate = false;
            }
          }
          if (exp instanceof ExprNodeColumnDesc && ci == null) {
            ExprNodeColumnDesc column = (ExprNodeColumnDesc)exp;
            tabAlias = column.getTabAlias();
          }
        }
        colExprInfo = ctx.addOrGetExprInfo(colref);
        colExprInfo.convertedExpr = exp;
        ExprInfo expInfo = ctx.addExprInfo(exp);
        expInfo.isCandidate = isCandidate;
        if (tabAlias != null) {
          expInfo.alias = tabAlias;
        } else {
          expInfo.alias = colExprInfo.alias;
        }
      } else {
        if (ci == null) {
          return false;
        }
        colExprInfo = ctx.addOrGetExprInfo(colref);
        if (tabAlias != null) {
          colExprInfo.alias = tabAlias;
        }
      }
      colExprInfo.isCandidate = isCandidate;
      return isCandidate;
    }
Converts the reference from child row resolver to current row resolver.
ql/src/java/org/apache/hadoop/hive/ql/ppd/ExprWalkerProcFactory.java