Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (revision 1070220) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (working copy) @@ -1798,17 +1798,21 @@ String tabAlias = null; String[] colRef = new String[2]; + ASTNode root = (ASTNode) selExpr.getChild(0); if (selExpr.getChildCount() == 2) { - // return zz for "xx + yy AS zz" - colAlias = unescapeIdentifier(selExpr.getChild(1).getText()); - colRef[0] = tabAlias; - colRef[1] = colAlias; - return colRef; + // continue if xx.yy as zz + if (root.getType() != HiveParser.DOT) { + // return zz for "xx + yy AS zz" + colAlias = unescapeIdentifier(selExpr.getChild(1).getText()); + colRef[0] = tabAlias; + colRef[1] = colAlias; + return colRef; + } } - ASTNode root = (ASTNode) selExpr.getChild(0); + if (root.getType() == HiveParser.TOK_TABLE_OR_COL) { - colAlias = root.getChild(0).getText(); + colAlias = unescapeIdentifier(root.getChild(0).getText()); colRef[0] = tabAlias; colRef[1] = colAlias; return colRef; @@ -2223,6 +2227,8 @@ RowResolver groupByInputRowResolver = opParseCtx .get(reduceSinkOperatorInfo).getRowResolver(); RowResolver groupByOutputRowResolver = new RowResolver(); + groupByOutputRowResolver.setTableAlias( + groupByInputRowResolver.getTableAliases()); groupByOutputRowResolver.setIsExprResolver(true); ArrayList groupByKeys = new ArrayList(); ArrayList aggregations = new ArrayList(); @@ -2618,6 +2624,8 @@ .getRowResolver(); QBParseInfo parseInfo = qb.getParseInfo(); RowResolver reduceSinkOutputRowResolver = new RowResolver(); + reduceSinkOutputRowResolver.setTableAlias( + reduceSinkInputRowResolver.getTableAliases()); reduceSinkOutputRowResolver.setIsExprResolver(true); Map colExprMap = new HashMap(); ArrayList reduceKeys = new ArrayList(); @@ -6285,6 +6293,8 @@ } } + + // generate map reduce plans GenMRProcContext procCtx = new GenMRProcContext( conf, Index: ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java (revision 1070220) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java (working copy) @@ -24,6 +24,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -41,6 +42,10 @@ private HashMap invRslvMap; private Map expressionMap; + private ArrayList tableAliases; + private final HashMap columnAliases; + private final HashMap tableNameToAlias; + private final HashMap columnNameToAlias; // TODO: Refactor this and do in a more object oriented manner private boolean isExprResolver; @@ -53,6 +58,10 @@ rslvMap = new HashMap>(); invRslvMap = new HashMap(); expressionMap = new HashMap(); + tableAliases = new ArrayList(); + columnAliases = new HashMap(); + tableNameToAlias = new HashMap(); + columnNameToAlias = new HashMap(); isExprResolver = false; } @@ -110,9 +119,43 @@ } public boolean hasTableAlias(String tab_alias) { - return rslvMap.get(tab_alias.toLowerCase()) != null; + return rslvMap.get(tab_alias.toLowerCase()) != null + || tableAliases.contains(tab_alias); } + public boolean hasColumnAlias(String col_alias) { + return columnAliases.get(col_alias) != null; + } + + public ColumnInfo getColumnByAlias(String alias) throws SemanticException { + String col = columnAliases.get(alias); + if(col == null) { + return null; + } + StringTokenizer st = new StringTokenizer(col, "."); + if( st.countTokens() != 2) { + return null; + } + String tableAlias = st.nextToken(); + String columnAlias = st.nextToken(); + return get(tableAlias, columnAlias); + } + + public ColumnInfo getColumnByName(String name) throws SemanticException { + return null; + } + public ArrayList getTableAliases() { + for( String alias : rslvMap.keySet()) { + if( alias != "" && alias != null && !tableAliases.contains(alias)) { + tableAliases.add(alias); + } + } + return tableAliases; + } + + public void setTableAlias(ArrayList tableAliases) { + this.tableAliases = tableAliases; + } /** * Gets the column Info to tab_alias.col_alias type of a column reference. I * the tab_alias is not provided as can be the case with an non aliased