diff options
Diffstat (limited to 'sql/ha_partition.cc')
-rw-r--r-- | sql/ha_partition.cc | 96 |
1 files changed, 63 insertions, 33 deletions
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 98a3259a39b..9dcd57a5f82 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -1367,7 +1367,7 @@ bool print_admin_msg(THD* thd, uint len, protocol->store(msgbuf, msg_length, system_charset_info); if (protocol->write()) { - sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n", + sql_print_error("Failed on my_net_write, writing to stderr instead: %s", msgbuf); goto err; } @@ -2828,6 +2828,8 @@ bool ha_partition::create_handler_file(const char *name) } } (void) mysql_file_close(file, MYF(0)); + if (result) + mysql_file_delete(key_file_partition, file_name, MYF(MY_WME)); } else result= TRUE; @@ -5281,7 +5283,7 @@ bool ha_partition::init_record_priority_queue() /* Initialize priority queue, initialized to reading forward. */ int (*cmp_func)(void *, uchar *, uchar *); void *cmp_arg= (void*) this; - if (!m_using_extended_keys && !(table_flags() & HA_CMP_REF_IS_EXPENSIVE)) + if (!m_using_extended_keys && !(table_flags() & HA_SLOW_CMP_REF)) cmp_func= cmp_key_rowid_part_id; else cmp_func= cmp_key_part_id; @@ -5759,12 +5761,6 @@ int ha_partition::index_read_idx_map(uchar *buf, uint index, get_partition_set(table, buf, index, &m_start_key, &m_part_spec); - /* - We have either found exactly 1 partition - (in which case start_part == end_part) - or no matching partitions (start_part > end_part) - */ - DBUG_ASSERT(m_part_spec.start_part >= m_part_spec.end_part); /* The start part is must be marked as used. */ DBUG_ASSERT(m_part_spec.start_part > m_part_spec.end_part || bitmap_is_set(&(m_part_info->read_partitions), @@ -6266,19 +6262,22 @@ ha_rows ha_partition::multi_range_read_info_const(uint keyno, uint ret_mrr_mode= 0; range_seq_t seq_it; part_id_range save_part_spec; + Cost_estimate part_cost; DBUG_ENTER("ha_partition::multi_range_read_info_const"); DBUG_PRINT("enter", ("partition this: %p", this)); m_mrr_new_full_buffer_size= 0; save_part_spec= m_part_spec; + cost->reset(); + seq_it= seq->init(seq_init_param, n_ranges, *mrr_mode); if (unlikely((error= multi_range_key_create_key(seq, seq_it)))) { if (likely(error == HA_ERR_END_OF_FILE)) // No keys in range { rows= 0; - goto calc_cost; + goto end; } /* This error means that we can't do multi_range_read for the moment @@ -6307,18 +6306,20 @@ ha_rows ha_partition::multi_range_read_info_const(uint keyno, ha_rows tmp_rows; uint tmp_mrr_mode; m_mrr_buffer_size[i]= 0; + part_cost.reset(); tmp_mrr_mode= *mrr_mode; tmp_rows= (*file)-> multi_range_read_info_const(keyno, &m_part_seq_if, &m_partition_part_key_multi_range_hld[i], m_part_mrr_range_length[i], &m_mrr_buffer_size[i], - &tmp_mrr_mode, cost); + &tmp_mrr_mode, &part_cost); if (tmp_rows == HA_POS_ERROR) { m_part_spec= save_part_spec; DBUG_RETURN(HA_POS_ERROR); } + cost->add(&part_cost); rows+= tmp_rows; ret_mrr_mode|= tmp_mrr_mode; m_mrr_new_full_buffer_size+= m_mrr_buffer_size[i]; @@ -6326,15 +6327,8 @@ ha_rows ha_partition::multi_range_read_info_const(uint keyno, } while (*(++file)); *mrr_mode= ret_mrr_mode; -calc_cost: +end: m_part_spec= save_part_spec; - cost->reset(); - cost->avg_io_cost= 1; - if ((*mrr_mode & HA_MRR_INDEX_ONLY) && rows > 2) - cost->io_count= keyread_time(keyno, n_ranges, (uint) rows); - else - cost->io_count= read_time(keyno, n_ranges, rows); - cost->cpu_cost= (double) rows / TIME_FOR_COMPARE + 0.01; DBUG_RETURN(rows); } @@ -6347,10 +6341,13 @@ ha_rows ha_partition::multi_range_read_info(uint keyno, uint n_ranges, { uint i; handler **file; - ha_rows rows; + ha_rows rows= 0; + Cost_estimate part_cost; DBUG_ENTER("ha_partition::multi_range_read_info"); DBUG_PRINT("enter", ("partition this: %p", this)); + cost->reset(); + m_mrr_new_full_buffer_size= 0; file= m_file; do @@ -6358,22 +6355,20 @@ ha_rows ha_partition::multi_range_read_info(uint keyno, uint n_ranges, i= (uint)(file - m_file); if (bitmap_is_set(&(m_part_info->read_partitions), (i))) { + ha_rows tmp_rows; m_mrr_buffer_size[i]= 0; - if ((rows= (*file)->multi_range_read_info(keyno, n_ranges, keys, - key_parts, - &m_mrr_buffer_size[i], - mrr_mode, cost))) + part_cost.reset(); + if ((tmp_rows= (*file)->multi_range_read_info(keyno, n_ranges, keys, + key_parts, + &m_mrr_buffer_size[i], + mrr_mode, &part_cost))) DBUG_RETURN(rows); + cost->add(&part_cost); + rows+= tmp_rows; m_mrr_new_full_buffer_size+= m_mrr_buffer_size[i]; } } while (*(++file)); - cost->reset(); - cost->avg_io_cost= 1; - if (*mrr_mode & HA_MRR_INDEX_ONLY) - cost->io_count= keyread_time(keyno, n_ranges, (uint) rows); - else - cost->io_count= read_time(keyno, n_ranges, rows); DBUG_RETURN(0); } @@ -6815,7 +6810,7 @@ FT_INFO *ha_partition::ft_init_ext(uint flags, uint inx, String *key) sizeof(FT_INFO *) * m_tot_parts, NullS))) { - my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATALERROR)); + my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATAL)); DBUG_RETURN(NULL); } ft_target->part_ft_info= tmp_ft_info; @@ -9342,6 +9337,43 @@ double ha_partition::scan_time() /** + @brief + Caculate time to scan the given index (index only scan) + + @param inx Index number to scan + + @return time for scanning index inx +*/ + +double ha_partition::key_scan_time(uint inx) +{ + double scan_time= 0; + uint i; + DBUG_ENTER("ha_partition::key_scan_time"); + for (i= bitmap_get_first_set(&m_part_info->read_partitions); + i < m_tot_parts; + i= bitmap_get_next_set(&m_part_info->read_partitions, i)) + scan_time+= m_file[i]->key_scan_time(inx); + DBUG_RETURN(scan_time); +} + + +double ha_partition::keyread_time(uint inx, uint ranges, ha_rows rows) +{ + double read_time= 0; + uint i; + DBUG_ENTER("ha_partition::keyread_time"); + if (!ranges) + DBUG_RETURN(handler::keyread_time(inx, ranges, rows)); + for (i= bitmap_get_first_set(&m_part_info->read_partitions); + i < m_tot_parts; + i= bitmap_get_next_set(&m_part_info->read_partitions, i)) + read_time+= m_file[i]->keyread_time(inx, ranges, rows); + DBUG_RETURN(read_time); +} + + +/** Find number of records in a range. @param inx Index number @param min_key Start of range @@ -9778,7 +9810,7 @@ void ha_partition::print_error(int error, myf errflag) append_row_to_str(str); /* Log this error, so the DBA can notice it and fix it! */ - sql_print_error("Table '%-192s' corrupted: row in wrong partition: %s\n" + sql_print_error("Table '%-192s' corrupted: row in wrong partition: %s" "Please REPAIR the table!", table->s->table_name.str, str.c_ptr_safe()); @@ -10695,8 +10727,6 @@ int ha_partition::check_misplaced_rows(uint read_part_id, bool do_repair) { /* Only need to read the partitioning fields. */ bitmap_union(table->read_set, &m_part_info->full_part_field_set); - if (table->vcol_set) - bitmap_union(table->vcol_set, &m_part_info->full_part_field_set); } if ((result= m_file[read_part_id]->ha_rnd_init(1))) |