diff --git itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java index 654bdf8..79e4818 100644 --- itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java +++ itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java @@ -3166,6 +3166,18 @@ private void testInsertOverwrite(HiveStatement stmt) throws SQLException { } @Test + public void testUnionUniqueColumnNames() throws Exception { + HiveStatement stmt = (HiveStatement) con.createStatement(); + + stmt.execute("SET hive.resultset.use.unique.column.names=true"); + ResultSet rs = stmt.executeQuery("select 1 UNION ALL select 2"); + ResultSetMetaData metaData = rs.getMetaData(); + assertEquals("_c0", metaData.getColumnLabel(1)); + assertTrue("There's no . for the UNION column name", !metaData.getColumnLabel(1).contains(".")); + stmt.close(); + } + + @Test public void testGetQueryId() throws Exception { HiveStatement stmt = (HiveStatement) con.createStatement(); HiveStatement stmt1 = (HiveStatement) con.createStatement(); diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g index 46fa563..bf9aa39 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g @@ -747,7 +747,7 @@ import org.apache.hadoop.hive.conf.HiveConf; // counter to generate unique union aliases private int aliasCounter; private String generateUnionAlias() { - return "_u" + (++aliasCounter); + return "__u" + (++aliasCounter); } private char [] excludedCharForColumnName = {'.', ':'}; private boolean containExcludedCharForCreateTableColumnName(String input) { diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index a3da075..ff9d9dd 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -12823,7 +12823,8 @@ protected void saveViewDefinition() throws SemanticException { } qualifiedColName = rr.reverseLookup(colInfo.getInternalName()); - if (useTabAliasIfAvailable && qualifiedColName[0] != null && !qualifiedColName[0].isEmpty()) { + // __u is a UNION ALL placeholder name + if (useTabAliasIfAvailable && qualifiedColName[0] != null && (!qualifiedColName[0].isEmpty()) && (!qualifiedColName[0].startsWith("__u"))) { colName = qualifiedColName[0] + "." + qualifiedColName[1]; } else { colName = qualifiedColName[1]; diff --git ql/src/test/results/clientpositive/input_part7.q.out ql/src/test/results/clientpositive/input_part7.q.out index d1838e7..15a388e 100644 --- ql/src/test/results/clientpositive/input_part7.q.out +++ ql/src/test/results/clientpositive/input_part7.q.out @@ -184,8 +184,8 @@ STAGE PLANS: name: default.srcpart name: default.srcpart Truncated Path -> Alias: - /srcpart/ds=2008-04-08/hr=11 [a:_u1-subquery1:x, a:_u1-subquery2:y] - /srcpart/ds=2008-04-08/hr=12 [a:_u1-subquery1:x, a:_u1-subquery2:y] + /srcpart/ds=2008-04-08/hr=11 [a:__u1-subquery1:x, a:__u1-subquery2:y] + /srcpart/ds=2008-04-08/hr=12 [a:__u1-subquery1:x, a:__u1-subquery2:y] Needs Tagging: false Reduce Operator Tree: Select Operator diff --git ql/src/test/results/clientpositive/spark/optimize_nullscan.q.out ql/src/test/results/clientpositive/spark/optimize_nullscan.q.out index de3b914..c366443 100644 --- ql/src/test/results/clientpositive/spark/optimize_nullscan.q.out +++ ql/src/test/results/clientpositive/spark/optimize_nullscan.q.out @@ -599,7 +599,7 @@ STAGE PLANS: auto parallelism: false Execution mode: vectorized Path -> Alias: - nullscan://null/default.src/part_ [_u1-subquery1:src] + nullscan://null/default.src/part_ [__u1-subquery1:src] Path -> Partition: nullscan://null/default.src/part_ Partition @@ -649,7 +649,7 @@ STAGE PLANS: name: default.src name: default.src Truncated Path -> Alias: - nullscan://null/default.src/part_ [_u1-subquery1:src] + nullscan://null/default.src/part_ [__u1-subquery1:src] Map 3 Map Operator Tree: TableScan @@ -874,10 +874,10 @@ STAGE PLANS: name: default.srcpart name: default.srcpart Truncated Path -> Alias: - /srcpart/ds=2008-04-08/hr=11 [_u1-subquery2:srcpart] - /srcpart/ds=2008-04-08/hr=12 [_u1-subquery2:srcpart] - /srcpart/ds=2008-04-09/hr=11 [_u1-subquery2:srcpart] - /srcpart/ds=2008-04-09/hr=12 [_u1-subquery2:srcpart] + /srcpart/ds=2008-04-08/hr=11 [__u1-subquery2:srcpart] + /srcpart/ds=2008-04-08/hr=12 [__u1-subquery2:srcpart] + /srcpart/ds=2008-04-09/hr=11 [__u1-subquery2:srcpart] + /srcpart/ds=2008-04-09/hr=12 [__u1-subquery2:srcpart] Reducer 2 Execution mode: vectorized Needs Tagging: false @@ -1487,7 +1487,7 @@ STAGE PLANS: name: default.src name: default.src Truncated Path -> Alias: - /src [a:_u1-subquery1:src] + /src [a:__u1-subquery1:src] Map 2 Map Operator Tree: TableScan @@ -1508,7 +1508,7 @@ STAGE PLANS: auto parallelism: false Execution mode: vectorized Path -> Alias: - nullscan://null/default.src/part_ [a:_u1-subquery2:src] + nullscan://null/default.src/part_ [a:__u1-subquery2:src] Path -> Partition: nullscan://null/default.src/part_ Partition @@ -1558,7 +1558,7 @@ STAGE PLANS: name: default.src name: default.src Truncated Path -> Alias: - nullscan://null/default.src/part_ [a:_u1-subquery2:src] + nullscan://null/default.src/part_ [a:__u1-subquery2:src] Map 4 Map Operator Tree: TableScan diff --git ql/src/test/results/clientpositive/spark/union_ppr.q.out ql/src/test/results/clientpositive/spark/union_ppr.q.out index c79d7bf..14a63b7 100644 --- ql/src/test/results/clientpositive/spark/union_ppr.q.out +++ ql/src/test/results/clientpositive/spark/union_ppr.q.out @@ -164,8 +164,8 @@ STAGE PLANS: name: default.srcpart name: default.srcpart Truncated Path -> Alias: - /srcpart/ds=2008-04-08/hr=11 [a:_u1-subquery1:x] - /srcpart/ds=2008-04-08/hr=12 [a:_u1-subquery1:x] + /srcpart/ds=2008-04-08/hr=11 [a:__u1-subquery1:x] + /srcpart/ds=2008-04-08/hr=12 [a:__u1-subquery1:x] Map 3 Map Operator Tree: TableScan @@ -295,8 +295,8 @@ STAGE PLANS: name: default.srcpart name: default.srcpart Truncated Path -> Alias: - /srcpart/ds=2008-04-08/hr=11 [a:_u1-subquery2:y] - /srcpart/ds=2008-04-08/hr=12 [a:_u1-subquery2:y] + /srcpart/ds=2008-04-08/hr=11 [a:__u1-subquery2:y] + /srcpart/ds=2008-04-08/hr=12 [a:__u1-subquery2:y] Reducer 2 Execution mode: vectorized Needs Tagging: false diff --git ql/src/test/results/clientpositive/union_ppr.q.out ql/src/test/results/clientpositive/union_ppr.q.out index 606259b..89985d0 100644 --- ql/src/test/results/clientpositive/union_ppr.q.out +++ ql/src/test/results/clientpositive/union_ppr.q.out @@ -186,8 +186,8 @@ STAGE PLANS: name: default.srcpart name: default.srcpart Truncated Path -> Alias: - /srcpart/ds=2008-04-08/hr=11 [a:_u1-subquery1:x, a:_u1-subquery2:y] - /srcpart/ds=2008-04-08/hr=12 [a:_u1-subquery1:x, a:_u1-subquery2:y] + /srcpart/ds=2008-04-08/hr=11 [a:__u1-subquery1:x, a:__u1-subquery2:y] + /srcpart/ds=2008-04-08/hr=12 [a:__u1-subquery1:x, a:__u1-subquery2:y] Needs Tagging: false Reduce Operator Tree: Select Operator