From: holyfoot Date: December 15 2005 11:24am Subject: bk commit into 5.1 tree (holyfoot:1.1964) BUG#15521 List-Archive: http://lists.mysql.com/commits/172 X-Bug: 15521 Message-Id: <200512151124.jBFBOib4011888@localhost.localdomain> Below is the list of changes that have just been committed into a local 5.1 repository of hf. When hf does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet 1.1964 05/12/15 15:24:35 holyfoot@deer.(none) +7 -0 bug #15521 (Cannot reorganise a partition with a new name equal to the old name) sql/sql_table.cc 1.284 05/12/15 15:22:59 holyfoot@stripped +3 -1 now we call check_reorganise_list to do proper test. Also we should set right no_parts value as it can change here sql/sql_partition.cc 1.16 05/12/15 15:22:59 holyfoot@stripped +55 -0 check_reorganise_list implementation sql/handler.h 1.170 05/12/15 15:22:59 holyfoot@stripped +3 -0 check_reorganise_list interface mysql-test/t/partition_mgm_err.test 1.2 05/12/15 15:22:59 holyfoot@stripped +1 -1 test modified to produce the declared error mysql-test/t/partition.test 1.8 05/12/15 15:22:59 holyfoot@stripped +31 -0 test case added mysql-test/r/partition_mgm_err.result 1.2 05/12/15 15:22:59 holyfoot@stripped +1 -1 result fixed mysql-test/r/partition.result 1.8 05/12/15 15:22:59 holyfoot@stripped +34 -0 result fixed # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: holyfoot # Host: deer.(none) # Root: /home/hf/work/mysql-5.1.clean --- 1.169/sql/handler.h Mon Nov 28 23:07:10 2005 +++ 1.170/sql/handler.h Thu Dec 15 15:22:59 2005 @@ -717,6 +717,9 @@ bool is_partition_in_list(char *part_name, List list_part_names); bool is_partitions_in_table(partition_info *new_part_info, partition_info *old_part_info); +bool check_reorganise_list(partition_info *new_part_info, + partition_info *old_part_info, + List list_part_names); bool set_up_defaults_for_partitioning(partition_info *part_info, handler *file, ulonglong max_rows, --- 1.283/sql/sql_table.cc Wed Dec 7 18:17:10 2005 +++ 1.284/sql/sql_table.cc Thu Dec 15 15:22:59 2005 @@ -3832,7 +3832,8 @@ my_error(ER_ONLY_ON_RANGE_LIST_PARTITION, MYF(0), "REORGANISE"); DBUG_RETURN(TRUE); } - if (is_partitions_in_table(alt_part_info, tab_part_info)) + if (check_reorganise_list(alt_part_info, tab_part_info, + alter_info->partition_names)) { my_error(ER_SAME_NAME_PARTITION, MYF(0)); DBUG_RETURN(TRUE); @@ -3901,6 +3902,7 @@ } } partition_changed= TRUE; + tab_part_info->no_parts= tab_part_info->partitions.elements; create_info->db_type= DB_TYPE_PARTITION_DB; thd->lex->part_info= tab_part_info; if (alter_info->flags == ALTER_ADD_PARTITION || --- 1.7/mysql-test/r/partition.result Tue Nov 22 03:20:54 2005 +++ 1.8/mysql-test/r/partition.result Thu Dec 15 15:22:59 2005 @@ -114,3 +114,37 @@ SELECT * FROM t1; id drop table t1; +create table t1 +(a int) +partition by range (a) +( partition p0 values less than(10), +partition p1 values less than (20), +partition p2 values less than maxvalue); +alter table t1 reorganise partition p2 into (partition p2 values less than (30)); +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) (PARTITION p0 VALUES LESS THAN (10) ENGINE = MyISAM, PARTITION p1 VALUES LESS THAN (20) ENGINE = MyISAM, PARTITION p2 VALUES LESS THAN (30) ENGINE = MyISAM) +drop table t1; +CREATE TABLE t1 (a int, b int) +PARTITION BY RANGE (a) +(PARTITION x0 VALUES LESS THAN (2), +PARTITION x1 VALUES LESS THAN (4), +PARTITION x2 VALUES LESS THAN (6), +PARTITION x3 VALUES LESS THAN (8), +PARTITION x4 VALUES LESS THAN (10), +PARTITION x5 VALUES LESS THAN (12), +PARTITION x6 VALUES LESS THAN (14), +PARTITION x7 VALUES LESS THAN (16), +PARTITION x8 VALUES LESS THAN (18), +PARTITION x9 VALUES LESS THAN (20)); +ALTER TABLE t1 REORGANISE PARTITION x0,x1,x2 INTO +(PARTITION x1 VALUES LESS THAN (6)); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) default NULL, + `b` int(11) default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (a) (PARTITION x1 VALUES LESS THAN (6) ENGINE = MyISAM, PARTITION x3 VALUES LESS THAN (8) ENGINE = MyISAM, PARTITION x4 VALUES LESS THAN (10) ENGINE = MyISAM, PARTITION x5 VALUES LESS THAN (12) ENGINE = MyISAM, PARTITION x6 VALUES LESS THAN (14) ENGINE = MyISAM, PARTITION x7 VALUES LESS THAN (16) ENGINE = MyISAM, PARTITION x8 VALUES LESS THAN (18) ENGINE = MyISAM, PARTITION x9 VALUES LESS THAN (20) ENGINE = MyISAM) +drop table t1; --- 1.7/mysql-test/t/partition.test Tue Nov 22 03:20:54 2005 +++ 1.8/mysql-test/t/partition.test Thu Dec 15 15:22:59 2005 @@ -172,3 +172,34 @@ drop table t1; +# +# BUG 15221 (Cannot reorganize with the same name) +# +create table t1 +(a int) +partition by range (a) + ( partition p0 values less than(10), + partition p1 values less than (20), + partition p2 values less than maxvalue); + +alter table t1 reorganise partition p2 into (partition p2 values less than (30)); +show create table t1; +drop table t1; + +CREATE TABLE t1 (a int, b int) +PARTITION BY RANGE (a) +(PARTITION x0 VALUES LESS THAN (2), + PARTITION x1 VALUES LESS THAN (4), + PARTITION x2 VALUES LESS THAN (6), + PARTITION x3 VALUES LESS THAN (8), + PARTITION x4 VALUES LESS THAN (10), + PARTITION x5 VALUES LESS THAN (12), + PARTITION x6 VALUES LESS THAN (14), + PARTITION x7 VALUES LESS THAN (16), + PARTITION x8 VALUES LESS THAN (18), + PARTITION x9 VALUES LESS THAN (20)); + +ALTER TABLE t1 REORGANISE PARTITION x0,x1,x2 INTO +(PARTITION x1 VALUES LESS THAN (6)); +show create table t1; +drop table t1; --- 1.15/sql/sql_partition.cc Sat Nov 26 08:16:18 2005 +++ 1.16/sql/sql_partition.cc Thu Dec 15 15:22:59 2005 @@ -190,6 +190,61 @@ /* + Check that the reorganized table will not have duplicate partitions. + + SYNOPSIS + check_reorganise_list() + new_part_info New partition info + old_part_info Old partition info + list_part_names The list of partition names that will go away and can be reused in the + new table. + + RETURN VALUES + TRUE Inacceptable name conflict detected. + FALSE New names are OK. + + DESCRIPTION + Can handle that the 'new_part_info' and 'old_part_info' the same + in which case it checks that the list of names in the partitions + doesn't contain any duplicated names. +*/ + +bool check_reorganise_list(partition_info *new_part_info, + partition_info *old_part_info, + List list_part_names) +{ + uint new_count, old_count; + uint no_new_parts= new_part_info->partitions.elements; + uint no_old_parts= old_part_info->partitions.elements; + List_iterator new_parts_it(new_part_info->partitions); + bool same_part_info= (new_part_info == old_part_info); + DBUG_ENTER("check_reorganise_list"); + + new_count= 0; + do + { + List_iterator old_parts_it(old_part_info->partitions); + char *new_name= (new_parts_it++)->partition_name; + new_count++; + old_count= 0; + do + { + char *old_name= (old_parts_it++)->partition_name; + old_count++; + if (same_part_info && old_count == new_count) + break; + if (!(my_strcasecmp(system_charset_info, old_name, new_name))) + { + if (!is_partition_in_list(old_name, list_part_names)) + DBUG_RETURN(TRUE); + } + } while (old_count < no_old_parts); + } while (new_count < no_new_parts); + DBUG_RETURN(FALSE); +} + + +/* A useful routine used by update_row for partition handlers to calculate the partition ids of the old and the new record. SYNOPSIS --- 1.1/mysql-test/r/partition_mgm_err.result Fri Aug 19 19:24:19 2005 +++ 1.2/mysql-test/r/partition_mgm_err.result Thu Dec 15 15:22:59 2005 @@ -26,7 +26,7 @@ (PARTITION x11 VALUES LESS THAN (22)); ERROR HY000: More partitions to reorganise than there are partitions ALTER TABLE t1 REORGANISE PARTITION x0,x1,x2 INTO -(PARTITION x1 VALUES LESS THAN (6)); +(PARTITION x3 VALUES LESS THAN (6)); ERROR HY000: All partitions must have unique names in the table ALTER TABLE t1 REORGANISE PARTITION x0, x2 INTO (PARTITION x11 VALUES LESS THAN (2)); --- 1.1/mysql-test/t/partition_mgm_err.test Fri Aug 19 19:24:09 2005 +++ 1.2/mysql-test/t/partition_mgm_err.test Thu Dec 15 15:22:59 2005 @@ -43,7 +43,7 @@ --error ER_SAME_NAME_PARTITION ALTER TABLE t1 REORGANISE PARTITION x0,x1,x2 INTO -(PARTITION x1 VALUES LESS THAN (6)); +(PARTITION x3 VALUES LESS THAN (6)); --error ER_CONSECUTIVE_REORG_PARTITIONS ALTER TABLE t1 REORGANISE PARTITION x0, x2 INTO