From 3e31a07c4c221279387188f89bc3d052542abdac Mon Sep 17 00:00:00 2001 From: Chris Nauroth Date: Tue, 10 Jan 2023 00:59:15 -0800 Subject: [PATCH] HIVE-26892: Backport HIVE-25243 to 3.2.0: Handle nested values in null struct. (#3898) (branch-3 backport by Aman Raj reviewed by Laszlo Bodor) --- .../hadoop/hive/ql/io/arrow/Serializer.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/arrow/Serializer.java b/ql/src/java/org/apache/hadoop/hive/ql/io/arrow/Serializer.java index 14eb4d8b1930..7a432ac836b9 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/arrow/Serializer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/arrow/Serializer.java @@ -267,6 +267,21 @@ private void writeStruct(NonNullableStructVector arrowVector, StructColumnVector final ColumnVector[] hiveFieldVectors = hiveVector.fields; final int fieldSize = fieldTypeInfos.size(); + // This is to handle following scenario - + // if any struct value itself is NULL, we get structVector.isNull[i]=true + // but we don't get the same for it's child fields which later causes exceptions while setting to arrow vectors + // see - https://issues.apache.org/jira/browse/HIVE-25243 + if (hiveVector != null && hiveFieldVectors != null) { + for (int i = 0; i < size; i++) { + if (hiveVector.isNull[i]) { + for (ColumnVector fieldVector : hiveFieldVectors) { + fieldVector.isNull[i] = true; + fieldVector.noNulls = false; + } + } + } + } + for (int fieldIndex = 0; fieldIndex < fieldSize; fieldIndex++) { final TypeInfo fieldTypeInfo = fieldTypeInfos.get(fieldIndex); final ColumnVector hiveFieldVector = hiveFieldVectors[fieldIndex];