| 795 | */ |
| 796 | |
| 797 | int Mrr_ordered_index_reader::refill_buffer(bool initial) |
| 798 | { |
| 799 | KEY_MULTI_RANGE cur_range; |
| 800 | DBUG_ENTER("Mrr_ordered_index_reader::refill_buffer"); |
| 801 | |
| 802 | DBUG_ASSERT(key_buffer->is_empty()); |
| 803 | |
| 804 | if (source_exhausted) |
| 805 | DBUG_RETURN(HA_ERR_END_OF_FILE); |
| 806 | |
| 807 | buf_manager->reset_buffer_sizes(buf_manager->arg); |
| 808 | key_buffer->reset(); |
| 809 | key_buffer->setup_writing(keypar.key_size_in_keybuf, |
| 810 | is_mrr_assoc? sizeof(range_id_t) : 0); |
| 811 | |
| 812 | while (key_buffer->can_write() && |
| 813 | !(source_exhausted= mrr_funcs.next(mrr_iter, &cur_range))) |
| 814 | { |
| 815 | DBUG_ASSERT(cur_range.range_flag & EQ_RANGE); |
| 816 | |
| 817 | /* Put key, or {key, range_id} pair into the buffer */ |
| 818 | key_buffer->write_ptr1= keypar.use_key_pointers ? |
| 819 | (uchar*)&cur_range.start_key.key : |
| 820 | (uchar*)cur_range.start_key.key; |
| 821 | key_buffer->write_ptr2= (uchar*)&cur_range.ptr; |
| 822 | key_buffer->write(); |
| 823 | } |
| 824 | |
| 825 | /* Force get_next() to start with kv_it.init() call: */ |
| 826 | scanning_key_val_iter= FALSE; |
| 827 | |
| 828 | if (source_exhausted && key_buffer->is_empty()) |
| 829 | DBUG_RETURN(HA_ERR_END_OF_FILE); |
| 830 | |
| 831 | if (!initial) |
| 832 | { |
| 833 | /* This is a non-initial buffer fill and we've got a non-empty buffer */ |
| 834 | THD *thd= current_thd; |
| 835 | status_var_increment(thd->status_var.ha_mrr_key_refills_count); |
| 836 | } |
| 837 | |
| 838 | key_buffer->sort((key_buffer->type() == Lifo_buffer::FORWARD) |
| 839 | ? Mrr_ordered_index_reader::compare_keys_reverse |
| 840 | : Mrr_ordered_index_reader::compare_keys, |
| 841 | this); |
| 842 | DBUG_RETURN(0); |
| 843 | } |
| 844 | |
| 845 | |
| 846 | int Mrr_ordered_index_reader::init(handler *h_arg, RANGE_SEQ_IF *seq_funcs, |
no test coverage detected