diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrOpProcFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrOpProcFactory.java index 82da3eaf9a..a80f47a933 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrOpProcFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/pcr/PcrOpProcFactory.java @@ -134,18 +134,35 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, PcrExprProcFactory.NodeInfoWrapper wrapper = PcrExprProcFactory.walkExprTree( alias, partitions, top.getConf().getVirtualCols(), predicate); + ExprNodeDesc tableScanFilterExpr = top.getConf().getFilterExpr(); + boolean isTSHasSameExpr = false; + if(tableScanFilterExpr != null && tableScanFilterExpr.equals(predicate)) { + isTSHasSameExpr = true; + } if (wrapper.state == PcrExprProcFactory.WalkState.TRUE) { owc.getOpToRemove().add(new PcrOpWalkerCtx.OpToDeleteInfo(pop, fop)); + if(isTSHasSameExpr) { + top.getConf().setFilterExpr(null); + } } else if (wrapper.state == PcrExprProcFactory.WalkState.CONSTANT && wrapper.outExpr instanceof ExprNodeGenericFuncDesc) { ExprNodeDesc desc = ConstantPropagateProcFactory.foldExpr((ExprNodeGenericFuncDesc)wrapper.outExpr); if (desc != null && desc instanceof ExprNodeConstantDesc && Boolean.TRUE.equals(((ExprNodeConstantDesc)desc).getValue())) { owc.getOpToRemove().add(new PcrOpWalkerCtx.OpToDeleteInfo(pop, fop)); + if(isTSHasSameExpr) { + top.getConf().setFilterExpr(null); + } } else { fop.getConf().setPredicate(wrapper.outExpr); + if(isTSHasSameExpr && wrapper.outExpr instanceof ExprNodeGenericFuncDesc) { + top.getConf().setFilterExpr((ExprNodeGenericFuncDesc)wrapper.outExpr); + } } } else if (wrapper.state != PcrExprProcFactory.WalkState.FALSE) { fop.getConf().setPredicate(wrapper.outExpr); + if(isTSHasSameExpr && wrapper.outExpr instanceof ExprNodeGenericFuncDesc) { + top.getConf().setFilterExpr((ExprNodeGenericFuncDesc)wrapper.outExpr); + } } else { LOG.warn("Filter passes no row"); fop.getConf().setPredicate(wrapper.outExpr); diff --git a/ql/src/test/results/clientpositive/annotate_stats_part.q.out b/ql/src/test/results/clientpositive/annotate_stats_part.q.out index 1b98811942..bd82be8e82 100644 --- a/ql/src/test/results/clientpositive/annotate_stats_part.q.out +++ b/ql/src/test/results/clientpositive/annotate_stats_part.q.out @@ -139,7 +139,6 @@ STAGE PLANS: Processor Tree: TableScan alias: loc_orc_n4 - filterExpr: (year = '__HIVE_DEFAULT_PARTITION__') (type: boolean) Statistics: Num rows: 9 Data size: 5364 Basic stats: PARTIAL Column stats: NONE Select Operator expressions: state (type: string), locid (type: int), zip (type: bigint), '__HIVE_DEFAULT_PARTITION__' (type: string) @@ -196,7 +195,6 @@ STAGE PLANS: Processor Tree: TableScan alias: loc_orc_n4 - filterExpr: (year = '2001') (type: boolean) Statistics: Num rows: 7 Data size: 2050 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: state (type: string), locid (type: int), zip (type: bigint), '2001' (type: string) @@ -236,7 +234,6 @@ STAGE PLANS: Processor Tree: TableScan alias: loc_orc_n4 - filterExpr: (year = '__HIVE_DEFAULT_PARTITION__') (type: boolean) Statistics: Num rows: 1 Data size: 292 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: state (type: string), locid (type: int), zip (type: bigint), '__HIVE_DEFAULT_PARTITION__' (type: string) @@ -295,7 +292,6 @@ STAGE PLANS: Processor Tree: TableScan alias: loc_orc_n4 - filterExpr: (year) IN ('2001', '__HIVE_DEFAULT_PARTITION__') (type: boolean) Statistics: Num rows: 8 Data size: 3814 Basic stats: COMPLETE Column stats: PARTIAL Select Operator expressions: state (type: string), locid (type: int), zip (type: bigint), year (type: string) @@ -481,7 +477,6 @@ STAGE PLANS: Processor Tree: TableScan alias: loc_orc_n4 - filterExpr: (year = '2001') (type: boolean) Statistics: Num rows: 7 Data size: 630 Basic stats: COMPLETE Column stats: COMPLETE Select Operator expressions: state (type: string), locid (type: int) @@ -509,7 +504,6 @@ STAGE PLANS: Processor Tree: TableScan alias: loc_orc_n4 - filterExpr: (year <> '2001') (type: boolean) Statistics: Num rows: 1 Data size: 284 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: state (type: string), locid (type: int) @@ -566,7 +560,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: loc_orc_n4 - filterExpr: ((locid > 0) and (year = '2001')) (type: boolean) + filterExpr: (locid > 0) (type: boolean) Statistics: Num rows: 7 Data size: 28 Basic stats: COMPLETE Column stats: COMPLETE Filter Operator predicate: (locid > 0) (type: boolean) @@ -610,7 +604,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: loc_orc_n4 - filterExpr: ((locid > 0) and (year = '2001')) (type: boolean) + filterExpr: (locid > 0) (type: boolean) Statistics: Num rows: 7 Data size: 28 Basic stats: COMPLETE Column stats: COMPLETE Filter Operator predicate: (locid > 0) (type: boolean) @@ -654,7 +648,7 @@ STAGE PLANS: Map Operator Tree: TableScan alias: loc_orc_n4 - filterExpr: ((locid > 0) and (year = '2001')) (type: boolean) + filterExpr: (locid > 0) (type: boolean) Statistics: Num rows: 7 Data size: 28 Basic stats: COMPLETE Column stats: COMPLETE Filter Operator predicate: (locid > 0) (type: boolean)