Author: hashutosh
Date: Fri Sep 19 18:48:22 2014
New Revision: 1626295

URL: http://svn.apache.org/r1626295
Log:
HIVE-8150 : [CBO] Type coercion in union queries (Ashutosh Chauhan via John 
Pullokkaran)

Modified:
    
hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Modified: 
hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: 
http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1626295&r1=1626294&r2=1626295&view=diff
==============================================================================
--- 
hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
 (original)
+++ 
hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
 Fri Sep 19 18:48:22 2014
@@ -12390,30 +12390,21 @@ public class SemanticAnalyzer extends Ba
       RelDataType leftFieldDT;
       RelDataType rightFieldDT;
       RelDataType unionFieldDT;
-      List<RelDataType> tmpDTLst = new ArrayList<RelDataType>();
       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);
-
-          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);
-          }
-
-          if (!unionFieldDT.equals(leftFieldDT))
+          unionFieldDT = 
TypeConverter.convert(unionoutRR.getColumnInfos().get(i).getType(),
+          cluster.getTypeFactory());
+          if (!unionFieldDT.equals(leftFieldDT)) {
             leftNeedsTypeCast = true;
+          }
           leftProjs.add(cluster.getRexBuilder().ensureType(unionFieldDT,
               cluster.getRexBuilder().makeInputRef(leftFieldDT, i), true));
 
-          if (!unionFieldDT.equals(rightFieldDT))
+          if (!unionFieldDT.equals(rightFieldDT)) {
             rightNeedsTypeCast = true;
+          }
           rightProjs.add(cluster.getRexBuilder().ensureType(unionFieldDT,
               cluster.getRexBuilder().makeInputRef(rightFieldDT, i), true));
         } else {


Reply via email to