diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java index b323cb5..b7a067a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java @@ -29,6 +29,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.exec.ColumnInfo; import org.apache.hadoop.hive.ql.exec.FileSinkOperator; import org.apache.hadoop.hive.ql.exec.FilterOperator; @@ -675,6 +676,21 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx ctx, Object.. if (colList != null) { for (int i = 0; i < colList.size(); i++) { ExprNodeDesc newCol = foldExpr(colList.get(i), constants, cppCtx, op, 0, false); + if (!(colList.get(i) instanceof ExprNodeConstantDesc) && newCol instanceof ExprNodeConstantDesc) { + // Lets try to store original column name, if this column got folded + // This is useful for optimizations like GroupByOptimizer + String colName = colList.get(i).getExprString(); + if (HiveConf.getPositionFromInternalName(colName) == -1) { + // if its not an internal name, this is what we want. + ((ExprNodeConstantDesc)newCol).setFoldedFromCol(colName); + } else { + // If it was internal column, lets try to get name from columnExprMap + ExprNodeDesc desc = columnExprMap.get(colName); + if (desc instanceof ExprNodeConstantDesc) { + ((ExprNodeConstantDesc)newCol).setFoldedFromCol(((ExprNodeConstantDesc)desc).getFoldedFromCol()); + } + } + } colList.set(i, newCol); if (columnExprMap != null) { columnExprMap.put(columnNames.get(i), newCol); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GroupByOptimizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GroupByOptimizer.java index d06522f..1d18e0c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GroupByOptimizer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GroupByOptimizer.java @@ -332,18 +332,26 @@ protected GroupByOptimizerSortMatch checkSortGroupBy(Stack stack, continue; } - ExprNodeDesc selectColList = selectDesc.getColList().get(pos); - if (selectColList instanceof ExprNodeColumnDesc) { + ExprNodeDesc selectCol = selectDesc.getColList().get(pos); + if (selectCol instanceof ExprNodeColumnDesc) { String newValue = - tableColsMapping.get(((ExprNodeColumnDesc) selectColList).getColumn()); + tableColsMapping.get(((ExprNodeColumnDesc) selectCol).getColumn()); tableColsMapping.put(outputColumnName, newValue); } else { tableColsMapping.remove(outputColumnName); - if ((selectColList instanceof ExprNodeConstantDesc) || - (selectColList instanceof ExprNodeNullDesc)) { + if (selectCol instanceof ExprNodeNullDesc) { newConstantCols.add(outputColumnName); } + if (selectCol instanceof ExprNodeConstantDesc) { + // Lets see if this constant was folded because of optimization. + String origCol = ((ExprNodeConstantDesc) selectCol).getFoldedFromCol(); + if (origCol != null) { + tableColsMapping.put(outputColumnName, origCol); + } else { + newConstantCols.add(outputColumnName); + } + } } } @@ -351,7 +359,6 @@ protected GroupByOptimizerSortMatch checkSortGroupBy(Stack stack, } } - boolean sortGroupBy = true; // compute groupby columns from groupby keys List groupByCols = new ArrayList(); // If the group by expression is anything other than a list of columns, diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/Optimizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/Optimizer.java index 0a58200..bc4ad2f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/Optimizer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/Optimizer.java @@ -70,13 +70,14 @@ public void initialize(HiveConf hiveConf) { transformations.add(new ListBucketingPruner()); } } + + if (HiveConf.getBoolVar(hiveConf, HiveConf.ConfVars.HIVEOPTCONSTANTPROPAGATION)) { + transformations.add(new ConstantPropagate()); + } if (HiveConf.getBoolVar(hiveConf, HiveConf.ConfVars.HIVEOPTGROUPBY) || HiveConf.getBoolVar(hiveConf, HiveConf.ConfVars.HIVE_MAP_GROUPBY_SORT)) { transformations.add(new GroupByOptimizer()); } - if (HiveConf.getBoolVar(hiveConf, HiveConf.ConfVars.HIVEOPTCONSTANTPROPAGATION)) { - transformations.add(new ConstantPropagate()); - } transformations.add(new ColumnPruner()); if (HiveConf.getBoolVar(hiveConf, HiveConf.ConfVars.HIVE_OPTIMIZE_SKEWJOIN_COMPILETIME)) { transformations.add(new SkewJoinOptimizer());