diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFieldTrimmerRule.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFieldTrimmerRule.java index ac050df30b..918c1fefee 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFieldTrimmerRule.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFieldTrimmerRule.java @@ -24,8 +24,12 @@ import org.apache.calcite.plan.hep.HepProgramBuilder; import org.apache.calcite.plan.hep.HepRelVertex; import org.apache.calcite.rel.RelNode; +import org.apache.hadoop.hive.ql.metadata.*; import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelFactories; +import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.*; +import org.apache.hadoop.hive.ql.parse.*; +import java.util.*; /** * Rule that triggers the field trimmer on the root of a plan. @@ -39,10 +43,16 @@ private final boolean fetchStats; private boolean triggered; - public HiveFieldTrimmerRule(boolean fetchStats) { + private ColumnAccessInfo columnAccessInfo; + private Map viewProjectToTableSchema; + + public HiveFieldTrimmerRule(boolean fetchStats, ColumnAccessInfo columnAccessInfo, + Map viewToTableSchema) { super(operand(RelNode.class, any()), HiveRelFactories.HIVE_BUILDER, "HiveFieldTrimmerRule"); this.fetchStats = fetchStats; + this.columnAccessInfo = columnAccessInfo; + this.viewProjectToTableSchema = viewToTableSchema; triggered = false; } @@ -64,7 +74,8 @@ public void onMatch(RelOptRuleCall call) { tmpPlanner.setRoot(node); node = tmpPlanner.findBestExp(); final HiveRelFieldTrimmer fieldTrimmer = new HiveRelFieldTrimmer(null, - relBuilderFactory.create(node.getCluster(), null), fetchStats); + relBuilderFactory.create(node.getCluster(), null), + columnAccessInfo, viewProjectToTableSchema, fetchStats); call.transformTo(fieldTrimmer.trim(node)); triggered = true; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java index 9bf42ed384..c9faf93798 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveRelFieldTrimmer.java @@ -89,8 +89,8 @@ public HiveRelFieldTrimmer(SqlValidator validator, RelBuilder relBuilder) { } public HiveRelFieldTrimmer(SqlValidator validator, RelBuilder relBuilder, - ColumnAccessInfo columnAccessInfo, Map viewToTableSchema) { - this(validator, relBuilder, false); + ColumnAccessInfo columnAccessInfo, Map viewToTableSchema, boolean fetchStats) { + this(validator, relBuilder, fetchStats); this.columnAccessInfo = columnAccessInfo; this.viewProjectToTableSchema = viewToTableSchema; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java index ea5fa3f4c3..b7269ff46b 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java @@ -1779,12 +1779,12 @@ public RelNode apply(RelOptCluster cluster, RelOptSchema relOptSchema, SchemaPlu RexExecutor executorProvider = new HiveRexExecutorImpl(optCluster); calciteGenPlan.getCluster().getPlanner().setExecutor(executorProvider); - // We need to get the ColumnAccessInfo and viewToTableSchema for views. + /*// We need to get the ColumnAccessInfo and viewToTableSchema for views. HiveRelFieldTrimmer fieldTrimmer = new HiveRelFieldTrimmer(null, HiveRelFactories.HIVE_BUILDER.create(optCluster, null), this.columnAccessInfo, this.viewProjectToTableSchema); - fieldTrimmer.trim(calciteGenPlan); + fieldTrimmer.trim(calciteGenPlan); */ // Create and set MD provider HiveDefaultRelMetadataProvider mdProvider = new HiveDefaultRelMetadataProvider(conf); @@ -1991,7 +1991,7 @@ private RelNode applyPreJoinOrderingTransforms(RelNode basePlan, RelMetadataProv // 7. Projection Pruning (this introduces select above TS & hence needs to be run last due to PP) generatePartialProgram(program, false, HepMatchOrder.TOP_DOWN, - new HiveFieldTrimmerRule(true)); + new HiveFieldTrimmerRule(true, this.columnAccessInfo, this.viewProjectToTableSchema)); // 8. Rerun PPD through Project as column pruning would have introduced // DT above scans; By pushing filter just above TS, Hive can push it into @@ -2361,7 +2361,7 @@ private RelNode applyPostJoinOrderingTransform(RelNode basePlan, RelMetadataProv // The previous rules can pull up projections through join operators, // thus we run the field trimmer again to push them back down generatePartialProgram(program, false, HepMatchOrder.TOP_DOWN, - new HiveFieldTrimmerRule(false)); + new HiveFieldTrimmerRule(true, this.columnAccessInfo, this.viewProjectToTableSchema)); generatePartialProgram(program, false, HepMatchOrder.DEPTH_FIRST, ProjectRemoveRule.INSTANCE, new ProjectMergeRule(false, HiveRelFactories.HIVE_BUILDER)); generatePartialProgram(program, true, HepMatchOrder.TOP_DOWN,