HIVE-10874: Fail in 
TestMinimrCliDriver.testCliDriver_ql_rewrite_gbtoidx_cbo_2.q due to duplicate 
column name (Jesus Camacho Rodriguez via Laljo John Pullokkaran)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/17bedcc0
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/17bedcc0
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/17bedcc0

Branch: refs/heads/spark
Commit: 17bedcc0016b557228f7ae3be1596ae9cb93ecb8
Parents: 9c45f92
Author: jpullokk <jpull...@apache.org>
Authored: Thu Jun 4 13:54:29 2015 -0700
Committer: jpullokk <jpull...@apache.org>
Committed: Thu Jun 4 14:00:58 2015 -0700

----------------------------------------------------------------------
 .../calcite/reloperators/HiveAggregate.java     | 58 ++++++++++++++++++++
 1 file changed, 58 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/17bedcc0/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveAggregate.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveAggregate.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveAggregate.java
index bea5eec..903cc19 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveAggregate.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveAggregate.java
@@ -18,7 +18,9 @@
 package org.apache.hadoop.hive.ql.optimizer.calcite.reloperators;
 
 import java.util.List;
+import java.util.Set;
 
+import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptCost;
 import org.apache.calcite.plan.RelOptPlanner;
@@ -29,10 +31,16 @@ import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.AggregateCall;
 import org.apache.calcite.rel.core.RelFactories.AggregateFactory;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.IntList;
 import org.apache.hadoop.hive.ql.optimizer.calcite.TraitsUtil;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 
 public class HiveAggregate extends Aggregate implements HiveRelNode {
 
@@ -81,6 +89,56 @@ public class HiveAggregate extends Aggregate implements 
HiveRelNode {
             containsAll(groupSet.asList());
   }
 
+  @Override
+  protected RelDataType deriveRowType() {
+    return deriveRowType(getCluster().getTypeFactory(), 
getInput().getRowType(),
+        indicator, groupSet, groupSets, aggCalls);
+  }
+
+  public static RelDataType deriveRowType(RelDataTypeFactory typeFactory,
+      final RelDataType inputRowType, boolean indicator,
+      ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets,
+      final List<AggregateCall> aggCalls) {
+    final IntList groupList = groupSet.toList();
+    assert groupList.size() == groupSet.cardinality();
+    final RelDataTypeFactory.FieldInfoBuilder builder = typeFactory.builder();
+    final List<RelDataTypeField> fieldList = inputRowType.getFieldList();
+    final Set<String> containedNames = Sets.newHashSet();
+    for (int groupKey : groupList) {
+      containedNames.add(fieldList.get(groupKey).getName());
+      builder.add(fieldList.get(groupKey));
+    }
+    if (indicator) {
+      for (int groupKey : groupList) {
+        final RelDataType booleanType =
+            typeFactory.createTypeWithNullability(
+                typeFactory.createSqlType(SqlTypeName.BOOLEAN), false);
+        String name = "i$" + fieldList.get(groupKey).getName();
+        int i = 0;
+        while (containedNames.contains(name)) {
+          name += "_" + i++;
+        }
+        containedNames.add(name);
+        builder.add(name, booleanType);
+      }
+    }
+    for (Ord<AggregateCall> aggCall : Ord.zip(aggCalls)) {
+      String name;
+      if (aggCall.e.name != null) {
+        name = aggCall.e.name;
+      } else {
+        name = "$f" + (groupList.size() + aggCall.i);
+      }
+      int i = 0;
+      while (containedNames.contains(name)) {
+        name += "_" + i++;
+      }
+      containedNames.add(name);
+      builder.add(name, aggCall.e.type);
+    }
+    return builder.build();
+  }
+
   private static class HiveAggRelFactory implements AggregateFactory {
 
     @Override

Reply via email to