Author: hashutosh
Date: Fri Sep 19 15:10:37 2014
New Revision: 1626244

URL: http://svn.apache.org/r1626244
Log:
HIVE-7359 : Stats based compute query replies fail to do simple column 
transforms (Ashutosh Chauhan via Gopal V)

Modified:
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java
    
hive/trunk/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q
    
hive/trunk/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java?rev=1626244&r1=1626243&r2=1626244&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java 
(original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/StatsOptimizer.java 
Fri Sep 19 15:10:37 2014
@@ -193,11 +193,12 @@ public class StatsOptimizer implements T
         }
         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<String, ExprNodeDesc> 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 class StatsOptimizer implements T
           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 class StatsOptimizer implements T
           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 @@ public class StatsOptimizer implements T
               }
             } 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 @@ public class StatsOptimizer implements T
             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 @@ public class StatsOptimizer implements T
               }
             }
           }  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()) {

Modified: 
hive/trunk/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q?rev=1626244&r1=1626243&r2=1626244&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q
 (original)
+++ 
hive/trunk/ql/src/test/queries/clientpositive/metadata_only_queries_with_filters.q
 Fri Sep 19 15:10:37 2014
@@ -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;

Modified: 
hive/trunk/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out?rev=1626244&r1=1626243&r2=1626244&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out
 (original)
+++ 
hive/trunk/ql/src/test/results/clientpositive/metadata_only_queries_with_filters.q.out
 Fri Sep 19 15:10:37 2014
@@ -188,6 +188,26 @@ POSTHOOK: query: select count(*), count(
 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


Reply via email to