diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java index 169c351..6812192 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -73,6 +74,7 @@ import org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.OrderExpression; import org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.PartitionExpression; import org.apache.hadoop.hive.ql.parse.PTFTranslator; +import org.apache.hadoop.hive.ql.parse.ParseUtils; import org.apache.hadoop.hive.ql.parse.RowResolver; import org.apache.hadoop.hive.ql.parse.SemanticAnalyzer; import org.apache.hadoop.hive.ql.parse.SemanticException; @@ -94,6 +96,7 @@ import org.apache.hadoop.hive.ql.plan.SelectDesc; import org.apache.hadoop.hive.ql.plan.TableScanDesc; import org.apache.hadoop.hive.ql.plan.UnionDesc; +import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -554,7 +557,12 @@ OpAttr visit(HiveUnion unionRel) throws SemanticException { ArrayList cinfoLst = createColInfos(inputs[0].inputs.get(0), tableAlias); Operator[] children = new Operator[inputs.length]; for (int i = 0; i < children.length; i++) { - children[i] = inputs[i].inputs.get(0); + if (i == 0) { + children[i] = inputs[i].inputs.get(0); + } else { + Operator op = inputs[i].inputs.get(0); + children[i] = genInputSelectForUnion(op, cinfoLst); + } } Operator unionOp = OperatorFactory.getAndMakeChild(unionDesc, new RowSchema(cinfoLst), children); @@ -1168,4 +1176,28 @@ private static ExprNodeDesc convertToExprNode(RexNode rn, RelNode inputRel, Stri return new Pair, Set>(colInfos, newVColSet); } + + private Operator genInputSelectForUnion( + Operator origInputOp, ArrayList uColumnInfo) + throws SemanticException { + Iterator oIter = origInputOp.getSchema().getSignature().iterator(); + Iterator uIter = uColumnInfo.iterator(); + List columns = new ArrayList(); + List colName = new ArrayList(); + Map columnExprMap = new HashMap(); + while (oIter.hasNext()) { + ColumnInfo oInfo = oIter.next(); + ColumnInfo uInfo = uIter.next(); + ExprNodeDesc column = new ExprNodeColumnDesc(oInfo.getType(), oInfo.getInternalName(), + oInfo.getTabAlias(), oInfo.getIsVirtualCol(), oInfo.isSkewedCol()); + if (!oInfo.getType().equals(uInfo.getType())) { + column = ParseUtils.createConversionCast(column, (PrimitiveTypeInfo) uInfo.getType()); + } + columns.add(column); + colName.add(uInfo.getInternalName()); + columnExprMap.put(uInfo.getInternalName(), column); + } + return OperatorFactory.getAndMakeChild(new SelectDesc(columns, colName), new RowSchema( + uColumnInfo), columnExprMap, origInputOp); + } }