Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (revision 733297) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (working copy) @@ -1328,57 +1328,51 @@ new ColumnInfo(field, exprInfo.getType())); } - // If there is a distinctFuncExp, add all parameters to the reduceKeys. - if (parseInfo.getDistinctFuncExprForClause(dest) != null) { - ASTNode value = parseInfo.getDistinctFuncExprForClause(dest); + HashMap aggregationTrees = parseInfo + .getAggregationExprsForClause(dest); + for (Map.Entry entry : aggregationTrees.entrySet()) { + ASTNode value = entry.getValue(); String aggName = value.getChild(0).getText(); Class aggClass = FunctionRegistry.getUDAF(aggName); assert (aggClass != null); - ArrayList aggParameters = new ArrayList(); - ArrayList> aggClasses = new ArrayList>(); - // 0 is the function name - for (int i = 1; i < value.getChildCount(); i++) { - String text = value.getChild(i).toStringTree(); - ASTNode paraExpr = (ASTNode)value.getChild(i); + Method aggEvaluateMethod = null; + ArrayList aggParameters = null; + + if (value.getToken().getType() == HiveParser.TOK_FUNCTIONDI) { + ArrayList> aggClasses = new ArrayList>(); + ArrayList params = new ArrayList(); + // 0 is the function name + for (int i = 1; i < value.getChildCount(); i++) { + String text = value.getChild(i).toStringTree(); + ASTNode paraExpr = (ASTNode)value.getChild(i); + ColumnInfo paraExprInfo = groupByInputRowResolver.get("",text); + if (paraExprInfo == null) { + throw new SemanticException(ErrorMsg.INVALID_COLUMN.getMsg(paraExpr)); + } + + String paraExpression = paraExprInfo.getInternalName(); + assert(paraExpression != null); + params.add(new exprNodeColumnDesc(paraExprInfo.getType(), paraExprInfo.getInternalName())); + aggClasses.add(paraExprInfo.getType().getPrimitiveClass()); + } + + UDAFInfo udaf = getUDAFInfo(aggName, mode, aggClasses, params, value); + aggParameters = udaf.convertedParameters; + aggEvaluateMethod = udaf.evaluateMethod; + } + else { + aggParameters = new ArrayList(); + aggEvaluateMethod = FunctionRegistry.getUDAFEvaluateMethod(aggName, mode); + String text = entry.getKey(); ColumnInfo paraExprInfo = groupByInputRowResolver.get("",text); if (paraExprInfo == null) { - throw new SemanticException(ErrorMsg.INVALID_COLUMN.getMsg(paraExpr)); + throw new SemanticException(ErrorMsg.INVALID_COLUMN.getMsg(value)); } - String paraExpression = paraExprInfo.getInternalName(); assert(paraExpression != null); - aggParameters.add(new exprNodeColumnDesc(paraExprInfo.getType(), paraExprInfo.getInternalName())); - aggClasses.add(paraExprInfo.getType().getPrimitiveClass()); + aggParameters.add(new exprNodeColumnDesc(paraExprInfo.getType(), paraExpression)); } - UDAFInfo udaf = getUDAFInfo(aggName, mode, aggClasses, aggParameters, value); - - aggregations.add(new aggregationDesc(aggClass, udaf.convertedParameters, true)); - groupByOutputRowResolver.put("",value.toStringTree(), - new ColumnInfo(Integer.valueOf(groupByKeys.size() + aggregations.size() -1).toString(), - udaf.evaluateMethod.getReturnType())); - } - - HashMap aggregationTrees = parseInfo - .getAggregationExprsForClause(dest); - for (Map.Entry entry : aggregationTrees.entrySet()) { - ASTNode value = entry.getValue(); - if (value.getToken().getType() == HiveParser.TOK_FUNCTIONDI) - continue; - - String aggName = value.getChild(0).getText(); - Class aggClass = FunctionRegistry.getUDAF(aggName); - Method aggEvaluateMethod = FunctionRegistry.getUDAFEvaluateMethod(aggName, mode); - assert (aggClass != null); - ArrayList aggParameters = new ArrayList(); - String text = entry.getKey(); - ColumnInfo paraExprInfo = groupByInputRowResolver.get("",text); - if (paraExprInfo == null) { - throw new SemanticException(ErrorMsg.INVALID_COLUMN.getMsg(value)); - } - String paraExpression = paraExprInfo.getInternalName(); - assert(paraExpression != null); - aggParameters.add(new exprNodeColumnDesc(paraExprInfo.getType(), paraExpression)); aggregations.add(new aggregationDesc(aggClass, aggParameters, ((mode == groupByDesc.Mode.FINAL) ? false : (value.getToken().getType() == HiveParser.TOK_FUNCTIONDI)))); groupByOutputRowResolver.put("", value.toStringTree(), new ColumnInfo(Integer.valueOf(groupByKeys.size() + aggregations.size() - 1).toString(),