| 955 | */ |
| 956 | |
| 957 | int Mrr_ordered_rndpos_reader::refill_from_index_reader() |
| 958 | { |
| 959 | range_id_t range_info; |
| 960 | int res; |
| 961 | DBUG_ENTER("Mrr_ordered_rndpos_reader::refill_from_index_reader"); |
| 962 | |
| 963 | DBUG_ASSERT(rowid_buffer->is_empty()); |
| 964 | index_rowid= index_reader->get_rowid_ptr(); |
| 965 | rowid_buffer->reset(); |
| 966 | rowid_buffer->setup_writing(file->ref_length, |
| 967 | is_mrr_assoc? sizeof(range_id_t) : 0); |
| 968 | |
| 969 | last_identical_rowid= NULL; |
| 970 | |
| 971 | index_reader->resume_read(); |
| 972 | while (rowid_buffer->can_write()) |
| 973 | { |
| 974 | res= index_reader->get_next(&range_info); |
| 975 | |
| 976 | if (res) |
| 977 | { |
| 978 | if (res != HA_ERR_END_OF_FILE) |
| 979 | DBUG_RETURN(res); |
| 980 | index_reader_needs_refill=TRUE; |
| 981 | break; |
| 982 | } |
| 983 | |
| 984 | index_reader->position(); |
| 985 | |
| 986 | /* |
| 987 | If the built rowid filter cannot be used at the engine level, use it here. |
| 988 | */ |
| 989 | if (rowid_filter && !file->pushed_rowid_filter && |
| 990 | !rowid_filter->check((char *)index_rowid)) |
| 991 | continue; |
| 992 | |
| 993 | /* Put rowid, or {rowid, range_id} pair into the buffer */ |
| 994 | rowid_buffer->write_ptr1= index_rowid; |
| 995 | rowid_buffer->write_ptr2= (uchar*)&range_info; |
| 996 | rowid_buffer->write(); |
| 997 | } |
| 998 | |
| 999 | /* |
| 1000 | When index_reader_needs_refill=TRUE, this means we've got all of index |
| 1001 | tuples for lookups keys that index_reader had. We are not in the middle |
| 1002 | of an index read, so there is no need to call interrupt_read. |
| 1003 | |
| 1004 | Actually, we must not call interrupt_read(), because it could be that we |
| 1005 | haven't read a single row (because all index lookups returned |
| 1006 | HA_ERR_KEY_NOT_FOUND). In this case, interrupt_read() will cause [harmless] |
| 1007 | valgrind warnings when trying to save garbage from table->record[0]. |
| 1008 | */ |
| 1009 | if (!index_reader_needs_refill) |
| 1010 | index_reader->interrupt_read(); |
| 1011 | /* Sort the buffer contents by rowid */ |
| 1012 | rowid_buffer->sort(rowid_cmp_reverse, (void*)file); |
| 1013 | |
| 1014 | rowid_buffer->setup_reading(file->ref_length, |
nothing calls this directly
no test coverage detected