Repository: hive Updated Branches: refs/heads/spark e0a5f3fd1 -> 9604e08cd
HIVE-11138: Query fails when there isn't a comparator for an operator [Spark Branch] (Rui reviewed by Chengxiang & Xuefu) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/9604e08c Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/9604e08c Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/9604e08c Branch: refs/heads/spark Commit: 9604e08cd71d5fe81bb2b9dcc18f1b8349d916db Parents: e0a5f3f Author: Rui Li <rui...@intel.com> Authored: Tue Jun 30 15:29:43 2015 +0800 Committer: Rui Li <rui...@intel.com> Committed: Tue Jun 30 15:30:14 2015 +0800 ---------------------------------------------------------------------- .../ql/optimizer/OperatorComparatorFactory.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/9604e08c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java index c6a43d9..d93bd72 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java @@ -23,6 +23,8 @@ import java.util.Map; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hive.ql.exec.CollectOperator; import org.apache.hadoop.hive.ql.exec.CommonMergeJoinOperator; import org.apache.hadoop.hive.ql.exec.DemuxOperator; @@ -72,6 +74,7 @@ import org.apache.hadoop.hive.ql.plan.UDTFDesc; public class OperatorComparatorFactory { private static final Map<Class<?>, OperatorComparator> comparatorMapping = Maps.newHashMap(); + private static final Log LOG = LogFactory.getLog(OperatorComparatorFactory.class); static { comparatorMapping.put(TableScanOperator.class, new TableScanOperatorComparator()); @@ -103,13 +106,15 @@ public class OperatorComparatorFactory { comparatorMapping.put(ListSinkOperator.class, new AlwaysTrueOperatorComparator()); comparatorMapping.put(CollectOperator.class, new AlwaysTrueOperatorComparator()); // do not support PTFOperator comparing now. - comparatorMapping.put(PTFOperator.class, new AlwaysFalseOperatorComparator()); + comparatorMapping.put(PTFOperator.class, AlwaysFalseOperatorComparator.getInstance()); } public static OperatorComparator getOperatorComparator(Class<? extends Operator> operatorClass) { OperatorComparator operatorComparator = comparatorMapping.get(operatorClass); if (operatorComparator == null) { - throw new RuntimeException("No OperatorComparator is registered for " + operatorClass.getName() + "yet."); + LOG.warn("No OperatorComparator is registered for " + operatorClass.getName() + + ". Default to always false comparator."); + return AlwaysFalseOperatorComparator.getInstance(); } return operatorComparator; @@ -130,6 +135,16 @@ public class OperatorComparatorFactory { } static class AlwaysFalseOperatorComparator implements OperatorComparator<Operator<?>> { + // the outer class is responsible for maintaining the comparator singleton + private AlwaysFalseOperatorComparator() { + } + + private static final AlwaysFalseOperatorComparator instance = + new AlwaysFalseOperatorComparator(); + + public static AlwaysFalseOperatorComparator getInstance() { + return instance; + } @Override public boolean equals(Operator<?> op1, Operator<?> op2) {