diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartitionPruner.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartitionPruner.java index c6669af..e01dc99 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartitionPruner.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartitionPruner.java @@ -56,7 +56,10 @@ import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPAnd; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPOr; +import org.apache.hadoop.hive.serde.serdeConstants; import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; +import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; /** * The transformation step that does partition pruning. @@ -189,6 +192,11 @@ static private ExprNodeDesc compactExpr(ExprNodeDesc expr) { if (expr instanceof ExprNodeConstantDesc) { if (((ExprNodeConstantDesc)expr).getValue() == null) { return null; + } else if (((ExprNodeConstantDesc)expr).getTypeInfo() instanceof PrimitiveTypeInfo && + ((PrimitiveTypeInfo)(((ExprNodeConstantDesc)expr).getTypeInfo())). + getTypeName().equals(serdeConstants.BOOLEAN_TYPE_NAME)) { + // the boolean expression can be avoided for partition pruning. + return null; } else { throw new IllegalStateException("Unexpected non-null ExprNodeConstantDesc: " + expr.getExprString()); @@ -199,8 +207,8 @@ static private ExprNodeDesc compactExpr(ExprNodeDesc expr) { if (isAnd || udf instanceof GenericUDFOPOr) { List children = expr.getChildren(); ExprNodeDesc left = children.get(0); - children.set(0, compactExpr(left)); ExprNodeDesc right = children.get(1); + children.set(0, compactExpr(left)); children.set(1, compactExpr(right)); // Note that one does not simply compact (not-null or null) to not-null. // Only if we have an "and" is it valid to send one side to metastore. @@ -235,9 +243,9 @@ static private ExprNodeDesc removeNonPartCols(ExprNodeDesc expr, List pa if (!partCols.contains(column)) { // Column doesn't appear to be a partition column for the table. return new ExprNodeConstantDesc(expr.getTypeInfo(), null); - } + } referred.add(column); - } + } if (expr instanceof ExprNodeGenericFuncDesc) { List children = expr.getChildren(); for (int i = 0; i < children.size(); ++i) { diff --git a/ql/src/test/queries/clientpositive/partition_boolexpr.q b/ql/src/test/queries/clientpositive/partition_boolexpr.q new file mode 100644 index 0000000..aa9ac2e --- /dev/null +++ b/ql/src/test/queries/clientpositive/partition_boolexpr.q @@ -0,0 +1,8 @@ +-- create testing table. +create table part_boolexpr(key int, value string) partitioned by (dt int, ts string); + +-- both the below queries should return 0 rows +select count(*) from part_boolexpr where key = 'abc'; +select * from part_boolexpr where dt = 'abc'; + + diff --git a/ql/src/test/results/clientpositive/partition_boolexpr.q.out b/ql/src/test/results/clientpositive/partition_boolexpr.q.out new file mode 100644 index 0000000..9525d6a --- /dev/null +++ b/ql/src/test/results/clientpositive/partition_boolexpr.q.out @@ -0,0 +1,29 @@ +PREHOOK: query: -- create testing table. +create table part_boolexpr(key int, value string) partitioned by (dt int, ts string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@part_boolexpr +POSTHOOK: query: -- create testing table. +create table part_boolexpr(key int, value string) partitioned by (dt int, ts string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@part_boolexpr +PREHOOK: query: -- both the below queries should return 0 rows +select count(*) from part_boolexpr where key = 'abc' +PREHOOK: type: QUERY +PREHOOK: Input: default@part_boolexpr +#### A masked pattern was here #### +POSTHOOK: query: -- both the below queries should return 0 rows +select count(*) from part_boolexpr where key = 'abc' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_boolexpr +#### A masked pattern was here #### +0 +PREHOOK: query: select * from part_boolexpr where dt = 'abc' +PREHOOK: type: QUERY +PREHOOK: Input: default@part_boolexpr +#### A masked pattern was here #### +POSTHOOK: query: select * from part_boolexpr where dt = 'abc' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@part_boolexpr +#### A masked pattern was here ####