@@ -328,13 +328,13 @@ impl BlockReader {
328
328
}
329
329
let now = SystemTime :: now ( ) ;
330
330
let mut final_result = Vec :: new ( ) ;
331
- let mut merge_results = futures:: future:: try_join_all ( merge_io_handlers) . await ?;
332
- merge_results. sort_by ( |a, b| a. 0 . cmp ( & b. 0 ) ) ;
331
+ let merge_results = futures:: future:: try_join_all ( merge_io_handlers) . await ?;
333
332
for index in indices. keys ( ) {
334
333
let column_meta = & part. columns_meta [ index] ;
335
334
let column_start = column_meta. offset ;
336
335
let column_end = column_start + column_meta. len ;
337
336
337
+ // Find the range index and range.
338
338
let range_idx = range_merger. get ( column_start..column_end) ;
339
339
let ( idx, range) = match range_idx {
340
340
None => Err ( ErrorCode :: Internal ( format ! (
@@ -343,10 +343,30 @@ impl BlockReader {
343
343
) ) ) ,
344
344
Some ( ( i, r) ) => Ok ( ( i, r) ) ,
345
345
} ?;
346
- let data = & merge_results[ idx] . 1 ;
347
- let column_data = data
348
- [ ( column_start - range. start ) as usize ..( column_end - column_start) as usize ]
349
- . to_vec ( ) ;
346
+
347
+ // For loop but not move data.
348
+ let mut range_data = None ;
349
+ for ( i, data) in & merge_results {
350
+ if * i == idx {
351
+ range_data = Some ( data) ;
352
+ break ;
353
+ }
354
+ }
355
+
356
+ // Range must contain the column range [start, end].
357
+ // [1,5]: ----- rr
358
+ // [2,4]: --- r2
359
+ // [1,5]: ----- r3
360
+ // r2 data is:
361
+ // start = r2.start - rr.start - 1 = 1
362
+ // end = r2.end - rr.start - 1 = 3
363
+ // r3 data is:
364
+ // start = r3.start - rr.start = 0
365
+ // end = r3.end - rr.start = 4
366
+ // Here has data copy.
367
+ let start = ( range. start - column_start) as usize ;
368
+ let end = ( range. end - column_start) as usize ;
369
+ let column_data = range_data. unwrap ( ) [ start..=end] . to_vec ( ) ;
350
370
final_result. push ( ( * index, column_data) ) ;
351
371
}
352
372
0 commit comments