diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2010-10-31 22:00:15 +0300 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2010-10-31 22:00:15 +0300 |
commit | 01d1e68bd1d2e0598b4edbb27fbed384033ce4a9 (patch) | |
tree | 69e114f52d8a9ee8f5569569b27ad0ba9554973c /sql/multi_range_read.cc | |
parent | 67a514da640bce7990bcb8be56ef78d62343782d (diff) | |
download | mariadb-git-01d1e68bd1d2e0598b4edbb27fbed384033ce4a9.tar.gz |
DS-MRR/CPK improvements: correct buffer exhaustion handling
Diffstat (limited to 'sql/multi_range_read.cc')
-rw-r--r-- | sql/multi_range_read.cc | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc index a968cf2da52..c9f3785b231 100644 --- a/sql/multi_range_read.cc +++ b/sql/multi_range_read.cc @@ -484,7 +484,7 @@ int Mrr_ordered_index_reader::refill_buffer() scanning_key_val_iter= FALSE; index_scan_eof= FALSE; - DBUG_RETURN(0); + DBUG_RETURN((no_more_keys && key_buffer->is_empty())? HA_ERR_END_OF_FILE:0); } @@ -521,8 +521,11 @@ int Mrr_ordered_rndpos_reader::init(handler *h_arg, //rowid_buff_elem_size= h->ref_length; //if (!(mode & HA_MRR_NO_ASSOCIATION)) // rowid_buff_elem_size += sizeof(char*); - - return index_reader->refill_buffer(); + + int res= index_reader->refill_buffer(); + if (res && res!=HA_ERR_END_OF_FILE) + return res; + return 0; } @@ -561,7 +564,7 @@ int Mrr_ordered_rndpos_reader::refill_buffer() last_identical_rowid= NULL; if (index_reader->eof()) - DBUG_RETURN(0); + DBUG_RETURN(HA_ERR_END_OF_FILE); while (rowid_buffer->can_write()) { @@ -584,9 +587,9 @@ int Mrr_ordered_rndpos_reader::refill_buffer() rowid_buffer->sort((qsort2_cmp)rowid_cmp_reverse, (void*)h); rowid_buffer->setup_reading(&rowid, h->ref_length, - is_mrr_assoc? (uchar**)&rowids_range_id: NULL, + is_mrr_assoc? (uchar**)&rowids_range_id: NULL, sizeof(void*)); - DBUG_RETURN(0); + DBUG_RETURN((rowid_buffer->is_empty() && res) ? HA_ERR_END_OF_FILE : 0); } @@ -632,8 +635,9 @@ int Mrr_ordered_rndpos_reader::get_next(char **range_info) /* First, finish off the sorted keys we have */ if (!index_reader->eof()) { - if ((res= refill_buffer())) - return res; /* for fatal errors */ + res= refill_buffer(); + if (res && res != HA_ERR_END_OF_FILE) + return res; } if (rowid_buffer->is_empty()) @@ -821,8 +825,9 @@ int DsMrr_impl::dsmrr_init(handler *h_arg, RANGE_SEQ_IF *seq_funcs, goto error; } } - - if (strategy->refill_buffer()) + + res= strategy->refill_buffer(); + if (res && res != HA_ERR_END_OF_FILE) goto error; /* |