diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java index 0f05160..aaf2399 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java @@ -728,6 +728,15 @@ public static TypeInfo getCommonClassForUnionAll(TypeInfo a, TypeInfo b) { PrimitiveGrouping pgA = PrimitiveObjectInspectorUtils.getPrimitiveGrouping(pcA); PrimitiveGrouping pgB = PrimitiveObjectInspectorUtils.getPrimitiveGrouping(pcB); + + // untyped nulls + if (pgA == PrimitiveGrouping.VOID_GROUP) { + return b; + } + if (pgB == PrimitiveGrouping.VOID_GROUP) { + return a; + } + if (pgA != pgB) { return null; } diff --git ql/src/test/queries/clientpositive/union_null.q ql/src/test/queries/clientpositive/union_null.q index 45448b4..aacf310 100644 --- ql/src/test/queries/clientpositive/union_null.q +++ ql/src/test/queries/clientpositive/union_null.q @@ -8,3 +8,6 @@ select x from (select * from (select value as x from src order by x limit 5)a un set hive.cbo.returnpath.hiveop=false; -- HIVE-4837 select * from (select * from (select cast(null as string) as N from src1 group by key)a UNION ALL select * from (select cast(null as string) as N from src1 group by key)b ) a; + +-- HIVE-16050 +select null as c1 UNION ALL select 1 as c1; diff --git ql/src/test/results/clientpositive/union_null.q.out ql/src/test/results/clientpositive/union_null.q.out index e196ff3..00bd9d9 100644 --- ql/src/test/results/clientpositive/union_null.q.out +++ ql/src/test/results/clientpositive/union_null.q.out @@ -74,3 +74,13 @@ NULL NULL NULL NULL +PREHOOK: query: select null as c1 UNION ALL select 1 as c1 +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +POSTHOOK: query: select null as c1 UNION ALL select 1 as c1 +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +#### A masked pattern was here #### +NULL +1