diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java index 95f43d4..b6995c9 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java @@ -31,6 +31,7 @@ import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.core.Join; +import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.core.SemiJoin; import org.apache.calcite.rel.core.Sort; @@ -285,9 +286,24 @@ private QueryBlockInfo convertSource(RelNode r) throws CalciteSemanticException s = new Schema(left.schema, right.schema); ASTNode cond = join.getCondition().accept(new RexVisitor(s)); boolean semiJoin = join instanceof SemiJoin; - ast = ASTBuilder.join(left.ast, right.ast, join.getJoinType(), cond, semiJoin); - if (semiJoin) + if (join.getRight() instanceof Join) { + // Invert join inputs; this is done because otherwise the SemanticAnalyzer + // methods to merge joins will not kick in + JoinRelType type; + if (join.getJoinType() == JoinRelType.LEFT) { + type = JoinRelType.RIGHT; + } else if (join.getJoinType() == JoinRelType.RIGHT) { + type = JoinRelType.LEFT; + } else { + type = join.getJoinType(); + } + ast = ASTBuilder.join(right.ast, left.ast, type, cond, semiJoin); + } else { + ast = ASTBuilder.join(left.ast, right.ast, join.getJoinType(), cond, semiJoin); + } + if (semiJoin) { s = left.schema; + } } else if (r instanceof Union) { RelNode leftInput = ((Union) r).getInput(0); RelNode rightInput = ((Union) r).getInput(1); diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java index d8be7ff..fdf108b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java @@ -242,7 +242,8 @@ private static boolean validJoinParent(RelNode joinNode, RelNode parent) { boolean validParent = true; if (parent instanceof Join) { - if (((Join) parent).getRight() == joinNode) { + if (((Join) parent).getRight() == joinNode && + (((Join) parent).getLeft() instanceof Join) ) { validParent = false; } } else if (parent instanceof SetOp) { @@ -255,7 +256,7 @@ private static boolean validJoinParent(RelNode joinNode, RelNode parent) { private static boolean validFilterParent(RelNode filterNode, RelNode parent) { boolean validParent = true; - // TOODO: Verify GB having is not a seperate filter (if so we shouldn't + // TODO: Verify GB having is not a separate filter (if so we shouldn't // introduce derived table) if (parent instanceof Filter || parent instanceof Join || parent instanceof SetOp) {