mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix a number of problems with reverse buffer use
This commit is contained in:
@ -644,6 +644,8 @@ int DsMrr_impl::dsmrr_fill_rowid_buffer()
|
|||||||
|
|
||||||
rowid_buffer.reset_for_writing();
|
rowid_buffer.reset_for_writing();
|
||||||
identical_rowid_ptr= NULL;
|
identical_rowid_ptr= NULL;
|
||||||
|
if (do_sort_keys)
|
||||||
|
key_buffer.flip();
|
||||||
|
|
||||||
while (rowid_buffer.have_space_for(rowid_buff_elem_size))
|
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);
|
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 */
|
/* Put key, or {key, range_id} pair into the buffer */
|
||||||
if (use_key_pointers)
|
if (use_key_pointers)
|
||||||
key_buffer.write((uchar*)&cur_range.start_key.key, sizeof(char*));
|
key_buffer.write((uchar*)&cur_range.start_key.key, sizeof(char*));
|
||||||
else
|
else
|
||||||
key_buffer.write(cur_range.start_key.key, key_tuple_length);
|
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*));
|
key_buffer.write((uchar*)&cur_range.ptr, sizeof(void*));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -966,7 +971,6 @@ check_record:
|
|||||||
}
|
}
|
||||||
|
|
||||||
goto check_record;
|
goto check_record;
|
||||||
// goto read_and_check;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
@ -999,7 +1003,8 @@ check_record:
|
|||||||
res= HA_ERR_END_OF_FILE;
|
res= HA_ERR_END_OF_FILE;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
dsmrr_fill_key_buffer();
|
if (!do_rowid_fetch)
|
||||||
|
dsmrr_fill_key_buffer();
|
||||||
if (!key_buffer.have_data(key_buff_elem_size))
|
if (!key_buffer.have_data(key_buff_elem_size))
|
||||||
{
|
{
|
||||||
res= HA_ERR_END_OF_FILE;
|
res= HA_ERR_END_OF_FILE;
|
||||||
|
@ -102,14 +102,25 @@ public:
|
|||||||
{
|
{
|
||||||
*unused_start= start;
|
*unused_start= start;
|
||||||
*unused_end= read_pos;
|
*unused_end= read_pos;
|
||||||
|
start= read_pos;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*unused_start=read_pos;
|
*unused_start= read_pos;
|
||||||
*unused_end=end;
|
*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)
|
void grow(uchar *unused_start, uchar *unused_end)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user