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..9c91ee67b8 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 @@ -1924,9 +1924,6 @@ private RelNode applyPreJoinOrderingTransforms(RelNode basePlan, RelMetadataProv rules.add(new HiveFilterAggregateTransposeRule(Filter.class, HiveRelFactories.HIVE_BUILDER, Aggregate.class)); rules.add(new FilterMergeRule(HiveRelFactories.HIVE_BUILDER)); - if (conf.getBoolVar(HiveConf.ConfVars.HIVE_OPTIMIZE_REDUCE_WITH_STATS)) { - rules.add(HiveReduceExpressionsWithStatsRule.INSTANCE); - } rules.add(HiveProjectFilterPullUpConstantsRule.INSTANCE); rules.add(HiveReduceExpressionsRule.PROJECT_INSTANCE); rules.add(HiveReduceExpressionsRule.FILTER_INSTANCE); @@ -1990,6 +1987,8 @@ private RelNode applyPreJoinOrderingTransforms(RelNode basePlan, RelMetadataProv new HivePartitionPruneRule(conf)); // 7. Projection Pruning (this introduces select above TS & hence needs to be run last due to PP) + // note that HiveFieldTrimmerRule also caches column stats in single metastore call + // for join ordering and for later transformationsn to use generatePartialProgram(program, false, HepMatchOrder.TOP_DOWN, new HiveFieldTrimmerRule(true)); @@ -1998,10 +1997,18 @@ private RelNode applyPreJoinOrderingTransforms(RelNode basePlan, RelMetadataProv // storage (incase there are filters on non partition cols). This only // matches FIL-PROJ-TS // Also merge, remove and reduce Project if possible + List postTrimmerRules = Lists.newArrayList(); + if (conf.getBoolVar(HiveConf.ConfVars.HIVE_OPTIMIZE_REDUCE_WITH_STATS)) { + postTrimmerRules.add(HiveReduceExpressionsWithStatsRule.INSTANCE); + } + postTrimmerRules.add(HiveFilterProjectTSTransposeRule.INSTANCE); + postTrimmerRules.add(HiveFilterProjectTSTransposeRule.INSTANCE_DRUID); + postTrimmerRules.add(HiveProjectFilterPullUpConstantsRule.INSTANCE); + postTrimmerRules.add(HiveProjectMergeRule.INSTANCE); + postTrimmerRules.add(ProjectRemoveRule.INSTANCE); + postTrimmerRules.add(HiveSortMergeRule.INSTANCE); generatePartialProgram(program, true, HepMatchOrder.TOP_DOWN, - HiveFilterProjectTSTransposeRule.INSTANCE, HiveFilterProjectTSTransposeRule.INSTANCE_DRUID, - HiveProjectFilterPullUpConstantsRule.INSTANCE, HiveProjectMergeRule.INSTANCE, - ProjectRemoveRule.INSTANCE, HiveSortMergeRule.INSTANCE); + postTrimmerRules.toArray(new RelOptRule[postTrimmerRules.size()])); // 9. Get rid of sq_count_check if group by key is constant if (conf.getBoolVar(ConfVars.HIVE_REMOVE_SQ_COUNT_CHECK)) { diff --git a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java index 736c2b0d80..ee555a815c 100644 --- a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java +++ b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java @@ -2564,6 +2564,9 @@ public void flushCache() { @Override public List getTableColumnStatistics(String catName, String dbName, String tableName, List colNames, String engine) throws TException { + if(colNames.isEmpty()) { + return Collections.emptyList(); + } TableStatsRequest rqst = new TableStatsRequest(dbName, tableName, colNames, engine); rqst.setCatName(catName); rqst.setEngine(engine);