Index: ql/src/test/results/clientnegative/semijoin3.q.out =================================================================== --- ql/src/test/results/clientnegative/semijoin3.q.out (revision 1140399) +++ ql/src/test/results/clientnegative/semijoin3.q.out (working copy) @@ -1 +1 @@ -FAILED: Error in semantic analysis: Line 2:67 Invalid table alias or column reference 'b' +FAILED: Error in semantic analysis: Line 2:67 Invalid table alias or column reference 'b': (possible column names are: _col0, _col1) Index: ql/src/test/results/clientnegative/clustern4.q.out =================================================================== --- ql/src/test/results/clientnegative/clustern4.q.out (revision 1140399) +++ ql/src/test/results/clientnegative/clustern4.q.out (working copy) @@ -1 +1 @@ -FAILED: Error in semantic analysis: Line 2:50 Invalid table alias or column reference 'key' +FAILED: Error in semantic analysis: Line 2:50 Invalid table alias or column reference 'key': (possible column names are: _col0, _col1) Index: ql/src/test/results/clientnegative/semijoin1.q.out =================================================================== --- ql/src/test/results/clientnegative/semijoin1.q.out (revision 1140399) +++ ql/src/test/results/clientnegative/semijoin1.q.out (working copy) @@ -1 +1 @@ -FAILED: Error in semantic analysis: Line 2:7 Invalid table alias or column reference 'b' +FAILED: Error in semantic analysis: Line 2:7 Invalid table alias or column reference 'b': (possible column names are: _col0, _col1) Index: ql/src/test/results/clientnegative/input2.q.out =================================================================== --- ql/src/test/results/clientnegative/input2.q.out (revision 1140399) +++ ql/src/test/results/clientnegative/input2.q.out (working copy) @@ -1 +1 @@ -FAILED: Error in semantic analysis: Line 1:7 Invalid table alias or column reference 'a' +FAILED: Error in semantic analysis: Line 1:7 Invalid table alias or column reference 'a': (possible column names are: key, value) Index: ql/src/test/results/clientnegative/semijoin4.q.out =================================================================== --- ql/src/test/results/clientnegative/semijoin4.q.out (revision 1140399) +++ ql/src/test/results/clientnegative/semijoin4.q.out (working copy) @@ -1 +1 @@ -FAILED: Error in semantic analysis: Line 2:112 Invalid table alias or column reference 'b' +FAILED: Error in semantic analysis: Line 2:112 Invalid table alias or column reference 'b': (possible column names are: _col0, _col1) Index: ql/src/test/results/clientnegative/regex_col_groupby.q.out =================================================================== --- ql/src/test/results/clientnegative/regex_col_groupby.q.out (revision 1140399) +++ ql/src/test/results/clientnegative/regex_col_groupby.q.out (working copy) @@ -1 +1 @@ -FAILED: Error in semantic analysis: Line 2:44 Invalid table alias or column reference '`..`' +FAILED: Error in semantic analysis: Line 2:44 Invalid table alias or column reference '`..`': (possible column names are: key, value, ds, hr) Index: ql/src/test/results/clientnegative/semijoin2.q.out =================================================================== --- ql/src/test/results/clientnegative/semijoin2.q.out (revision 1140399) +++ ql/src/test/results/clientnegative/semijoin2.q.out (working copy) @@ -1 +1 @@ -FAILED: Error in semantic analysis: Line 2:70 Invalid table alias or column reference 'b' +FAILED: Error in semantic analysis: Line 2:70 Invalid table alias or column reference 'b': (possible column names are: _col0, _col1) Index: ql/src/test/results/compiler/errors/unknown_column4.q.out =================================================================== --- ql/src/test/results/compiler/errors/unknown_column4.q.out (revision 1140399) +++ ql/src/test/results/compiler/errors/unknown_column4.q.out (working copy) @@ -1,2 +1,2 @@ Semantic Exception: -Line 2:83 Invalid table alias or column reference 'dummysrc' \ No newline at end of file +Line 2:83 Invalid table alias or column reference 'dummysrc': (possible column names are: key, value) \ No newline at end of file Index: ql/src/test/results/compiler/errors/unknown_column5.q.out =================================================================== --- ql/src/test/results/compiler/errors/unknown_column5.q.out (revision 1140399) +++ ql/src/test/results/compiler/errors/unknown_column5.q.out (working copy) @@ -1,2 +1,2 @@ Semantic Exception: -Line 2:60 Invalid table alias or column reference 'dummysrc' \ No newline at end of file +Line 2:60 Invalid table alias or column reference 'dummysrc': (possible column names are: key, value) \ No newline at end of file Index: ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java (revision 1140399) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java (working copy) @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Stack; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hive.ql.exec.ColumnInfo; @@ -388,8 +389,11 @@ ctx.setError(ErrorMsg.NON_KEY_EXPR_IN_GROUPBY.getMsg((ASTNode) stack.peek()), expr); return null; } else { - ctx.setError(ErrorMsg.INVALID_TABLE_OR_COLUMN.getMsg(expr - .getChild(0)), expr); + List possibleColumnNames = input.getNonHiddenColumnNames(-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), + expr); LOG.debug(ErrorMsg.INVALID_TABLE_OR_COLUMN.toString() + ":" + input.toString()); return null; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java (revision 1140399) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/RowResolver.java (working copy) @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Set; @@ -167,6 +168,26 @@ return rowSchema.getSignature(); } + /** + * Get a list of non-hidden column names + * @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(); + int count = 0; + for (ColumnInfo columnInfo : getColumnInfos()) { + if (max > 0 && count >= max) { + break; + } + if (!columnInfo.isHiddenVirtualCol()) { + columnNames.add(columnInfo.getInternalName()); + count++; + } + } + return columnNames; + } + public HashMap getFieldMap(String tabAlias) { if (tabAlias == null) { return rslvMap.get(null);