diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java index 214b376..200c540 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java @@ -22,6 +22,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -169,23 +170,46 @@ public class RowResolver implements Serializable{ } /** - * Get a list of non-hidden column names + * Get a list of aliases for non-hidden columns * @param max the maximum number of columns to return * @return a list of non-hidden column names no greater in size than max */ - public List getNonHiddenColumnNames(int max) { - List columnNames = new ArrayList(); + public List getReferenceableColumnAliases(String tableAlias, int max) { int count = 0; - for (ColumnInfo columnInfo : getColumnInfos()) { - if (max > 0 && count >= max) { - break; + Set columnNames = new LinkedHashSet (); + + int tables = rslvMap.size(); + + Map mapping = rslvMap.get(tableAlias); + if (mapping != null) { + for (Map.Entry entry : mapping.entrySet()) { + if (max > 0 && count >= max) { + break; + } + ColumnInfo columnInfo = entry.getValue(); + if (!columnInfo.isHiddenVirtualCol()) { + columnNames.add(entry.getKey()); + count++; + } } - if (!columnInfo.isHiddenVirtualCol()) { - columnNames.add(columnInfo.getInternalName()); - count++; + } else { + for (ColumnInfo columnInfo : getColumnInfos()) { + if (max > 0 && count >= max) { + break; + } + if (!columnInfo.isHiddenVirtualCol()) { + String[] inverse = !isExprResolver ? reverseLookup(columnInfo.getInternalName()) : null; + if (inverse != null) { + columnNames.add(inverse[0] == null || tables <= 1 ? inverse[1] : + inverse[0] + "." + inverse[1]); + } else { + columnNames.add(columnInfo.getAlias()); + } + count++; + } } } - return columnNames; + return new ArrayList(columnNames); } public HashMap getFieldMap(String tabAlias) { diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java index fe5441d..9f630d0 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -433,7 +433,7 @@ public final class TypeCheckProcFactory { ctx.setError(ErrorMsg.NON_KEY_EXPR_IN_GROUPBY.getMsg(exprNode), expr); return null; } else { - List possibleColumnNames = input.getNonHiddenColumnNames(-1); + List possibleColumnNames = input.getReferenceableColumnAliases(tableOrCol, -1); String reason = String.format("(possible column names are: %s)", StringUtils.join(possibleColumnNames, ", ")); ctx.setError(ErrorMsg.INVALID_TABLE_OR_COLUMN.getMsg(expr.getChild(0), reason), diff --git ql/src/test/results/clientnegative/clustern4.q.out ql/src/test/results/clientnegative/clustern4.q.out index ef624aa..5c1c71f 100644 --- ql/src/test/results/clientnegative/clustern4.q.out +++ ql/src/test/results/clientnegative/clustern4.q.out @@ -1 +1 @@ -FAILED: SemanticException [Error 10004]: Line 2:50 Invalid table alias or column reference 'key': (possible column names are: _col0, _col1) +FAILED: SemanticException [Error 10004]: Line 2:50 Invalid table alias or column reference 'key': (possible column names are: k1, x.value) diff --git ql/src/test/results/clientnegative/semijoin1.q.out ql/src/test/results/clientnegative/semijoin1.q.out index 21031a9..b7a3215 100644 --- ql/src/test/results/clientnegative/semijoin1.q.out +++ ql/src/test/results/clientnegative/semijoin1.q.out @@ -1 +1 @@ -FAILED: SemanticException [Error 10004]: Line 2:7 Invalid table alias or column reference 'b': (possible column names are: _col0, _col1) +FAILED: SemanticException [Error 10004]: Line 2:7 Invalid table alias or column reference 'b': (possible column names are: key, value) diff --git ql/src/test/results/clientnegative/semijoin2.q.out ql/src/test/results/clientnegative/semijoin2.q.out index 8c9d5f6..731a39f 100644 --- ql/src/test/results/clientnegative/semijoin2.q.out +++ ql/src/test/results/clientnegative/semijoin2.q.out @@ -1 +1 @@ -FAILED: SemanticException [Error 10004]: Line 2:70 Invalid table alias or column reference 'b': (possible column names are: _col0, _col1) +FAILED: SemanticException [Error 10004]: Line 2:70 Invalid table alias or column reference 'b': (possible column names are: key, value) diff --git ql/src/test/results/clientnegative/semijoin3.q.out ql/src/test/results/clientnegative/semijoin3.q.out index ba5f5fc..0e096f6 100644 --- ql/src/test/results/clientnegative/semijoin3.q.out +++ ql/src/test/results/clientnegative/semijoin3.q.out @@ -1 +1 @@ -FAILED: SemanticException [Error 10004]: Line 2:67 Invalid table alias or column reference 'b': (possible column names are: _col0, _col1) +FAILED: SemanticException [Error 10004]: Line 2:67 Invalid table alias or column reference 'b': (possible column names are: key, value) diff --git ql/src/test/results/clientnegative/semijoin4.q.out ql/src/test/results/clientnegative/semijoin4.q.out index 25ac9bf..75d9c8e 100644 --- ql/src/test/results/clientnegative/semijoin4.q.out +++ ql/src/test/results/clientnegative/semijoin4.q.out @@ -1 +1 @@ -FAILED: SemanticException [Error 10004]: Line 2:112 Invalid table alias or column reference 'b': (possible column names are: _col0, _col1) +FAILED: SemanticException [Error 10004]: Line 2:112 Invalid table alias or column reference 'b': (possible column names are: key, value)