summaryrefslogtreecommitdiff
path: root/sql/multi_range_read.cc
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2011-09-13 23:45:02 +0400
committerSergey Petrunya <psergey@askmonty.org>2011-09-13 23:45:02 +0400
commit5ebff8ab788923cfcc25862d6c9e11ea20801fa0 (patch)
treee519537d6843ffb5807de5a5e16f1b5760ab2a46 /sql/multi_range_read.cc
parent3769841d9e706ee018d5273d2901954b9a281c3e (diff)
downloadmariadb-git-5ebff8ab788923cfcc25862d6c9e11ea20801fa0.tar.gz
BUG#730133: Wrong result with jkl = 7, BKA, ICP in maria-5.3 + compound index
- Mrr_ordered_index_reader::interrupt_read() and resume_read() should save/restore not just index lookup tuple, but entire index tuple. Key parts that are not used for index lookup can be still used in pushed index condition. Failure to save/restore will cause the index condition to be evaluated over the wrong values.
Diffstat (limited to 'sql/multi_range_read.cc')
-rw-r--r--sql/multi_range_read.cc15
1 files changed, 8 insertions, 7 deletions
diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc
index f0a1987c383..08e91559fc6 100644
--- a/sql/multi_range_read.cc
+++ b/sql/multi_range_read.cc
@@ -424,10 +424,10 @@ void Mrr_ordered_index_reader::interrupt_read()
{
DBUG_ASSERT(support_scan_interruptions);
TABLE *table= file->get_table();
+ KEY *used_index= &table->key_info[file->active_index];
/* Save the current key value */
key_copy(saved_key_tuple, table->record[0],
- &table->key_info[file->active_index],
- keypar.key_tuple_length);
+ used_index, used_index->key_length);
if (saved_primary_key)
{
@@ -452,9 +452,9 @@ void Mrr_ordered_index_reader::position()
void Mrr_ordered_index_reader::resume_read()
{
TABLE *table= file->get_table();
+ KEY *used_index= &table->key_info[file->active_index];
key_restore(table->record[0], saved_key_tuple,
- &table->key_info[file->active_index],
- keypar.key_tuple_length);
+ used_index, used_index->key_length);
if (saved_primary_key)
{
key_restore(table->record[0], saved_primary_key,
@@ -531,7 +531,7 @@ int Mrr_ordered_index_reader::init(handler *h_arg, RANGE_SEQ_IF *seq_funcs,
mrr_funcs= *seq_funcs;
source_exhausted= FALSE;
if (support_scan_interruptions)
- bzero(saved_key_tuple, keypar.key_tuple_length);
+ bzero(saved_key_tuple, key_info->key_length);
have_saved_rowid= FALSE;
return 0;
}
@@ -850,10 +850,11 @@ int DsMrr_impl::dsmrr_init(handler *h_arg, RANGE_SEQ_IF *seq_funcs,
uint pk= h_idx->get_table()->s->primary_key;
saved_pk_length= h_idx->get_table()->key_info[pk].key_length;
}
-
+
+ KEY *used_index= &h_idx->get_table()->key_info[h_idx->active_index];
if (reader_factory.ordered_index_reader.
set_interruption_temp_buffer(primary_file->ref_length,
- keypar.key_tuple_length,
+ used_index->key_length,
saved_pk_length,
&full_buf, full_buf_end))
goto use_default_impl;