From d098596ba5466b02823dc2431b632a43a077c2d5 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Thu, 12 Aug 2010 23:59:29 +0400 Subject: [PATCH] Fix a number of problems with reverse buffer use --- sql/multi_range_read.cc | 11 ++++++++--- sql/multi_range_read.h | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc index c1f06594e70..212f04dc766 100644 --- a/sql/multi_range_read.cc +++ b/sql/multi_range_read.cc @@ -644,6 +644,8 @@ int DsMrr_impl::dsmrr_fill_rowid_buffer() rowid_buffer.reset_for_writing(); identical_rowid_ptr= NULL; + if (do_sort_keys) + key_buffer.flip(); while (rowid_buffer.have_space_for(rowid_buff_elem_size)) { @@ -860,13 +862,16 @@ void DsMrr_impl::dsmrr_fill_key_buffer() setup_buffer_sizes(&cur_range.start_key); } + if (key_buffer.is_reverse() && is_mrr_assoc) + key_buffer.write((uchar*)&cur_range.ptr, sizeof(void*)); + /* Put key, or {key, range_id} pair into the buffer */ if (use_key_pointers) key_buffer.write((uchar*)&cur_range.start_key.key, sizeof(char*)); else key_buffer.write(cur_range.start_key.key, key_tuple_length); - if (is_mrr_assoc) + if (!key_buffer.is_reverse() && is_mrr_assoc) key_buffer.write((uchar*)&cur_range.ptr, sizeof(void*)); } @@ -966,7 +971,6 @@ check_record: } goto check_record; - // goto read_and_check; } while(1) @@ -999,7 +1003,8 @@ check_record: res= HA_ERR_END_OF_FILE; goto end; } - dsmrr_fill_key_buffer(); + if (!do_rowid_fetch) + dsmrr_fill_key_buffer(); if (!key_buffer.have_data(key_buff_elem_size)) { res= HA_ERR_END_OF_FILE; diff --git a/sql/multi_range_read.h b/sql/multi_range_read.h index e49b1ab914d..1589e65b49f 100644 --- a/sql/multi_range_read.h +++ b/sql/multi_range_read.h @@ -102,14 +102,25 @@ public: { *unused_start= start; *unused_end= read_pos; + start= read_pos; } else { - *unused_start=read_pos; - *unused_end=end; + *unused_start= read_pos; + *unused_end= end; + end= read_pos; } } + void flip() + { + uchar *tmp= read_pos; + read_pos= write_pos; + write_pos= tmp; + direction= -direction; + } + bool is_reverse() { return direction == -1; } + void grow(uchar *unused_start, uchar *unused_end) { /*