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,10 @@ 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 errorMsgAppend = String.format("'%s' (possible column names are: %s)", + expr.getChild(0), StringUtils.join(possibleColumnNames, ", ")); + ctx.setError(ErrorMsg.INVALID_TABLE_OR_COLUMN.getMsg(errorMsgAppend), 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);