Index: ql/src/java/org/apache/hadoop/hive/ql/parse/ErrorMsg.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/ErrorMsg.java (revision 830769) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/ErrorMsg.java (working copy) @@ -104,7 +104,8 @@ CTAS_PARCOL_COEXISTENCE("CREATE-TABLE-AS-SELECT does not support partitioning in the target table."), CTAS_MULTI_LOADFILE("CREATE-TABLE-AS-SELECT results in multiple file load."), CTAS_EXTTBL_COEXISTENCE("CREATE-TABLE-AS-SELECT cannot create external table."), - TABLE_ALREADY_EXISTS("Table already exists:", "42S02"); + TABLE_ALREADY_EXISTS("Table already exists:", "42S02"), + COLUMN_ALIAS_ALREADY_EXISTS("Column alias already exists:", "42S02"); private String mesg; private String SQLState; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (revision 830769) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (working copy) @@ -1089,6 +1089,12 @@ return null; } + private void failIfColAliasExists(Set nameSet, String name) throws SemanticException { + if(nameSet.contains(name)) + throw new SemanticException(ErrorMsg.COLUMN_ALIAS_ALREADY_EXISTS.getMsg(name)); + nameSet.add(name); + } + @SuppressWarnings("nls") private Operator genScriptPlan(ASTNode trfm, QB qb, Operator input) throws SemanticException { @@ -1120,16 +1126,21 @@ ASTNode collist = (ASTNode) trfm.getChild(outputColsNum); int ccount = collist.getChildCount(); + Set colAliasNamesDuplicateCheck = new HashSet(); if (outputColNames) { for (int i=0; i < ccount; ++i) { - outputCols.add(new ColumnInfo(unescapeIdentifier(((ASTNode)collist.getChild(i)).getText()), TypeInfoFactory.stringTypeInfo, null, false)); + String colAlias = unescapeIdentifier(((ASTNode)collist.getChild(i)).getText()); + failIfColAliasExists(colAliasNamesDuplicateCheck, colAlias); + outputCols.add(new ColumnInfo(colAlias, TypeInfoFactory.stringTypeInfo, null, false)); } } else { for (int i=0; i < ccount; ++i) { ASTNode child = (ASTNode) collist.getChild(i); assert child.getType() == HiveParser.TOK_TABCOL; - outputCols.add(new ColumnInfo(unescapeIdentifier(((ASTNode)child.getChild(0)).getText()), + String colAlias = unescapeIdentifier(((ASTNode)child.getChild(0)).getText()); + failIfColAliasExists(colAliasNamesDuplicateCheck, colAlias); + outputCols.add(new ColumnInfo(colAlias, TypeInfoUtils.getTypeInfoFromTypeString(DDLSemanticAnalyzer.getTypeName(((ASTNode)child.getChild(1)).getType())), null, false)); } } Index: ql/src/test/queries/clientnegative/duplicate_alias_in_transform.q =================================================================== --- ql/src/test/queries/clientnegative/duplicate_alias_in_transform.q (revision 0) +++ ql/src/test/queries/clientnegative/duplicate_alias_in_transform.q (revision 0) @@ -0,0 +1 @@ +FROM src SELECT TRANSFORM (key, value) USING "awk -F'\001' '{print $0}'" AS (foo, foo); \ No newline at end of file Index: ql/src/test/queries/clientnegative/duplicate_alias_in_transform_schema.q =================================================================== --- ql/src/test/queries/clientnegative/duplicate_alias_in_transform_schema.q (revision 0) +++ ql/src/test/queries/clientnegative/duplicate_alias_in_transform_schema.q (revision 0) @@ -0,0 +1 @@ +FROM src SELECT TRANSFORM (key, value) USING "awk -F'\001' '{print $0}'" AS (foo STRING, foo STRING); \ No newline at end of file Index: ql/src/test/results/clientnegative/duplicate_alias_in_transform.q.out =================================================================== --- ql/src/test/results/clientnegative/duplicate_alias_in_transform.q.out (revision 0) +++ ql/src/test/results/clientnegative/duplicate_alias_in_transform.q.out (revision 0) @@ -0,0 +1 @@ +FAILED: Error in semantic analysis: Column alias already exists: foo Index: ql/src/test/results/clientnegative/duplicate_alias_in_transform_schema.q.out =================================================================== --- ql/src/test/results/clientnegative/duplicate_alias_in_transform_schema.q.out (revision 0) +++ ql/src/test/results/clientnegative/duplicate_alias_in_transform_schema.q.out (revision 0) @@ -0,0 +1 @@ +FAILED: Error in semantic analysis: Column alias already exists: foo