diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 7ecada3..3da2491 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -11831,6 +11831,7 @@ public RelNode apply(RelOptCluster cluster, RelOptSchema relOptSchema, SchemaPlu optiqPreCboPlan = applyPreCBOTransforms(optiqGenPlan, HiveDefaultRelMetadataProvider.INSTANCE); List list = Lists.newArrayList(); list.add(HiveDefaultRelMetadataProvider.INSTANCE); + RelTraitSet desiredTraits = cluster.traitSetOf(HiveRel.CONVENTION, RelCollationImpl.EMPTY); if (!HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_GREEDY_JOIN_ORDER)) { planner.registerMetadataProviders(list); @@ -11846,18 +11847,15 @@ public RelNode apply(RelOptCluster cluster, RelOptSchema relOptSchema, SchemaPlu planner.addRule(HivePullUpProjectsAboveJoinRule.LEFT_PROJECT); planner.addRule(HivePullUpProjectsAboveJoinRule.RIGHT_PROJECT); planner.addRule(HiveMergeProjectRule.INSTANCE); + } - RelTraitSet desiredTraits = cluster - .traitSetOf(HiveRel.CONVENTION, RelCollationImpl.EMPTY); - - RelNode rootRel = optiqPreCboPlan; - if (!optiqPreCboPlan.getTraitSet().equals(desiredTraits)) { - rootRel = planner.changeTraits(optiqPreCboPlan, desiredTraits); - } - planner.setRoot(rootRel); - - optiqOptimizedPlan = planner.findBestExp(); + RelNode rootRel = optiqPreCboPlan; + if (!optiqPreCboPlan.getTraitSet().equals(desiredTraits)) { + rootRel = planner.changeTraits(optiqPreCboPlan, desiredTraits); } + planner.setRoot(rootRel); + + optiqOptimizedPlan = planner.findBestExp(); } else { final HepProgram hepPgm = new HepProgramBuilder().addMatchOrder(HepMatchOrder.BOTTOM_UP) .addRuleInstance(new ConvertMultiJoinRule(HiveJoinRel.class)) @@ -11869,7 +11867,12 @@ public RelNode apply(RelOptCluster cluster, RelOptSchema relOptSchema, SchemaPlu RelMetadataProvider chainedProvider = ChainedRelMetadataProvider.of(list); cluster.setMetadataProvider(new CachingRelMetadataProvider(chainedProvider, hepPlanner)); - hepPlanner.setRoot(optiqPreCboPlan); + RelNode rootRel = optiqPreCboPlan; + if (!optiqPreCboPlan.getTraitSet().equals(desiredTraits)) { + rootRel = hepPlanner.changeTraits(optiqPreCboPlan, desiredTraits); + } + hepPlanner.setRoot(rootRel); + optiqOptimizedPlan = hepPlanner.findBestExp(); }