diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 607e6d9..3582363 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -12388,23 +12388,16 @@ private RelNode genUnionLogicalPlan(String unionalias, String leftalias, RelNode RelDataType leftFieldDT; RelDataType rightFieldDT; RelDataType unionFieldDT; - List tmpDTLst = new ArrayList(); for (int i = 0; i < leftRowDT.size(); i++) { leftFieldDT = leftRowDT.get(i).getType(); rightFieldDT = rightRowDT.get(i).getType(); if (!leftFieldDT.equals(rightFieldDT)) { - tmpDTLst.clear(); - tmpDTLst.add(leftFieldDT); - tmpDTLst.add(rightFieldDT); - unionFieldDT = cluster.getTypeFactory().leastRestrictive(tmpDTLst); - + unionFieldDT = TypeConverter.convert(FunctionRegistry.getCommonClassForUnionAll( + TypeConverter.convert(leftFieldDT), TypeConverter.convert(rightFieldDT)),cluster.getTypeFactory()); if (null == unionFieldDT) { - //TODO : union32.q results in this, but it seems Optiq is too - // restrictive here. Follow-up with Optiq. throw new OptiqSemanticException("Can't find common type for: " - + tmpDTLst); + + leftFieldDT + "\t" +rightFieldDT); } - if (!unionFieldDT.equals(leftFieldDT)) leftNeedsTypeCast = true; leftProjs.add(cluster.getRexBuilder().ensureType(unionFieldDT,