diff --git common/src/java/org/apache/hadoop/hive/conf/HiveConf.java common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index 2693663..c4eb495 100644 --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -1073,7 +1073,7 @@ public class HiveConf extends Configuration { } public static int getPositionFromInternalName(String internalName) { - Pattern internalPattern = Pattern.compile("_col([0-9]+)"); + Pattern internalPattern = Pattern.compile(".*_col([0-9]+)"); Matcher m = internalPattern.matcher(internalName); if (!m.matches()){ return -1; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 33ce6ca..de1b573 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -165,6 +165,7 @@ import org.apache.hadoop.hive.serde2.Deserializer; import org.apache.hadoop.hive.serde2.MetadataTypedColumnsetSerDe; import org.apache.hadoop.hive.serde2.SerDeException; import org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe; +import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category; import org.apache.hadoop.hive.serde2.objectinspector.StructField; @@ -2512,12 +2513,14 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { // get the last colName for the reduce KEY // it represents the column name corresponding to distinct aggr, if any String lastKeyColName = null; + List reduceValues = null; if (reduceSinkOperatorInfo.getConf() instanceof ReduceSinkDesc) { List inputKeyCols = ((ReduceSinkDesc) reduceSinkOperatorInfo.getConf()).getOutputKeyColumnNames(); if (inputKeyCols.size() > 0) { lastKeyColName = inputKeyCols.get(inputKeyCols.size()-1); } + reduceValues = ((ReduceSinkDesc)reduceSinkOperatorInfo.getConf()).getValueCols(); } int numDistinctUDFs = 0; for (Map.Entry entry : aggregationTrees.entrySet()) { @@ -2539,6 +2542,12 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { throw new SemanticException(ErrorMsg.INVALID_COLUMN.getMsg(paraExpr)); } + ExprNodeDesc reduceValue = null; + int pos = getPositionFromInternalName(paraExprInfo.getInternalName()); + if (reduceValues != null && pos >=0 && pos < reduceValues.size()) { + reduceValue = reduceValues.get(pos); + } + String paraExpression = paraExprInfo.getInternalName(); assert (paraExpression != null); if (isDistinct && lastKeyColName != null) { @@ -2549,9 +2558,14 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { getColumnInternalName(i-1); } - aggParameters.add(new ExprNodeColumnDesc(paraExprInfo.getType(), - paraExpression, paraExprInfo.getTabAlias(), - paraExprInfo.getIsVirtualCol())); + if (reduceValue.getWritableObjectInspector() instanceof ConstantObjectInspector) { + // this parameter is a constant + aggParameters.add(reduceValue); + } else { + aggParameters.add(new ExprNodeColumnDesc(paraExprInfo.getType(), + paraExpression, paraExprInfo.getTabAlias(), + paraExprInfo.getIsVirtualCol())); + } } if (isDistinct) { @@ -2637,12 +2651,14 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { // get the last colName for the reduce KEY // it represents the column name corresponding to distinct aggr, if any String lastKeyColName = null; + List reduceValues = null; if (reduceSinkOperatorInfo.getConf() instanceof ReduceSinkDesc) { List inputKeyCols = ((ReduceSinkDesc) reduceSinkOperatorInfo.getConf()).getOutputKeyColumnNames(); if (inputKeyCols.size() > 0) { lastKeyColName = inputKeyCols.get(inputKeyCols.size()-1); } + reduceValues = ((ReduceSinkDesc)reduceSinkOperatorInfo.getConf()).getValueCols(); } int numDistinctUDFs = 0; for (Map.Entry entry : aggregationTrees.entrySet()) { @@ -2673,6 +2689,12 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { .getMsg(paraExpr)); } + ExprNodeDesc reduceValue = null; + int pos = getPositionFromInternalName(paraExprInfo.getInternalName()); + if (reduceValues != null && pos >=0 && pos < reduceValues.size()) { + reduceValue = reduceValues.get(pos); + } + String paraExpression = paraExprInfo.getInternalName(); assert (paraExpression != null); if (isDistinct && lastKeyColName != null) { @@ -2683,9 +2705,14 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { + getColumnInternalName(i-1); } - aggParameters.add(new ExprNodeColumnDesc(paraExprInfo.getType(), - paraExpression, paraExprInfo.getTabAlias(), - paraExprInfo.getIsVirtualCol())); + if (reduceValue.getWritableObjectInspector() instanceof ConstantObjectInspector) { + // this parameter is a constant + aggParameters.add(reduceValue); + } else { + aggParameters.add(new ExprNodeColumnDesc(paraExprInfo.getType(), + paraExpression, paraExprInfo.getTabAlias(), + paraExprInfo.getIsVirtualCol())); + } } } else { ColumnInfo paraExprInfo = groupByInputRowResolver.getExpression(value);