diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java index a3fc7e7..6a43d1c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java @@ -193,11 +193,12 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, } SelectOperator selOp = (SelectOperator)tsOp.getChildren().get(0); for(ExprNodeDesc desc : selOp.getConf().getColList()) { - if (!(desc instanceof ExprNodeColumnDesc)) { + if (!((desc instanceof ExprNodeColumnDesc) || (desc instanceof ExprNodeConstantDesc))) { // Probably an expression, cant handle that return null; } } + Map exprMap = selOp.getColumnExprMap(); // Since we have done an exact match on TS-SEL-GBY-RS-GBY-SEL-FS // we need not to do any instanceof checks for following. GroupByOperator gbyOp = (GroupByOperator)selOp.getChildren().get(0); @@ -215,6 +216,12 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, return null; } + for(ExprNodeDesc desc : selOp.getConf().getColList()) { + if (!(desc instanceof ExprNodeColumnDesc)) { + // Probably an expression, cant handle that + return null; + } + } FileSinkOperator fsOp = (FileSinkOperator)(selOp.getChildren().get(0)); if (fsOp.getChildOperators() != null && fsOp.getChildOperators().size() > 0) { // looks like a subq plan. @@ -236,22 +243,28 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, GenericUDAFResolver udaf = FunctionRegistry.getGenericUDAFResolver(aggr.getGenericUDAFName()); if (udaf instanceof GenericUDAFSum) { - if(!(aggr.getParameters().get(0) instanceof ExprNodeConstantDesc)){ + ExprNodeDesc desc = aggr.getParameters().get(0); + String constant; + if (desc instanceof ExprNodeConstantDesc) { + constant = ((ExprNodeConstantDesc) desc).getValue().toString(); + } else if (desc instanceof ExprNodeColumnDesc && exprMap.get(((ExprNodeColumnDesc)desc).getColumn()) instanceof ExprNodeConstantDesc) { + constant = ((ExprNodeConstantDesc)exprMap.get(((ExprNodeColumnDesc)desc).getColumn())).getValue().toString(); + } else { return null; } Long rowCnt = getRowCnt(pctx, tsOp, tbl); if(rowCnt == null) { return null; } - oneRow.add(HiveDecimal.create(((ExprNodeConstantDesc) aggr.getParameters().get(0)) - .getValue().toString()).multiply(HiveDecimal.create(rowCnt))); + oneRow.add(HiveDecimal.create(constant).multiply(HiveDecimal.create(rowCnt))); ois.add(PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector( PrimitiveCategory.DECIMAL)); } else if (udaf instanceof GenericUDAFCount) { Long rowCnt = 0L; - if ((aggr.getParameters().isEmpty() || aggr.getParameters().get(0) instanceof - ExprNodeConstantDesc)) { + if (aggr.getParameters().isEmpty() || aggr.getParameters().get(0) instanceof + ExprNodeConstantDesc || ((aggr.getParameters().get(0) instanceof ExprNodeColumnDesc) && + exprMap.get(((ExprNodeColumnDesc)aggr.getParameters().get(0)).getColumn()) instanceof ExprNodeConstantDesc)) { // Its either count (*) or count(1) case rowCnt = getRowCnt(pctx, tsOp, tbl); if(rowCnt == null) { @@ -259,12 +272,7 @@ else if (udaf instanceof GenericUDAFCount) { } } else { // Its count(col) case - if (!(aggr.getParameters().get(0) instanceof ExprNodeColumnDesc)) { - // this is weird, we got expr or something in there, bail out - Log.debug("Unexpected expression : " + aggr.getParameters().get(0)); - return null; - } - ExprNodeColumnDesc desc = (ExprNodeColumnDesc)aggr.getParameters().get(0); + ExprNodeColumnDesc desc = (ExprNodeColumnDesc)exprMap.get(((ExprNodeColumnDesc)aggr.getParameters().get(0)).getColumn()); String colName = desc.getColumn(); StatType type = getType(desc.getTypeString()); if(!tbl.isPartitioned()) { @@ -330,7 +338,7 @@ else if (udaf instanceof GenericUDAFCount) { ois.add(PrimitiveObjectInspectorFactory. getPrimitiveJavaObjectInspector(PrimitiveCategory.LONG)); } else if (udaf instanceof GenericUDAFMax) { - ExprNodeColumnDesc colDesc = (ExprNodeColumnDesc)aggr.getParameters().get(0); + ExprNodeColumnDesc colDesc = (ExprNodeColumnDesc)exprMap.get(((ExprNodeColumnDesc)aggr.getParameters().get(0)).getColumn()); String colName = colDesc.getColumn(); StatType type = getType(colDesc.getTypeString()); if(!tbl.isPartitioned()) { @@ -419,7 +427,7 @@ else if (udaf instanceof GenericUDAFCount) { } } } else if (udaf instanceof GenericUDAFMin) { - ExprNodeColumnDesc colDesc = (ExprNodeColumnDesc)aggr.getParameters().get(0); + ExprNodeColumnDesc colDesc = (ExprNodeColumnDesc)exprMap.get(((ExprNodeColumnDesc)aggr.getParameters().get(0)).getColumn()); String colName = colDesc.getColumn(); StatType type = getType(colDesc.getTypeString()); if (!tbl.isPartitioned()) { diff --git a/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q b/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q index 09f4bff..e016ef8 100644 --- a/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q +++ b/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q @@ -46,6 +46,8 @@ explain select count(*), count(1), sum(1), sum(2), count(s), count(bo), count(bin), count(si), max(i), min(b), max(f), min(d) from stats_tbl_part where dt > 2010; select count(*), count(1), sum(1), sum(2), count(s), count(bo), count(bin), count(si), max(i), min(b), max(f), min(d) from stats_tbl_part where dt > 2010; +select count(*) from stats_tbl_part; +select count(*)/2 from stats_tbl_part; drop table stats_tbl_part; set hive.compute.query.using.stats=false; set hive.stats.dbclass=jdbc:derby; diff --git a/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out b/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out index f556c97..664e065 100644 --- a/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out +++ b/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out @@ -188,6 +188,26 @@ POSTHOOK: query: select count(*), count(1), sum(1), sum(2), count(s), count(bo), POSTHOOK: type: QUERY #### A masked pattern was here #### 2219 2219 2219 4438 2219 2219 2219 2219 65791 4294967296 99.95999908447266 0.04 +PREHOOK: query: select count(*) from stats_tbl_part +PREHOOK: type: QUERY +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from stats_tbl_part +POSTHOOK: type: QUERY +#### A masked pattern was here #### +4541 +PREHOOK: query: select count(*)/2 from stats_tbl_part +PREHOOK: type: QUERY +PREHOOK: Input: default@stats_tbl_part +PREHOOK: Input: default@stats_tbl_part@dt=2010 +PREHOOK: Input: default@stats_tbl_part@dt=2014 +#### A masked pattern was here #### +POSTHOOK: query: select count(*)/2 from stats_tbl_part +POSTHOOK: type: QUERY +POSTHOOK: Input: default@stats_tbl_part +POSTHOOK: Input: default@stats_tbl_part@dt=2010 +POSTHOOK: Input: default@stats_tbl_part@dt=2014 +#### A masked pattern was here #### +2270.5 PREHOOK: query: drop table stats_tbl_part PREHOOK: type: DROPTABLE PREHOOK: Input: default@stats_tbl_part