diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/rules/PartitionPruner.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/rules/PartitionPruner.java index d9d94f6..a218eca 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/rules/PartitionPruner.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/rules/PartitionPruner.java @@ -24,7 +24,10 @@ import java.util.Set; import org.apache.hadoop.hive.metastore.api.FieldSchema; +import org.apache.hadoop.hive.ql.exec.FunctionRegistry; import org.apache.hadoop.hive.ql.optimizer.optiq.RelOptHiveTable; +import org.apache.hadoop.hive.ql.optimizer.optiq.translator.SqlFunctionConverter; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; import org.eigenbase.relopt.RelOptCluster; import org.eigenbase.reltype.RelDataType; import org.eigenbase.reltype.RelDataTypeField; @@ -104,6 +107,13 @@ public RexNode visitCall(RexCall call) { List args = new LinkedList(); boolean argsPruned = false; + GenericUDF hiveUDF = SqlFunctionConverter.getHiveUDF(call.getOperator(), + call.getType()); + if (hiveUDF != null && + !FunctionRegistry.isDeterministic(hiveUDF)) { + return null; + } + for (RexNode operand : call.operands) { RexNode n = operand.accept(this); if (n != null) { diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 943cc5c..92e8dc6 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -12282,6 +12282,11 @@ public RelNode applyPreCBOTransforms(RelNode basePlan, RelMetadataProvider mdPro HiveSortRel.HIVE_SORT_REL_FACTORY, HiveAggregateRel.HIVE_AGGR_REL_FACTORY, HiveUnionRel.UNION_REL_FACTORY); basePlan = fieldTrimmer.trim(basePlan); + basePlan = hepPlan(basePlan, true, mdProvider, + new PushFilterPastProjectRule(FilterRelBase.class, + HiveFilterRel.DEFAULT_FILTER_FACTORY, HiveProjectRel.class, + HiveProjectRel.DEFAULT_PROJECT_FACTORY)); + return basePlan; }