HIVE-10390 : CBO (Calcite Return Path): Wrong type for windowing UDFs that produce different values for each row (Jesus Camacho Rodriguez via Ashutosh Chauhan)

git-svn-id: https://svn.apache.org/repos/asf/hive/branches/cbo@1674711 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
index 8e1b98b..e067cca 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
@@ -1535,6 +1535,14 @@ public static boolean impliesOrder(String functionName) throws SemanticException
     return false;
   }
 
+  public static boolean pivotResult(String functionName) throws SemanticException {
+    WindowFunctionInfo windowInfo = getWindowFunctionInfo(functionName);
+    if (windowInfo != null) {
+      return windowInfo.isPivotResult();
+    }
+    return false;
+  }
+
   public static boolean isTableFunction(String functionName)
       throws SemanticException {
     FunctionInfo tFInfo = getFunctionInfo(functionName);
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/TypeConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/TypeConverter.java
index c2ff766..13c8c23 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/TypeConverter.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/TypeConverter.java
@@ -240,7 +240,7 @@ public static TypeInfo convert(RelDataType rType) {
     } else if (rType.getKeyType() != null) {
       return convertMapType(rType);
     } else {
-      return convertPrimtiveType(rType);
+      return convertPrimitiveType(rType);
     }
   }
 
@@ -271,7 +271,7 @@ public static TypeInfo convertListType(RelDataType rType) {
     return TypeInfoFactory.getListTypeInfo(convert(rType.getComponentType()));
   }
 
-  public static TypeInfo convertPrimtiveType(RelDataType rType) {
+  public static TypeInfo convertPrimitiveType(RelDataType rType) {
     switch (rType.getSqlTypeName()) {
     case BOOLEAN:
       return TypeInfoFactory.booleanTypeInfo;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
index bfd59ea..3b8ade5 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
@@ -1827,7 +1827,11 @@ private AggInfo getHiveAggInfo(ASTNode aggAst, int aggFnLstArgIndx, RowResolver
             // 3.3.2 Get UDAF Info using UDAF Evaluator
             GenericUDAFInfo udaf = SemanticAnalyzer.getGenericUDAFInfo(genericUDAFEvaluator, amode,
                 aggParameters);
-            udafRetType = udaf.returnType;
+            if (FunctionRegistry.pivotResult(aggName)) {
+              udafRetType = ((ListTypeInfo)udaf.returnType).getListElementTypeInfo();
+            } else {
+              udafRetType = udaf.returnType;
+            }
           }
         } catch (Exception e) {
           LOG.debug("CBO: Couldn't Obtain UDAF evaluators for " + aggName