@@ -117,22 +117,22 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
117117 $rowWriter.setOffsetAndSize( $index, $tmpCursor, $bufferHolder.cursor - $tmpCursor);
118118 """
119119
120- case a @ ArrayType (et, _ ) =>
120+ case a @ ArrayType (et, cn ) =>
121121 s """
122122 // Remember the current cursor so that we can calculate how many bytes are
123123 // written later.
124124 final int $tmpCursor = $bufferHolder.cursor;
125- ${writeArrayToBuffer(ctx, input.value, et, bufferHolder)}
125+ ${writeArrayToBuffer(ctx, input.value, et, cn, bufferHolder)}
126126 $rowWriter.setOffsetAndSize( $index, $tmpCursor, $bufferHolder.cursor - $tmpCursor);
127127 $rowWriter.alignToWords( $bufferHolder.cursor - $tmpCursor);
128128 """
129129
130- case m @ MapType (kt, vt, _ ) =>
130+ case m @ MapType (kt, vt, cn ) =>
131131 s """
132132 // Remember the current cursor so that we can calculate how many bytes are
133133 // written later.
134134 final int $tmpCursor = $bufferHolder.cursor;
135- ${writeMapToBuffer(ctx, input.value, kt, vt, bufferHolder)}
135+ ${writeMapToBuffer(ctx, input.value, kt, vt, cn, bufferHolder)}
136136 $rowWriter.setOffsetAndSize( $index, $tmpCursor, $bufferHolder.cursor - $tmpCursor);
137137 $rowWriter.alignToWords( $bufferHolder.cursor - $tmpCursor);
138138 """
@@ -173,6 +173,7 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
173173 ctx : CodegenContext ,
174174 input : String ,
175175 elementType : DataType ,
176+ containsNull : Boolean ,
176177 bufferHolder : String ): String = {
177178 val arrayWriterClass = classOf [UnsafeArrayWriter ].getName
178179 val arrayWriter = ctx.freshName(" arrayWriter" )
@@ -202,16 +203,16 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
202203 ${writeStructToBuffer(ctx, element, t.map(_.dataType), bufferHolder)}
203204 """
204205
205- case a @ ArrayType (et, _ ) =>
206+ case a @ ArrayType (et, cn ) =>
206207 s """
207208 $arrayWriter.setOffset( $index);
208- ${writeArrayToBuffer(ctx, element, et, bufferHolder)}
209+ ${writeArrayToBuffer(ctx, element, et, cn, bufferHolder)}
209210 """
210211
211- case m @ MapType (kt, vt, _ ) =>
212+ case m @ MapType (kt, vt, cn ) =>
212213 s """
213214 $arrayWriter.setOffset( $index);
214- ${writeMapToBuffer(ctx, element, kt, vt, bufferHolder)}
215+ ${writeMapToBuffer(ctx, element, kt, vt, cn, bufferHolder)}
215216 """
216217
217218 case t : DecimalType =>
@@ -222,6 +223,21 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
222223 case _ => s " $arrayWriter.write( $index, $element); "
223224 }
224225
226+ val storeElement = if (containsNull) {
227+ s """
228+ if ( $input.isNullAt( $index)) {
229+ $arrayWriter.setNullAt( $index);
230+ } else {
231+ final $jt $element = ${ctx.getValue(input, et, index)};
232+ $writeElement
233+ }
234+ """
235+ } else {
236+ s """
237+ final $jt $element = ${ctx.getValue(input, et, index)};
238+ $writeElement
239+ """
240+ }
225241 s """
226242 if ( $input instanceof UnsafeArrayData) {
227243 ${writeUnsafeData(ctx, s " ((UnsafeArrayData) $input) " , bufferHolder)}
@@ -230,12 +246,7 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
230246 $arrayWriter.initialize( $bufferHolder, $numElements, $fixedElementSize);
231247
232248 for (int $index = 0; $index < $numElements; $index++) {
233- if ( $input.isNullAt( $index)) {
234- $arrayWriter.setNullAt( $index);
235- } else {
236- final $jt $element = ${ctx.getValue(input, et, index)};
237- $writeElement
238- }
249+ $storeElement
239250 }
240251 }
241252 """
@@ -247,6 +258,7 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
247258 input : String ,
248259 keyType : DataType ,
249260 valueType : DataType ,
261+ valueContainsNull : Boolean ,
250262 bufferHolder : String ): String = {
251263 val keys = ctx.freshName(" keys" )
252264 val values = ctx.freshName(" values" )
@@ -268,11 +280,11 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
268280 // Remember the current cursor so that we can write numBytes of key array later.
269281 final int $tmpCursor = $bufferHolder.cursor;
270282
271- ${writeArrayToBuffer(ctx, keys, keyType, bufferHolder)}
283+ ${writeArrayToBuffer(ctx, keys, keyType, false , bufferHolder)}
272284 // Write the numBytes of key array into the first 4 bytes.
273285 Platform.putInt( $bufferHolder.buffer, $tmpCursor - 4, $bufferHolder.cursor - $tmpCursor);
274286
275- ${writeArrayToBuffer(ctx, values, valueType, bufferHolder)}
287+ ${writeArrayToBuffer(ctx, values, valueType, valueContainsNull, bufferHolder)}
276288 }
277289 """
278290 }
0 commit comments