diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveGroupingID.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveGroupingID.java index 345b64a..433d02d 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveGroupingID.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveGroupingID.java @@ -5,14 +5,15 @@ import org.apache.calcite.sql.type.InferTypes; import org.apache.calcite.sql.type.OperandTypes; import org.apache.calcite.sql.type.ReturnTypes; +import org.apache.hadoop.hive.ql.metadata.VirtualColumn; public class HiveGroupingID extends SqlInternalOperator { - public static final SqlInternalOperator GROUPING__ID = + public static final SqlInternalOperator INSTANCE = new HiveGroupingID(); private HiveGroupingID() { - super("$GROUPING__ID", + super(VirtualColumn.GROUPINGID.getName(), SqlKind.OTHER, 0, false, @@ -22,4 +23,3 @@ private HiveGroupingID() { } } - diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java index ea59181..3d08d39 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java @@ -189,31 +189,7 @@ else if (aggregateType == Group.CUBE) { int i = 0; for (RexNode r : select.getChildExps()) { - // If it is a GroupBy with grouping sets and grouping__id column - // is selected, we reformulate to project that column from - // the output of the GroupBy operator - boolean reformulate = false; - if (groupBy != null && groupBy.indicator) { - RexNode expr = select.getChildExps().get(i); - if (expr instanceof RexCall) { - if ( ((RexCall) expr).getOperator(). - equals(HiveGroupingID.GROUPING__ID)) { - reformulate = true; - } - } - } - ASTNode expr; - if(reformulate) { - RexInputRef iRef = new RexInputRef( - groupBy.getGroupCount() * 2 + groupBy.getAggCallList().size(), - TypeConverter.convert( - VirtualColumn.GROUPINGID.getTypeInfo(), - groupBy.getCluster().getTypeFactory())); - expr = iRef.accept(new RexVisitor(schema)); - } - else { - expr = r.accept(new RexVisitor(schema, r instanceof RexLiteral)); - } + ASTNode expr = r.accept(new RexVisitor(schema, r instanceof RexLiteral)); String alias = select.getRowType().getFieldNames().get(i++); ASTNode selectExpr = ASTBuilder.selectExpr(expr, alias); b.add(selectExpr); @@ -550,6 +526,11 @@ public ASTNode visitCall(RexCall call) { } SqlOperator op = call.getOperator(); + // If it is a grouping__id column, we reformulate to project + // that column + if (op == HiveGroupingID.INSTANCE) { + return ASTBuilder.unqualifiedName(VirtualColumn.GROUPINGID.getName()); + } List astNodeLst = new LinkedList(); if (op.kind == SqlKind.CAST) { HiveToken ht = TypeConverter.hiveToken(call.getType()); diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java index 47a209f..3ad834e 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java @@ -1862,7 +1862,7 @@ private RelNode genGBLogicalPlan(QB qb, RelNode srcRel) throws SemanticException i, gbOutput.get(i).getType())); } final RexBuilder rexBuilder = cluster.getRexBuilder(); - RexNode groupingID = rexBuilder.makeCall(HiveGroupingID.GROUPING__ID, + RexNode groupingID = rexBuilder.makeCall(HiveGroupingID.INSTANCE, identifierCols); calciteColLst.add(groupingID);