@@ -135,13 +135,15 @@ fn concat_lists<OffsetSize: OffsetSizeTrait>(
135
135
) -> Result < ArrayRef , ArrowError > {
136
136
let mut output_len = 0 ;
137
137
let mut list_has_nulls = false ;
138
+ let mut list_has_slices = false ;
138
139
139
140
let lists = arrays
140
141
. iter ( )
141
142
. map ( |x| x. as_list :: < OffsetSize > ( ) )
142
143
. inspect ( |l| {
143
144
output_len += l. len ( ) ;
144
145
list_has_nulls |= l. null_count ( ) != 0 ;
146
+ list_has_slices |= l. offsets ( ) [ 0 ] . as_usize ( ) > 0 ;
145
147
} )
146
148
. collect :: < Vec < _ > > ( ) ;
147
149
@@ -156,19 +158,23 @@ fn concat_lists<OffsetSize: OffsetSizeTrait>(
156
158
NullBuffer :: new ( nulls. finish ( ) )
157
159
} ) ;
158
160
159
- let values: Vec < ArrayRef > = lists
160
- . iter ( )
161
- . map ( |x| {
162
- // offsets may not refer to all values in the array
163
- // for example a sliced list array may have offsets that start at
164
- // a non-zero offset and not use all the values
165
- let offsets = x. offsets ( ) ;
161
+ // If any of the lists have slices, we need to slice the values
162
+ // to ensure that the offsets are correct
163
+ let mut sliced_values;
164
+ let values: Vec < & dyn Array > = if list_has_slices {
165
+ sliced_values = Vec :: with_capacity ( lists. len ( ) ) ;
166
+ for l in & lists {
167
+ // if the first offset is non-zero, we need to slice the values so when
168
+ // we concatenate them below only the relevant values are included
169
+ let offsets = l. offsets ( ) ;
166
170
let start_offset = offsets[ 0 ] . as_usize ( ) ;
167
171
let end_offset = offsets[ offsets. len ( ) - 1 ] . as_usize ( ) ;
168
- x. values ( ) . slice ( start_offset, end_offset - start_offset)
169
- } )
170
- . collect :: < Vec < _ > > ( ) ;
171
- let values: Vec < & dyn Array > = values. iter ( ) . map ( |a| a. as_ref ( ) ) . collect ( ) ;
172
+ sliced_values. push ( l. values ( ) . slice ( start_offset, end_offset - start_offset) ) ;
173
+ }
174
+ sliced_values. iter ( ) . map ( |a| a. as_ref ( ) ) . collect ( )
175
+ } else {
176
+ lists. iter ( ) . map ( |x| x. values ( ) . as_ref ( ) ) . collect ( )
177
+ } ;
172
178
173
179
let concatenated_values = concat ( values. as_slice ( ) ) ?;
174
180
0 commit comments