diff --git a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java index b2dd2ab..9818446 100644 --- a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java +++ b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java @@ -1645,7 +1645,7 @@ public void testResultSetMetaData() throws SQLException { assertEquals(meta.getPrecision(12), colRS.getInt("COLUMN_SIZE")); assertEquals(meta.getScale(12), colRS.getInt("DECIMAL_DIGITS")); - assertEquals("_c12", meta.getColumnName(13)); + assertEquals("c12_1", meta.getColumnName(13)); assertEquals(Types.INTEGER, meta.getColumnType(13)); assertEquals("int", meta.getColumnTypeName(13)); assertEquals(11, meta.getColumnDisplaySize(13)); @@ -1756,6 +1756,32 @@ public void testResultSetMetaData() throws SQLException { } } + @Test + public void testResultSetMetaDataDuplicateColumnNames() throws SQLException { + Statement stmt = con.createStatement(); + + ResultSet res = stmt.executeQuery("select c1 as c2_1, c2, c1*2 from " + + dataTypeTableName + " limit 1"); + ResultSetMetaData meta = res.getMetaData(); + + ResultSet colRS = con.getMetaData().getColumns(null, null, + dataTypeTableName.toLowerCase(), null); + + assertEquals(3, meta.getColumnCount()); + + assertTrue(colRS.next()); + + assertEquals("c2_1", meta.getColumnName(1)); + + assertTrue(colRS.next()); + + assertEquals("c2", meta.getColumnName(2)); + + assertTrue(colRS.next()); + + assertEquals("c2_2", meta.getColumnName(3)); + + } // [url] [host] [port] [db] private static final String[][] URL_PROPERTIES = new String[][] { // binary mode diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java index 16a375c..042e994 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/PlanModifierForASTConv.java @@ -190,6 +190,7 @@ public static RelNode renameTopLevelSelectInResultSchema(final RelNode rootRel, colAlias = resultSchema.get(i).getName(); if (colAlias.startsWith("_")) { colAlias = colAlias.substring(1); + colAlias = getNewColAlias(newSelAliases, colAlias); } newSelAliases.add(colAlias); } @@ -204,6 +205,16 @@ public static RelNode renameTopLevelSelectInResultSchema(final RelNode rootRel, return rootRel; } } + + private static String getNewColAlias(List newSelAliases, String colAlias) { + int index = 1; + String newColAlias = colAlias; + while (newSelAliases.contains(newColAlias)) { + //This means that the derived colAlias collides with existing ones. + newColAlias = colAlias + "_" + (index++); + } + return newColAlias; + } private static RelNode introduceDerivedTable(final RelNode rel) { List projectList = HiveCalciteUtil.getProjsFromBelowAsInputRef(rel);