diff options
author | unknown <mikael@c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se> | 2006-04-21 08:43:07 -0400 |
---|---|---|
committer | unknown <mikael@c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se> | 2006-04-21 08:43:07 -0400 |
commit | 661537c744232bb2e110bf9e8973deb962d2a72b (patch) | |
tree | 3134b1337835cddc30818d013c39e701baabfbfa /sql | |
parent | 058aa025858115fb01860dfa30ca568425292819 (diff) | |
download | mariadb-git-661537c744232bb2e110bf9e8973deb962d2a72b.tar.gz |
BUG#19067: Crash when ALTER TABLE for default subpartitioned table
mysql-test/r/partition.result:
New test cases
mysql-test/r/partition_02myisam.result:
ENGINE always specified per partition in show table
mysql-test/t/partition.test:
New test cases
sql/partition_element.h:
New copy constructor for partition_element
sql/partition_info.cc:
Use new copy constructor to ensure default subpartitions inherit partition options from parent
Ensure engine is always set on both partitions and subpartitions
sql/sql_partition.cc:
Removed unneeded bool to generate_partition_syntax
Write partition options also for subpartitioned tables when subpartitioning is by default
Set up defaults for new partitions also in REORGANIZE PARTITION
sql/sql_partition.h:
Removed unneeded parameter to generate_partition_syntax call
sql/sql_show.cc:
Removed unneeded parameter to generate_partition_syntax call
sql/sql_table.cc:
Removed unneeded parameter to generate_partition_syntax call
Diffstat (limited to 'sql')
-rw-r--r-- | sql/partition_element.h | 16 | ||||
-rw-r--r-- | sql/partition_info.cc | 6 | ||||
-rw-r--r-- | sql/sql_partition.cc | 20 | ||||
-rw-r--r-- | sql/sql_partition.h | 3 | ||||
-rw-r--r-- | sql/sql_show.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 4 |
6 files changed, 37 insertions, 14 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 3194aef8574..01fe5aaf500 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -265,7 +265,7 @@ bool partition_info::set_up_default_subpartitions(handler *file, j= 0; 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)))) { @@ -718,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, @@ -726,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; diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index be85aad608f..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); @@ -4378,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: 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; |