diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java index 262dafb487..0a3ac20b4e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java @@ -180,23 +180,31 @@ public ColumnInfo get(String tab_alias, String col_alias) throws SemanticExcepti } ret = f_map.get(col_alias); } else { - boolean found = false; - String foundTbl = null; - for (Map.Entry> rslvEntry: rslvMap.entrySet()) { - String rslvKey = rslvEntry.getKey(); - LinkedHashMap cmap = rslvEntry.getValue(); - for (Map.Entry cmapEnt : cmap.entrySet()) { - if (col_alias.equalsIgnoreCase(cmapEnt.getKey())) { - /* - * We can have an unaliased and one aliased mapping to a Column. - */ - if (found && foundTbl != null && rslvKey != null) { - throw new SemanticException("Column " + col_alias - + " Found in more than One Tables/Subqueries"); + HashMap f_map = rslvMap.get(tab_alias); + // first try rslvMap directly + if (f_map != null) { + ret = f_map.get(col_alias); + } + // then try others + if (ret == null) { + boolean found = false; + String foundTbl = null; + for (Map.Entry> rslvEntry : rslvMap.entrySet()) { + String rslvKey = rslvEntry.getKey(); + LinkedHashMap cmap = rslvEntry.getValue(); + for (Map.Entry cmapEnt : cmap.entrySet()) { + if (col_alias.equalsIgnoreCase(cmapEnt.getKey())) { + /* + * We can have an unaliased and one aliased mapping to a Column. + */ + if (found && foundTbl != null && rslvKey != null) { + throw new SemanticException("Column " + col_alias + + " Found in more than One Tables/Subqueries"); + } + found = true; + foundTbl = rslvKey == null ? foundTbl : rslvKey; + ret = cmapEnt.getValue(); } - found = true; - foundTbl = rslvKey == null ? foundTbl : rslvKey; - ret = cmapEnt.getValue(); } } } @@ -460,7 +468,11 @@ public static RowResolver getCombinedRR(RowResolver leftRR, public RowResolver duplicate() { RowResolver resolver = new RowResolver(); resolver.rowSchema = new RowSchema(rowSchema); - resolver.rslvMap.putAll(rslvMap); + for (Map.Entry> entry : rslvMap.entrySet()) { + LinkedHashMap map = new LinkedHashMap<>(); + map.putAll(entry.getValue()); + resolver.rslvMap.put(entry.getKey(), map); + } resolver.invRslvMap.putAll(invRslvMap); resolver.altInvRslvMap.putAll(altInvRslvMap); resolver.expressionMap.putAll(expressionMap);