@@ -261,12 +261,12 @@ impl<O: IntegerPType, S: IntegerPType> ArrayBuilder for ListViewBuilder<O, S> {
261261
262262 self . nulls . append_validity_mask ( array. validity_mask ( ) ) ;
263263
264- let curr_elements_len = self . elements_builder . len ( ) ;
265-
266264 // Bulk append the new elements (which should have no gaps or overlaps).
265+ let old_elements_len = self . elements_builder . len ( ) ;
267266 self . elements_builder
268267 . reserve_exact ( listview. elements ( ) . len ( ) ) ;
269268 self . elements_builder . extend_from_array ( listview. elements ( ) ) ;
269+ let new_elements_len = self . elements_builder . len ( ) ;
270270
271271 // Reserve enough space for the new views.
272272 let extend_length = listview. len ( ) ;
@@ -287,36 +287,13 @@ impl<O: IntegerPType, S: IntegerPType> ArrayBuilder for ListViewBuilder<O, S> {
287287 // This should be cheap because we didn't compress after rebuilding.
288288 let new_offsets = listview. offsets ( ) . to_primitive ( ) ;
289289
290- fn adjust_offsets < ' a , O : IntegerPType , A : IntegerPType > (
291- mut uninit_range : UninitRange < ' a , O > ,
292- new_offsets : PrimitiveArray ,
293- curr_elements_len : usize ,
294- ) {
295- let new_offsets_slice = new_offsets. as_slice :: < A > ( ) ;
296- let curr_elements_len = O :: from_usize ( curr_elements_len) . vortex_expect (
297- "the current elements length did not fit into the offset type (impossible)" ,
298- ) ;
299-
300- for i in 0 ..uninit_range. len ( ) {
301- let new_offset = new_offsets_slice[ i] ;
302- let new_offset_correct_type = O :: from_usize (
303- new_offset
304- . to_usize ( )
305- . vortex_expect ( "Offsets must always fit in usize" ) ,
306- )
307- . vortex_expect ( "New offset somehow did not fit into the builder's offset type" ) ;
308-
309- let adjusted_new_offset = new_offset_correct_type + curr_elements_len;
310- uninit_range. set_value ( i, adjusted_new_offset) ;
311- }
312-
313- // SAFETY: We have set all the values in the range, and since `offsets` are
314- // non-nullable, we are done.
315- unsafe { uninit_range. finish ( ) } ;
316- }
317-
318290 match_each_integer_ptype ! ( new_offsets. ptype( ) , |A | {
319- adjust_offsets:: <O , A >( uninit_range, new_offsets, curr_elements_len) ;
291+ adjust_offsets:: <O , A >(
292+ uninit_range,
293+ new_offsets,
294+ old_elements_len,
295+ new_elements_len,
296+ ) ;
320297 } )
321298 }
322299
@@ -341,6 +318,42 @@ impl<O: IntegerPType, S: IntegerPType> ArrayBuilder for ListViewBuilder<O, S> {
341318 }
342319}
343320
321+ /// Given new offsets, adds them to the `UninitRange` after adding the `old_elements_len` to each
322+ /// offset.
323+ fn adjust_offsets < ' a , O : IntegerPType , A : IntegerPType > (
324+ mut uninit_range : UninitRange < ' a , O > ,
325+ new_offsets : PrimitiveArray ,
326+ old_elements_len : usize ,
327+ new_elements_len : usize ,
328+ ) {
329+ let new_offsets_slice = new_offsets. as_slice :: < A > ( ) ;
330+ let old_elements_len = O :: from_usize ( old_elements_len)
331+ . vortex_expect ( "the old elements length did not fit into the offset type (impossible)" ) ;
332+ let new_elements_len = O :: from_usize ( new_elements_len)
333+ . vortex_expect ( "the current elements length did not fit into the offset type (impossible)" ) ;
334+
335+ for i in 0 ..uninit_range. len ( ) {
336+ let new_offset = O :: from_usize (
337+ new_offsets_slice[ i]
338+ . to_usize ( )
339+ . vortex_expect ( "Offsets must always fit in usize" ) ,
340+ )
341+ . vortex_expect ( "New offset somehow did not fit into the builder's offset type" ) ;
342+
343+ let adjusted_new_offset = new_offset + old_elements_len;
344+ debug_assert ! (
345+ adjusted_new_offset <= new_elements_len,
346+ "[{i}/{}]: {new_offset} + {old_elements_len} = {adjusted_new_offset} <= {new_elements_len} failed" ,
347+ uninit_range. len( )
348+ ) ;
349+ uninit_range. set_value ( i, adjusted_new_offset) ;
350+ }
351+
352+ // SAFETY: We have set all the values in the range, and since `offsets` are
353+ // non-nullable, we are done.
354+ unsafe { uninit_range. finish ( ) } ;
355+ }
356+
344357#[ cfg( test) ]
345358mod tests {
346359 use std:: sync:: Arc ;
0 commit comments