diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2010-11-22 17:08:22 +0300 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2010-11-22 17:08:22 +0300 |
commit | 2ec43747f502c0a405793d30b3aa7b1b44ccc48e (patch) | |
tree | ec0e2540a1e02e7284144d89b7fec4accd6695d8 | |
parent | c635eb331944a8cb970b120c6a3d94ea1ac38fcc (diff) | |
download | mariadb-git-2ec43747f502c0a405793d30b3aa7b1b44ccc48e.tar.gz |
Merge MWL#121-125 DS-MRR improvements
- Address Monty's review feedback, part 1
-rw-r--r-- | mysql-test/t/subselect_sj2.test | 1 | ||||
-rw-r--r-- | sql/multi_range_read.cc | 45 | ||||
-rw-r--r-- | sql/multi_range_read.h | 2 | ||||
-rw-r--r-- | sql/opt_range.cc | 2 | ||||
-rw-r--r-- | sql/sql_lifo_buffer.h | 4 |
5 files changed, 28 insertions, 26 deletions
diff --git a/mysql-test/t/subselect_sj2.test b/mysql-test/t/subselect_sj2.test index 67452b5a69e..e73e7cfade2 100644 --- a/mysql-test/t/subselect_sj2.test +++ b/mysql-test/t/subselect_sj2.test @@ -586,7 +586,6 @@ if (`select @@join_cache_level=6`) --echo # Not anymore: --echo # The following query gives wrong result due to Bug#49129 } - select * from t0 where t0.a in (select t1.a from t1, t2 where t2.a=t0.a and t1.b=t2.b); diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc index 0caa5e55e51..11863deb54e 100644 --- a/sql/multi_range_read.cc +++ b/sql/multi_range_read.cc @@ -341,14 +341,14 @@ int Mrr_ordered_index_reader::get_next(char **range_info) DBUG_RETURN(HA_ERR_END_OF_FILE); } - while (1) + for(;;) { bool have_record= FALSE; if (scanning_key_val_iter) { if ((res= kv_it.get_next())) { - kv_it.close(); + kv_it.close_(); scanning_key_val_iter= FALSE; if ((res != HA_ERR_KEY_NOT_FOUND && res != HA_ERR_END_OF_FILE)) DBUG_RETURN(res); @@ -439,24 +439,22 @@ int Mrr_ordered_index_reader::refill_buffer() } /* Put key, or {key, range_id} pair into the buffer */ - if (keypar.use_key_pointers) - key_ptr=(uchar*) &cur_range.start_key.key; - else - key_ptr=(uchar*) cur_range.start_key.key; + key_ptr= (keypar.use_key_pointers)? (uchar*)&cur_range.start_key.key : + (uchar*)cur_range.start_key.key; key_buffer->write(); } - - bool no_more_keys= test(res); + + /* Force get_next() to start with kv_it.init() call: */ scanning_key_val_iter= FALSE; - if (no_more_keys && (!know_key_tuple_params || key_buffer->is_empty())) + if (test(res) && (!know_key_tuple_params || key_buffer->is_empty())) DBUG_RETURN(HA_ERR_END_OF_FILE); key_buffer->sort((key_buffer->type() == Lifo_buffer::FORWARD)? (qsort2_cmp)Mrr_ordered_index_reader::key_tuple_cmp_reverse : (qsort2_cmp)Mrr_ordered_index_reader::key_tuple_cmp, - (void*)this); + this); DBUG_RETURN(0); } @@ -558,7 +556,7 @@ int Mrr_ordered_rndpos_reader::refill_buffer() if (index_reader_exhausted) DBUG_RETURN(HA_ERR_END_OF_FILE); - while ((res= refill_from_key_buffer() == HA_ERR_END_OF_FILE)) + while ((res= refill_from_key_buffer()) == HA_ERR_END_OF_FILE) { if ((res= index_reader->refill_buffer())) { @@ -603,11 +601,16 @@ int Mrr_ordered_rndpos_reader::refill_from_key_buffer() res= index_reader->get_next(&range_info); if (res) + { + if (res != HA_ERR_END_OF_FILE) + DBUG_RETURN(res); + index_reader_exhausted= TRUE; break; + } - /* Put rowid, or {rowid, range_id} pair into the buffer */ index_reader->position(); + /* Put rowid, or {rowid, range_id} pair into the buffer */ rowid_buffer->write(); } @@ -658,7 +661,7 @@ int Mrr_ordered_rndpos_reader::get_next(char **range_info) } } - while (1) + for(;;) { last_identical_rowid= NULL; @@ -1052,8 +1055,8 @@ void DsMrr_impl::setup_buffer_sizes(uint key_size_in_keybuf, Ok if we got here we need to allocate one part of the buffer for keys and another part for rowids. */ - uint rowid_buf_elem_size= h->ref_length + - (int)is_mrr_assoc * sizeof(char*); + ulonglong rowid_buf_elem_size= h->ref_length + + (int)is_mrr_assoc * sizeof(char*); /* Use rec_per_key statistics as a basis to find out how many rowids @@ -1070,8 +1073,8 @@ void DsMrr_impl::setup_buffer_sizes(uint key_size_in_keybuf, } double fraction_for_rowids= - ((double) rowid_buf_elem_size / - ((double)rowid_buf_elem_size + key_buff_elem_size)); + (ulonglong2double(rowid_buf_elem_size) / + (ulonglong2double(rowid_buf_elem_size) + key_buff_elem_size)); size_t bytes_for_rowids= round(fraction_for_rowids * (full_buf_end - full_buf)); @@ -1080,7 +1083,7 @@ void DsMrr_impl::setup_buffer_sizes(uint key_size_in_keybuf, if (bytes_for_keys < key_buff_elem_size + 1) { - uint add= key_buff_elem_size + 1 - bytes_for_keys; + ulong add= key_buff_elem_size + 1 - bytes_for_keys; bytes_for_keys= key_buff_elem_size + 1; bytes_for_rowids -= add; DBUG_ASSERT(bytes_for_rowids >= rowid_buf_elem_size + 1); @@ -1088,7 +1091,7 @@ void DsMrr_impl::setup_buffer_sizes(uint key_size_in_keybuf, if (bytes_for_rowids < rowid_buf_elem_size + 1) { - uint add= rowid_buf_elem_size + 1 - bytes_for_rowids; + ulong add= rowid_buf_elem_size + 1 - bytes_for_rowids; bytes_for_rowids= rowid_buf_elem_size + 1; bytes_for_keys -= add; DBUG_ASSERT(bytes_for_keys >= key_buff_elem_size + 1); @@ -1185,7 +1188,7 @@ int Key_value_records_iterator::init(Mrr_ordered_index_reader *owner_arg) if (res) { - close(); + close_(); return res; } get_next_row= FALSE; @@ -1223,7 +1226,7 @@ int Key_value_records_iterator::get_next() } -void Key_value_records_iterator::close() +void Key_value_records_iterator::close_() { while (!owner->key_buffer->read() && (cur_index_tuple != last_identical_key_ptr)) {} diff --git a/sql/multi_range_read.h b/sql/multi_range_read.h index 8e2743df5f1..8d9eebab74a 100644 --- a/sql/multi_range_read.h +++ b/sql/multi_range_read.h @@ -137,7 +137,7 @@ class Key_value_records_iterator public: int init(Mrr_ordered_index_reader *owner_arg); int get_next(); - void close(); + void close_(); }; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index e139839cf56..b39d96f6474 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -8006,7 +8006,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, quick->mrr_buf_size= thd->variables.mrr_buff_size; if (table->file->multi_range_read_info(quick->index, 1, (uint)records, - uint(-1), + ~0, &quick->mrr_buf_size, &quick->mrr_flags, &cost)) goto err; diff --git a/sql/sql_lifo_buffer.h b/sql/sql_lifo_buffer.h index 8718177fc4f..f85bc1e6c41 100644 --- a/sql/sql_lifo_buffer.h +++ b/sql/sql_lifo_buffer.h @@ -150,7 +150,7 @@ public: enum_direction type() { return FORWARD; } size_t used_size() { - return pos - start; + return (size_t)(pos - start); } void reset() { @@ -243,7 +243,7 @@ public: size_t used_size() { - return end - pos; + return (size_t)(end - pos); } void reset() { |