diff options
author | unknown <mikael@c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se> | 2006-04-21 09:22:13 -0400 |
---|---|---|
committer | unknown <mikael@c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se> | 2006-04-21 09:22:13 -0400 |
commit | 10f571384d491cc5a11554a5eed37f1b0c591114 (patch) | |
tree | 6a955e4563e02f5f6fe38ebc6841fe37d514acdb /sql | |
parent | 17e3ee35531d0003de31093570e64f604bd8c4fa (diff) | |
parent | 661537c744232bb2e110bf9e8973deb962d2a72b (diff) | |
download | mariadb-git-10f571384d491cc5a11554a5eed37f1b0c591114.tar.gz |
Merge mronstrom@bk-internal.mysql.com:/home/bk/bugs/bug19067
into c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se:/home/pappa/bug19067
Diffstat (limited to 'sql')
-rw-r--r-- | sql/partition_element.h | 16 | ||||
-rw-r--r-- | sql/partition_info.cc | 68 | ||||
-rw-r--r-- | sql/partition_info.h | 2 | ||||
-rw-r--r-- | sql/sql_partition.cc | 23 | ||||
-rw-r--r-- | sql/sql_partition.h | 3 | ||||
-rw-r--r-- | sql/sql_show.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 4 |
7 files changed, 83 insertions, 35 deletions
diff --git a/sql/partition_element.h b/sql/partition_element.h index d20715d2408..51a54771ee3 100644 --- a/sql/partition_element.h +++ b/sql/partition_element.h @@ -63,5 +63,21 @@ public: subpartitions.empty(); list_val_list.empty(); } + partition_element(partition_element *part_elem) + : partition_name(NULL), range_value(0), has_null_value(FALSE) + { + subpartitions.empty(); + list_val_list.empty(); + + part_max_rows= part_elem->part_max_rows; + part_min_rows= part_elem->part_min_rows; + tablespace_name= part_elem->tablespace_name; + part_comment= part_elem->part_comment; + data_file_name= part_elem->data_file_name; + index_file_name= part_elem->index_file_name; + engine_type= part_elem->engine_type; + part_state= part_elem->part_state; + nodegroup_id= part_elem->nodegroup_id; + } ~partition_element() {} }; diff --git a/sql/partition_info.cc b/sql/partition_info.cc index e2bf37d6ef3..01fe5aaf500 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -91,7 +91,7 @@ partition_info *partition_info::get_clone() #define MAX_PART_NAME_SIZE 16 char *partition_info::create_default_partition_names(uint part_no, uint no_parts, - uint start_no, bool is_subpart) + uint start_no) { char *ptr= sql_calloc(no_parts*MAX_PART_NAME_SIZE); char *move_ptr= ptr; @@ -102,10 +102,7 @@ char *partition_info::create_default_partition_names(uint part_no, uint no_parts { do { - if (is_subpart) - my_sprintf(move_ptr, (move_ptr,"p%usp%u", part_no, (start_no + i))); - else - my_sprintf(move_ptr, (move_ptr,"p%u", (start_no + i))); + my_sprintf(move_ptr, (move_ptr,"p%u", (start_no + i))); move_ptr+=MAX_PART_NAME_SIZE; } while (++i < no_parts); } @@ -118,6 +115,35 @@ char *partition_info::create_default_partition_names(uint part_no, uint no_parts /* + Create a unique name for the subpartition as part_name'sp''subpart_no' + SYNOPSIS + create_subpartition_name() + subpart_no Number of subpartition + part_name Name of partition + RETURN VALUES + >0 A reference to the created name string + 0 Memory allocation error +*/ + +char *create_subpartition_name(uint subpart_no, const char *part_name) +{ + uint size_alloc= strlen(part_name) + MAX_PART_NAME_SIZE; + char *ptr= sql_calloc(size_alloc); + DBUG_ENTER("create_subpartition_name"); + + if (likely(ptr != NULL)) + { + my_sprintf(ptr, (ptr, "%ssp%u", part_name, subpart_no)); + } + else + { + mem_alloc_error(size_alloc); + } + DBUG_RETURN(ptr); +} + + +/* Set up all the default partitions not set-up by the user in the SQL statement. Also perform a number of checks that the user hasn't tried to use default values where no defaults exists. @@ -167,8 +193,7 @@ bool partition_info::set_up_default_partitions(handler *file, ulonglong max_rows goto end; } if (unlikely((!(default_name= create_default_partition_names(0, no_parts, - start_no, - FALSE))))) + start_no))))) goto end; i= 0; do @@ -238,18 +263,17 @@ bool partition_info::set_up_default_subpartitions(handler *file, { part_elem= part_it++; j= 0; - name_ptr= create_default_partition_names(i, no_subparts, (uint)0, TRUE); - if (unlikely(!name_ptr)) - goto end; do { - partition_element *subpart_elem= new partition_element(); + partition_element *subpart_elem= new partition_element(part_elem); if (likely(subpart_elem != 0 && (!part_elem->subpartitions.push_back(subpart_elem)))) { + char *ptr= create_subpartition_name(j, part_elem->partition_name); + if (!ptr) + goto end; subpart_elem->engine_type= default_engine_type; - subpart_elem->partition_name= name_ptr; - name_ptr+= MAX_PART_NAME_SIZE; + subpart_elem->partition_name= ptr; } else { @@ -694,6 +718,8 @@ bool partition_info::check_partition_info(handlerton **eng_type, do { partition_element *part_elem= part_it++; + if (part_elem->engine_type == NULL) + part_elem->engine_type= default_engine_type; if (!is_sub_partitioned()) { if (check_table_name(part_elem->partition_name, @@ -702,8 +728,6 @@ bool partition_info::check_partition_info(handlerton **eng_type, my_error(ER_WRONG_PARTITION_NAME, MYF(0)); goto end; } - if (part_elem->engine_type == NULL) - part_elem->engine_type= default_engine_type; DBUG_PRINT("info", ("engine = %d", ha_legacy_type(part_elem->engine_type))); engine_array[part_count++]= part_elem->engine_type; @@ -714,18 +738,18 @@ bool partition_info::check_partition_info(handlerton **eng_type, List_iterator<partition_element> sub_it(part_elem->subpartitions); do { - part_elem= sub_it++; - if (check_table_name(part_elem->partition_name, - strlen(part_elem->partition_name))) + partition_element *sub_elem= sub_it++; + if (check_table_name(sub_elem->partition_name, + strlen(sub_elem->partition_name))) { my_error(ER_WRONG_PARTITION_NAME, MYF(0)); goto end; } - if (part_elem->engine_type == NULL) - part_elem->engine_type= default_engine_type; + if (sub_elem->engine_type == NULL) + sub_elem->engine_type= default_engine_type; DBUG_PRINT("info", ("engine = %u", - ha_legacy_type(part_elem->engine_type))); - engine_array[part_count++]= part_elem->engine_type; + ha_legacy_type(sub_elem->engine_type))); + engine_array[part_count++]= sub_elem->engine_type; } while (++j < no_subparts); } } while (++i < no_parts); diff --git a/sql/partition_info.h b/sql/partition_info.h index 664c8834b0b..ecba048c486 100644 --- a/sql/partition_info.h +++ b/sql/partition_info.h @@ -256,7 +256,7 @@ private: uint start_no); bool set_up_default_subpartitions(handler *file, ulonglong max_rows); char *create_default_partition_names(uint part_no, uint no_parts, - uint start_no, bool is_subpart); + uint start_no); bool has_unique_name(partition_element *element); }; diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index aae80f07b71..a657e22616e 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -1754,7 +1754,6 @@ end: buf_length A pointer to the returned buffer length use_sql_alloc Allocate buffer from sql_alloc if true otherwise use my_malloc - write_all Write everything, also default values RETURN VALUES NULL error @@ -1782,8 +1781,7 @@ end: char *generate_partition_syntax(partition_info *part_info, uint *buf_length, - bool use_sql_alloc, - bool write_all) + bool use_sql_alloc) { uint i,j, tot_no_parts, no_subparts, no_parts; partition_element *part_elem; @@ -1869,7 +1867,7 @@ char *generate_partition_syntax(partition_info *part_info, tot_no_parts= no_parts + no_temp_parts; no_subparts= part_info->no_subparts; - if (write_all || (!part_info->use_default_partitions)) + if (!part_info->use_default_partitions) { err+= add_begin_parenthesis(fptr); i= 0; @@ -1930,10 +1928,11 @@ char *generate_partition_syntax(partition_info *part_info, err+= add_name_string(fptr, part_elem->partition_name); err+= add_space(fptr); err+= add_partition_values(fptr, part_info, part_elem); - if (!part_info->is_sub_partitioned()) + if (!part_info->is_sub_partitioned() || + part_info->use_default_subpartitions) err+= add_partition_options(fptr, part_elem); if (part_info->is_sub_partitioned() && - (write_all || (!part_info->use_default_subpartitions))) + (!part_info->use_default_subpartitions)) { err+= add_space(fptr); err+= add_begin_parenthesis(fptr); @@ -3949,6 +3948,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, ALTER_INFO *alter_info, DBUG_RETURN(TRUE); } alt_part_info->part_type= tab_part_info->part_type; + alt_part_info->subpart_type= tab_part_info->subpart_type; if (alt_part_info->set_up_defaults_for_partitioning(table->file, ULL(0), tab_part_info->no_parts)) @@ -4377,6 +4377,15 @@ state of p1. my_error(ER_TOO_MANY_PARTITIONS_ERROR, MYF(0)); DBUG_RETURN(TRUE); } + alt_part_info->part_type= tab_part_info->part_type; + alt_part_info->subpart_type= tab_part_info->subpart_type; + DBUG_ASSERT(!alt_part_info->use_default_partitions); + if (alt_part_info->set_up_defaults_for_partitioning(table->file, + ULL(0), + 0)) + { + DBUG_RETURN(TRUE); + } /* Online handling: REORGANIZE PARTITION: @@ -4513,7 +4522,7 @@ the generated partition syntax in a correct manner. tab_part_info->use_default_no_subpartitions= FALSE; } if (tab_part_info->check_partition_info((handlerton**)NULL, - table->file, ULL(0))) + table->file, ULL(0))) { DBUG_RETURN(TRUE); } diff --git a/sql/sql_partition.h b/sql/sql_partition.h index fd2c474236f..87f9a751ca3 100644 --- a/sql/sql_partition.h +++ b/sql/sql_partition.h @@ -69,8 +69,7 @@ bool check_partition_info(partition_info *part_info,handlerton **eng_type, bool fix_partition_func(THD *thd, const char *name, TABLE *table, bool create_table_ind); char *generate_partition_syntax(partition_info *part_info, - uint *buf_length, bool use_sql_alloc, - bool write_all); + uint *buf_length, bool use_sql_alloc); bool partition_key_modified(TABLE *table, List<Item> &fields); void get_partition_set(const TABLE *table, byte *buf, const uint index, const key_range *key_spec, diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 95433828a1e..f26deb6eba9 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1276,7 +1276,7 @@ store_create_info(THD *thd, TABLE_LIST *table_list, String *packet, if (table->part_info && ((part_syntax= generate_partition_syntax(table->part_info, &part_syntax_len, - FALSE,FALSE)))) + FALSE)))) { packet->append(part_syntax, part_syntax_len); my_free(part_syntax, MYF(0)); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 6cc2ad266e5..f23b664126e 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -323,7 +323,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) part_info->part_state_len= 0; if (!(part_syntax_buf= generate_partition_syntax(part_info, &syntax_len, - TRUE, FALSE))) + TRUE))) { DBUG_RETURN(TRUE); } @@ -2159,7 +2159,7 @@ bool mysql_create_table_internal(THD *thd, */ if (!(part_syntax_buf= generate_partition_syntax(part_info, &syntax_len, - TRUE, FALSE))) + TRUE))) goto err; part_info->part_info_string= part_syntax_buf; part_info->part_info_len= syntax_len; |