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 {