diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index f4ae684..e5dbff7 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -1170,4 +1170,5 @@ spark.query.negative.files=groupby2_map_skew_multi_distinct.q,\ groupby2_multi_distinct.q,\ groupby3_map_skew_multi_distinct.q,\ groupby3_multi_distinct.q,\ - groupby_grouping_sets7.q + groupby_grouping_sets7.q,\ + mapjoin_with_hint.q diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/ReduceSinkOperator.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/ReduceSinkOperator.java index f1df608..b989723 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/ReduceSinkOperator.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/ReduceSinkOperator.java @@ -592,11 +592,6 @@ public OperatorType getType() { return OperatorType.REDUCESINK; } - @Override - public boolean opAllowedBeforeMapJoin() { - return false; - } - public void setSkipTag(boolean value) { this.skipTag = value; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinProcessor.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinProcessor.java index 4d84f0f..2321fbd 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinProcessor.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinProcessor.java @@ -256,7 +256,7 @@ private static void checkChildOperatorType(Operator op) } } - private static void validateMapJoinTypes(Operator op) + protected static void validateMapJoinTypes(Operator op) throws SemanticException { for (Operator parentOp : op.getParentOperators()) { checkParentOperatorType(parentOp); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SparkMapJoinProcessor.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SparkMapJoinProcessor.java index 23ee3ae..3b7bf8c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SparkMapJoinProcessor.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/SparkMapJoinProcessor.java @@ -81,6 +81,11 @@ public MapJoinOperator convertMapJoin(HiveConf conf, } } + // make sure only map-joins can be performed. + if (validateMapJoinTree) { + validateMapJoinTypes(mapJoinOp); + } + return mapJoinOp; } } diff --git a/ql/src/test/queries/clientnegative/mapjoin_with_hint.q b/ql/src/test/queries/clientnegative/mapjoin_with_hint.q new file mode 100644 index 0000000..24b7b3d --- /dev/null +++ b/ql/src/test/queries/clientnegative/mapjoin_with_hint.q @@ -0,0 +1,3 @@ +set hive.ignore.mapjoin.hint=false; +SELECT /*+ MAPJOIN(b) */ * FROM src a RIGHT OUTER JOIN + (select key, value from src union all select key, value from src) b on a.key=b.key; diff --git a/ql/src/test/results/clientnegative/mapjoin_with_hint.q.out b/ql/src/test/results/clientnegative/mapjoin_with_hint.q.out new file mode 100644 index 0000000..b53b3a1 --- /dev/null +++ b/ql/src/test/results/clientnegative/mapjoin_with_hint.q.out @@ -0,0 +1 @@ +FAILED: SemanticException [Error 10057]: MAPJOIN cannot be performed with OUTER JOIN diff --git a/ql/src/test/results/clientnegative/spark/mapjoin_with_hint.q.out b/ql/src/test/results/clientnegative/spark/mapjoin_with_hint.q.out new file mode 100644 index 0000000..b53b3a1 --- /dev/null +++ b/ql/src/test/results/clientnegative/spark/mapjoin_with_hint.q.out @@ -0,0 +1 @@ +FAILED: SemanticException [Error 10057]: MAPJOIN cannot be performed with OUTER JOIN