You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2014/09/19 20:48:22 UTC

svn commit: r1626295 - /hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

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 {