Commit dabe8397 authored by unknown's avatar unknown

Merge mronstrom@bk-internal.mysql.com:/home/bk/mysql-5.1-new

into  c-3d08e253.1238-1-64736c10.cust.bredbandsbolaget.se:/home/pappa/bug19067


mysql-test/t/partition.test:
  Auto merged
sql/partition_info.cc:
  Auto merged
sql/sql_partition.cc:
  Auto merged
sql/sql_show.cc:
  Auto merged
sql/sql_table.cc:
  Auto merged
mysql-test/r/partition.result:
  SCCS merged
parents f2b4338f 5479f8de
...@@ -3,6 +3,23 @@ create table t1 (a int) ...@@ -3,6 +3,23 @@ create table t1 (a int)
partition by key(a) partition by key(a)
(partition p0 engine = MEMORY); (partition p0 engine = MEMORY);
drop table t1; drop table t1;
create table t1 (a int)
partition by range (a)
subpartition by key (a)
(partition p0 values less than (1));
alter table t1 add partition (partition p1 values less than (2));
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (a) SUBPARTITION BY KEY (a) (PARTITION p0 VALUES LESS THAN (1) ENGINE = MyISAM, PARTITION p1 VALUES LESS THAN (2) ENGINE = MyISAM)
alter table t1 reorganize partition p1 into (partition p1 values less than (3));
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (a) SUBPARTITION BY KEY (a) (PARTITION p0 VALUES LESS THAN (1) ENGINE = MyISAM, PARTITION p1 VALUES LESS THAN (3) ENGINE = MyISAM)
drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
a int not null, a int not null,
b int not null, b int not null,
...@@ -574,7 +591,7 @@ show create table t1; ...@@ -574,7 +591,7 @@ show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL `a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (a) SUBPARTITION BY HASH (a) (PARTITION p0 VALUES LESS THAN (100) ) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (a) SUBPARTITION BY HASH (a) (PARTITION p0 VALUES LESS THAN (100) ENGINE = MyISAM)
alter table t1 add partition (partition p1 values less than (200) alter table t1 add partition (partition p1 values less than (200)
(subpartition subpart21)); (subpartition subpart21));
show create table t1; show create table t1;
......
...@@ -996,7 +996,7 @@ Table Create Table ...@@ -996,7 +996,7 @@ Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL, `f1` int(11) DEFAULT NULL,
`f2` char(20) DEFAULT NULL `f2` char(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (f1) SUBPARTITION BY HASH (f1) SUBPARTITIONS 2 (PARTITION part1 VALUES LESS THAN (100) , PARTITION part2 VALUES LESS THAN (2147483647) ) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (f1) SUBPARTITION BY HASH (f1) SUBPARTITIONS 2 (PARTITION part1 VALUES LESS THAN (100) ENGINE = MyISAM, PARTITION part2 VALUES LESS THAN (2147483647) ENGINE = MyISAM)
SELECT COUNT(*) = 0 AS my_value FROM t1; SELECT COUNT(*) = 0 AS my_value FROM t1;
my_value my_value
1 1
...@@ -1098,7 +1098,7 @@ Table Create Table ...@@ -1098,7 +1098,7 @@ Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL, `f1` int(11) DEFAULT NULL,
`f2` char(20) DEFAULT NULL `f2` char(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (f1) SUBPARTITION BY HASH (f1) SUBPARTITIONS 1 (PARTITION part1 VALUES LESS THAN (100) , PARTITION part2 VALUES LESS THAN (2147483647) ) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (f1) SUBPARTITION BY HASH (f1) SUBPARTITIONS 1 (PARTITION part1 VALUES LESS THAN (100) ENGINE = MyISAM, PARTITION part2 VALUES LESS THAN (2147483647) ENGINE = MyISAM)
SELECT COUNT(*) = 0 AS my_value FROM t1; SELECT COUNT(*) = 0 AS my_value FROM t1;
my_value my_value
1 1
......
...@@ -14,6 +14,19 @@ partition by key(a) ...@@ -14,6 +14,19 @@ partition by key(a)
(partition p0 engine = MEMORY); (partition p0 engine = MEMORY);
drop table t1; drop table t1;
#
# BUG 19067 ALTER TABLE .. ADD PARTITION for subpartitioned table crashes
#
create table t1 (a int)
partition by range (a)
subpartition by key (a)
(partition p0 values less than (1));
alter table t1 add partition (partition p1 values less than (2));
show create table t1;
alter table t1 reorganize partition p1 into (partition p1 values less than (3));
show create table t1;
drop table t1;
# #
# Partition by key no partition defined => OK # Partition by key no partition defined => OK
# #
......
...@@ -67,5 +67,21 @@ public: ...@@ -67,5 +67,21 @@ public:
subpartitions.empty(); subpartitions.empty();
list_val_list.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() {} ~partition_element() {}
}; };
...@@ -267,7 +267,7 @@ bool partition_info::set_up_default_subpartitions(handler *file, ...@@ -267,7 +267,7 @@ bool partition_info::set_up_default_subpartitions(handler *file,
j= 0; j= 0;
do do
{ {
partition_element *subpart_elem= new partition_element(); partition_element *subpart_elem= new partition_element(part_elem);
if (likely(subpart_elem != 0 && if (likely(subpart_elem != 0 &&
(!part_elem->subpartitions.push_back(subpart_elem)))) (!part_elem->subpartitions.push_back(subpart_elem))))
{ {
...@@ -736,6 +736,8 @@ bool partition_info::check_partition_info(handlerton **eng_type, ...@@ -736,6 +736,8 @@ bool partition_info::check_partition_info(handlerton **eng_type,
do do
{ {
partition_element *part_elem= part_it++; partition_element *part_elem= part_it++;
if (part_elem->engine_type == NULL)
part_elem->engine_type= default_engine_type;
if (!is_sub_partitioned()) if (!is_sub_partitioned())
{ {
if (check_table_name(part_elem->partition_name, if (check_table_name(part_elem->partition_name,
...@@ -744,8 +746,6 @@ bool partition_info::check_partition_info(handlerton **eng_type, ...@@ -744,8 +746,6 @@ bool partition_info::check_partition_info(handlerton **eng_type,
my_error(ER_WRONG_PARTITION_NAME, MYF(0)); my_error(ER_WRONG_PARTITION_NAME, MYF(0));
goto end; goto end;
} }
if (part_elem->engine_type == NULL)
part_elem->engine_type= default_engine_type;
DBUG_PRINT("info", ("engine = %d", DBUG_PRINT("info", ("engine = %d",
ha_legacy_type(part_elem->engine_type))); ha_legacy_type(part_elem->engine_type)));
engine_array[part_count++]= part_elem->engine_type; engine_array[part_count++]= part_elem->engine_type;
...@@ -756,18 +756,18 @@ bool partition_info::check_partition_info(handlerton **eng_type, ...@@ -756,18 +756,18 @@ bool partition_info::check_partition_info(handlerton **eng_type,
List_iterator<partition_element> sub_it(part_elem->subpartitions); List_iterator<partition_element> sub_it(part_elem->subpartitions);
do do
{ {
part_elem= sub_it++; partition_element *sub_elem= sub_it++;
if (check_table_name(part_elem->partition_name, if (check_table_name(sub_elem->partition_name,
strlen(part_elem->partition_name))) strlen(sub_elem->partition_name)))
{ {
my_error(ER_WRONG_PARTITION_NAME, MYF(0)); my_error(ER_WRONG_PARTITION_NAME, MYF(0));
goto end; goto end;
} }
if (part_elem->engine_type == NULL) if (sub_elem->engine_type == NULL)
part_elem->engine_type= default_engine_type; sub_elem->engine_type= default_engine_type;
DBUG_PRINT("info", ("engine = %u", DBUG_PRINT("info", ("engine = %u",
ha_legacy_type(part_elem->engine_type))); ha_legacy_type(sub_elem->engine_type)));
engine_array[part_count++]= part_elem->engine_type; engine_array[part_count++]= sub_elem->engine_type;
} while (++j < no_subparts); } while (++j < no_subparts);
} }
} while (++i < no_parts); } while (++i < no_parts);
......
...@@ -1754,7 +1754,6 @@ end: ...@@ -1754,7 +1754,6 @@ end:
buf_length A pointer to the returned buffer length buf_length A pointer to the returned buffer length
use_sql_alloc Allocate buffer from sql_alloc if true use_sql_alloc Allocate buffer from sql_alloc if true
otherwise use my_malloc otherwise use my_malloc
write_all Write everything, also default values
RETURN VALUES RETURN VALUES
NULL error NULL error
...@@ -1782,8 +1781,7 @@ end: ...@@ -1782,8 +1781,7 @@ end:
char *generate_partition_syntax(partition_info *part_info, char *generate_partition_syntax(partition_info *part_info,
uint *buf_length, uint *buf_length,
bool use_sql_alloc, bool use_sql_alloc)
bool write_all)
{ {
uint i,j, tot_no_parts, no_subparts, no_parts; uint i,j, tot_no_parts, no_subparts, no_parts;
partition_element *part_elem; partition_element *part_elem;
...@@ -1865,7 +1863,7 @@ char *generate_partition_syntax(partition_info *part_info, ...@@ -1865,7 +1863,7 @@ char *generate_partition_syntax(partition_info *part_info,
tot_no_parts= part_info->partitions.elements; tot_no_parts= part_info->partitions.elements;
no_subparts= part_info->no_subparts; no_subparts= part_info->no_subparts;
if (write_all || (!part_info->use_default_partitions)) if (!part_info->use_default_partitions)
{ {
bool first= TRUE; bool first= TRUE;
err+= add_begin_parenthesis(fptr); err+= add_begin_parenthesis(fptr);
...@@ -1886,10 +1884,11 @@ char *generate_partition_syntax(partition_info *part_info, ...@@ -1886,10 +1884,11 @@ char *generate_partition_syntax(partition_info *part_info,
err+= add_name_string(fptr, part_elem->partition_name); err+= add_name_string(fptr, part_elem->partition_name);
err+= add_space(fptr); err+= add_space(fptr);
err+= add_partition_values(fptr, part_info, part_elem); 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); err+= add_partition_options(fptr, part_elem);
if (part_info->is_sub_partitioned() && if (part_info->is_sub_partitioned() &&
(write_all || (!part_info->use_default_subpartitions))) (!part_info->use_default_subpartitions))
{ {
err+= add_space(fptr); err+= add_space(fptr);
err+= add_begin_parenthesis(fptr); err+= add_begin_parenthesis(fptr);
...@@ -3877,6 +3876,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, ALTER_INFO *alter_info, ...@@ -3877,6 +3876,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, ALTER_INFO *alter_info,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
alt_part_info->part_type= tab_part_info->part_type; 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, if (alt_part_info->set_up_defaults_for_partitioning(table->file,
ULL(0), ULL(0),
tab_part_info->no_parts)) tab_part_info->no_parts))
...@@ -4319,6 +4319,15 @@ state of p1. ...@@ -4319,6 +4319,15 @@ state of p1.
my_error(ER_TOO_MANY_PARTITIONS_ERROR, MYF(0)); my_error(ER_TOO_MANY_PARTITIONS_ERROR, MYF(0));
DBUG_RETURN(TRUE); 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: Online handling:
REORGANIZE PARTITION: REORGANIZE PARTITION:
......
...@@ -69,8 +69,7 @@ bool check_partition_info(partition_info *part_info,handlerton **eng_type, ...@@ -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 fix_partition_func(THD *thd, const char *name, TABLE *table,
bool create_table_ind); bool create_table_ind);
char *generate_partition_syntax(partition_info *part_info, char *generate_partition_syntax(partition_info *part_info,
uint *buf_length, bool use_sql_alloc, uint *buf_length, bool use_sql_alloc);
bool write_all);
bool partition_key_modified(TABLE *table, List<Item> &fields); bool partition_key_modified(TABLE *table, List<Item> &fields);
void get_partition_set(const TABLE *table, byte *buf, const uint index, void get_partition_set(const TABLE *table, byte *buf, const uint index,
const key_range *key_spec, const key_range *key_spec,
......
...@@ -1326,7 +1326,7 @@ store_create_info(THD *thd, TABLE_LIST *table_list, String *packet, ...@@ -1326,7 +1326,7 @@ store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
(!table->part_info->is_auto_partitioned) && (!table->part_info->is_auto_partitioned) &&
((part_syntax= generate_partition_syntax(table->part_info, ((part_syntax= generate_partition_syntax(table->part_info,
&part_syntax_len, &part_syntax_len,
FALSE,FALSE)))) FALSE))))
{ {
packet->append(part_syntax, part_syntax_len); packet->append(part_syntax, part_syntax_len);
my_free(part_syntax, MYF(0)); my_free(part_syntax, MYF(0));
......
...@@ -1231,7 +1231,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) ...@@ -1231,7 +1231,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
{ {
if (!(part_syntax_buf= generate_partition_syntax(part_info, if (!(part_syntax_buf= generate_partition_syntax(part_info,
&syntax_len, &syntax_len,
TRUE, FALSE))) TRUE)))
{ {
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
...@@ -3151,7 +3151,7 @@ bool mysql_create_table_internal(THD *thd, ...@@ -3151,7 +3151,7 @@ bool mysql_create_table_internal(THD *thd,
*/ */
if (!(part_syntax_buf= generate_partition_syntax(part_info, if (!(part_syntax_buf= generate_partition_syntax(part_info,
&syntax_len, &syntax_len,
TRUE, FALSE))) TRUE)))
goto err; goto err;
part_info->part_info_string= part_syntax_buf; part_info->part_info_string= part_syntax_buf;
part_info->part_info_len= syntax_len; part_info->part_info_len= syntax_len;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment