summaryrefslogtreecommitdiff
path: root/sql/multi_range_read.cc
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2014-11-13 13:56:35 +0300
committerSergey Petrunya <psergey@askmonty.org>2014-11-13 13:56:35 +0300
commit06c7f493e35dd1d798f44b6920c4b7957d42c4de (patch)
tree7d285aa9279a0ea0e434889072046b6a67d8ee36 /sql/multi_range_read.cc
parent8c7ef99bb24f9faa2e71b97178482606d83934bc (diff)
downloadmariadb-git-06c7f493e35dd1d798f44b6920c4b7957d42c4de.tar.gz
MDEV-7068: MRR accessing uninitialised bytes, test case failure main.innodb_mrr
- Don't call index_reader->interrupt_read() if the index reader has returned all rows that matched its keys.
Diffstat (limited to 'sql/multi_range_read.cc')
-rw-r--r--sql/multi_range_read.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc
index bbc287bf239..2479bc3258c 100644
--- a/sql/multi_range_read.cc
+++ b/sql/multi_range_read.cc
@@ -684,8 +684,19 @@ int Mrr_ordered_rndpos_reader::refill_from_index_reader()
rowid_buffer->write_ptr2= (uchar*)&range_info;
rowid_buffer->write();
}
-
- index_reader->interrupt_read();
+
+ /*
+ When index_reader_needs_refill=TRUE, this means we've got all of index
+ tuples for lookups keys that index_reader had. We are not in the middle
+ of an index read, so there is no need to call interrupt_read.
+
+ Actually, we must not call interrupt_read(), because it could be that we
+ haven't read a single row (because all index lookups returned
+ HA_ERR_KEY_NOT_FOUND). In this case, interrupt_read() will cause [harmless]
+ valgrind warnings when trying to save garbage from table->record[0].
+ */
+ if (!index_reader_needs_refill)
+ index_reader->interrupt_read();
/* Sort the buffer contents by rowid */
rowid_buffer->sort((qsort2_cmp)rowid_cmp_reverse, (void*)file);