Index: ql/src/java/org/apache/hadoop/hive/ql/exec/MapOperator.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/MapOperator.java (revision 1150916) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/MapOperator.java (working copy) @@ -343,6 +343,15 @@ opCtxMap.get(inp).rowObjectInspector = this.rowObjectInspector; } } + } else if (op instanceof UnionOperator) { + if (op != null) { + if (opCtxMap != null) { + MapOpCtx m = opCtxMap.get(inp); + if (m != null) { + op.inputObjInspectors[0] = m.getRowObjectInspector(); + } + } + } } } Index: ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnInfo.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnInfo.java (revision 1150916) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnInfo.java (working copy) @@ -132,5 +132,9 @@ this.isHiddenVirtualCol = isHiddenVirtualCol; } + public ColumnInfo clone() { + return new ColumnInfo(internalName, type, tabAlias, isVirtualCol, + isHiddenVirtualCol); + } } Index: ql/src/java/org/apache/hadoop/hive/ql/exec/UnionOperator.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/UnionOperator.java (revision 1150916) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/UnionOperator.java (working copy) @@ -31,6 +31,7 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils; /** * Union Operator Just forwards. Doesn't do anything itself. @@ -55,15 +56,9 @@ */ @Override protected void initializeOp(Configuration hconf) throws HiveException { - + updateInspectors(); int parents = parentOperators.size(); - parentObjInspectors = new StructObjectInspector[parents]; - parentFields = new List[parents]; - for (int p = 0; p < parents; p++) { - parentObjInspectors[p] = (StructObjectInspector) inputObjInspectors[p]; - parentFields[p] = parentObjInspectors[p].getAllStructFieldRefs(); - } - + // Get columnNames from the first parent int columns = parentFields[0].size(); ArrayList columnNames = new ArrayList(columns); @@ -76,13 +71,10 @@ for (int c = 0; c < columns; c++) { columnTypeResolvers[c] = new ReturnObjectInspectorResolver(true); } - - for (int p = 0; p < parents; p++) { - assert (parentFields[p].size() == columns); - for (int c = 0; c < columns; c++) { - columnTypeResolvers[c].update(parentFields[p].get(c) - .getFieldObjectInspector()); - } + + List colInfos = this.getSchema().getSignature(); + for (int i = 0; i < colInfos.size(); i++) { + columnTypeResolvers[i].update(TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(colInfos.get(i).getType())); } ArrayList outputFieldOIs = new ArrayList( @@ -131,6 +123,20 @@ forward(row, inputObjInspectors[tag]); } } + + public void cleanUpInputFileChanged() throws HiveException { + updateInspectors(); + } + + private void updateInspectors() { + int parents = parentOperators.size(); + parentObjInspectors = new StructObjectInspector[parents]; + parentFields = new List[parents]; + for (int p = 0; p < parents; p++) { + parentObjInspectors[p] = (StructObjectInspector) inputObjInspectors[p]; + parentFields[p] = parentObjInspectors[p].getAllStructFieldRefs(); + } + } /** * @return the name of the operator Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (revision 1150916) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (working copy) @@ -5954,8 +5954,9 @@ + ". Column positions should match for a UNION")); } //try widening coversion, otherwise fail union - TypeInfo commonTypeInfo = FunctionRegistry.getCommonClassForComparison(lInfo.getType(), + TypeInfo commonTypeInfo = FunctionRegistry.getCommonClass(lInfo.getType(), rInfo.getType()); + if (commonTypeInfo == null) { throw new SemanticException(generateErrorMessage(tabref, "Schema of both sides of union should match: Column " + field @@ -5971,9 +5972,10 @@ String field = lEntry.getKey(); ColumnInfo lInfo = lEntry.getValue(); ColumnInfo rInfo = rightmap.get(field); - lInfo.setType(FunctionRegistry.getCommonClassForComparison(lInfo.getType(), - rInfo.getType())); - unionoutRR.put(unionalias, field, lInfo); + ColumnInfo commonInfo = lInfo.clone(); + commonInfo.setType(FunctionRegistry.getCommonClass(lInfo.getType(), + rInfo.getType())); + unionoutRR.put(unionalias, field, commonInfo); } // If one of the children is a union, merge with it