diff --git data/files/data_with_union.txt data/files/data_with_union.txt new file mode 100644 index 0000000000..dd1e7f982a --- /dev/null +++ data/files/data_with_union.txt @@ -0,0 +1 @@ +0102111foo diff --git itests/src/test/resources/testconfiguration.properties itests/src/test/resources/testconfiguration.properties index e7c3e432ee..0f94fd808b 100644 --- itests/src/test/resources/testconfiguration.properties +++ itests/src/test/resources/testconfiguration.properties @@ -2706,6 +2706,7 @@ minillaplocal.query.files=\ reloadJar.q,\ remove_exprs_stats.q,\ router_join_ppr.q,\ + row_deserialize_with_union,\ runtime_skewjoin_mapjoin_spark.q,\ sample3.q,\ sample5.q,\ diff --git ql/src/test/queries/clientpositive/row_deserialize_with_union.q ql/src/test/queries/clientpositive/row_deserialize_with_union.q new file mode 100644 index 0000000000..cb7d2aa48f --- /dev/null +++ ql/src/test/queries/clientpositive/row_deserialize_with_union.q @@ -0,0 +1,17 @@ +SET hive.vectorized.execution.enabled=true; +set hive.vectorized.use.row.serde.deserialize=true; +set hive.vectorized.use.vector.serde.deserialize=false; +dfs ${system:test.dfs.mkdir} ${system:test.tmp.dir}/data_with_union/; +dfs -copyFromLocal ../../data/files/data_with_union.txt ${system:test.tmp.dir}/data_with_union/data_with_union.txt; + +CREATE EXTERNAL TABLE data_with_union( + unionfield uniontype, + arrayfield array, + mapfield map, + structfield struct<`sf1`:int, `sf2`:string>) +stored as textfile +location '${system:test.tmp.dir}/data_with_union'; + +create table data_with_union_2 as select * from data_with_union; + +select * from data_with_union_2; \ No newline at end of file diff --git ql/src/test/results/clientpositive/llap/row_deserialize_with_union.q.out ql/src/test/results/clientpositive/llap/row_deserialize_with_union.q.out new file mode 100644 index 0000000000..cc0ba5c060 --- /dev/null +++ ql/src/test/results/clientpositive/llap/row_deserialize_with_union.q.out @@ -0,0 +1,45 @@ +PREHOOK: query: CREATE EXTERNAL TABLE data_with_union( + unionfield uniontype, + arrayfield array, + mapfield map, + structfield struct<`sf1`:int, `sf2`:string>) +stored as textfile +#### A masked pattern was here #### +PREHOOK: type: CREATETABLE +#### A masked pattern was here #### +PREHOOK: Output: database:default +PREHOOK: Output: default@data_with_union +POSTHOOK: query: CREATE EXTERNAL TABLE data_with_union( + unionfield uniontype, + arrayfield array, + mapfield map, + structfield struct<`sf1`:int, `sf2`:string>) +stored as textfile +#### A masked pattern was here #### +POSTHOOK: type: CREATETABLE +#### A masked pattern was here #### +POSTHOOK: Output: database:default +POSTHOOK: Output: default@data_with_union +PREHOOK: query: create table data_with_union_2 as select * from data_with_union +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@data_with_union +PREHOOK: Output: database:default +PREHOOK: Output: default@data_with_union_2 +POSTHOOK: query: create table data_with_union_2 as select * from data_with_union +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@data_with_union +POSTHOOK: Output: database:default +POSTHOOK: Output: default@data_with_union_2 +POSTHOOK: Lineage: data_with_union_2.arrayfield SIMPLE [(data_with_union)data_with_union.FieldSchema(name:arrayfield, type:array, comment:null), ] +POSTHOOK: Lineage: data_with_union_2.mapfield SIMPLE [(data_with_union)data_with_union.FieldSchema(name:mapfield, type:map, comment:null), ] +POSTHOOK: Lineage: data_with_union_2.structfield SIMPLE [(data_with_union)data_with_union.FieldSchema(name:structfield, type:struct, comment:null), ] +POSTHOOK: Lineage: data_with_union_2.unionfield SIMPLE [(data_with_union)data_with_union.FieldSchema(name:unionfield, type:uniontype, comment:null), ] +PREHOOK: query: select * from data_with_union_2 +PREHOOK: type: QUERY +PREHOOK: Input: default@data_with_union_2 +#### A masked pattern was here #### +POSTHOOK: query: select * from data_with_union_2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@data_with_union_2 +#### A masked pattern was here #### +{0:1} [0,2] {1:1} {"sf1":1,"sf2":"foo"} diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java index ff69b47cb6..bb3de3049d 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java @@ -485,11 +485,12 @@ public static Object copyToStandardObject( case UNION: { UnionObjectInspector uoi = (UnionObjectInspector)oi; List objectInspectors = uoi.getObjectInspectors(); + byte tag = uoi.getTag(o); Object object = copyToStandardObject( uoi.getField(o), - objectInspectors.get(uoi.getTag(o)), + objectInspectors.get(tag), objectInspectorOption); - result = object; + result = new StandardUnionObjectInspector.StandardUnion(tag, object); break; } default: {