Loading mysql-test/r/partition_pruning.result +5 −5 Original line number Diff line number Diff line Loading @@ -596,7 +596,7 @@ f_int1 NULL explain partitions select * from t1 where f_int1 is null; id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 part4_p2sp0 system NULL NULL NULL NULL 1 1 SIMPLE t1 part4_part4sp0 system NULL NULL NULL NULL 1 drop table t1; create table t1 (a int not null, b int not null) partition by list(a) Loading Loading @@ -625,16 +625,16 @@ insert into t1 values (1,1),(1,2),(1,3),(1,4), (2,1),(2,2),(2,3),(2,4), (NULL,1); explain partitions select * from t1 where a IS NULL AND (b=1 OR b=2); id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 pn_p3sp0,pn_p3sp1 system NULL NULL NULL NULL 1 1 SIMPLE t1 pn_pnsp0,pn_pnsp1 system NULL NULL NULL NULL 1 explain partitions select * from t1 where (a IS NULL or a < 1) AND (b=1 OR b=2); id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 pn_p3sp0,pn_p3sp1 system NULL NULL NULL NULL 1 1 SIMPLE t1 pn_pnsp0,pn_pnsp1 system NULL NULL NULL NULL 1 explain partitions select * from t1 where (a IS NULL or a < 2) AND (b=1 OR b=2); id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 p0_p0sp0,p0_p0sp1,pn_p3sp0,pn_p3sp1 ALL NULL NULL NULL NULL 5 Using where 1 SIMPLE t1 p0_p0sp0,p0_p0sp1,pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL 5 Using where explain partitions select * from t1 where (a IS NULL or a <= 1) AND (b=1 OR b=2); id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 p0_p0sp0,p0_p0sp1,pn_p3sp0,pn_p3sp1 ALL NULL NULL NULL NULL 5 Using where 1 SIMPLE t1 p0_p0sp0,p0_p0sp1,pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL 5 Using where drop table t1; create table t1 ( a int) partition by list (MOD(a, 10)) ( partition p0 values in (0), partition p1 values in (1), Loading mysql-test/r/partition_range.result +24 −0 Original line number Diff line number Diff line Loading @@ -363,3 +363,27 @@ SELECT COUNT(*) FROM t1 WHERE c3 < '2000-12-31'; COUNT(*) 10 DROP TABLE t1; create table t1 (a int) partition by range (MOD(a,3)) subpartition by hash(a) subpartitions 2 (partition p0 values less than (1), partition p1 values less than (2), partition p2 values less than (3), partition p3 values less than (4)); ALTER TABLE t1 DROP PARTITION p3; ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p2; drop table t1; create table t1 (a int) partition by range (MOD(a,3)) subpartition by hash(a) subpartitions 2 (partition p0 values less than (1), partition p1 values less than (2), partition p2 values less than (3), partition p3 values less than (4)); ALTER TABLE t1 DROP PARTITION p0; ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p2; drop table t1; mysql-test/t/partition_range.test +28 −0 Original line number Diff line number Diff line Loading @@ -388,3 +388,31 @@ SELECT COUNT(*) FROM t1 WHERE c3 BETWEEN '1996-12-31' AND '2000-12-31'; SELECT COUNT(*) FROM t1 WHERE c3 < '2000-12-31'; DROP TABLE t1; # # BUG 18962 Errors in DROP PARTITION # create table t1 (a int) partition by range (MOD(a,3)) subpartition by hash(a) subpartitions 2 (partition p0 values less than (1), partition p1 values less than (2), partition p2 values less than (3), partition p3 values less than (4)); ALTER TABLE t1 DROP PARTITION p3; ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p2; drop table t1; create table t1 (a int) partition by range (MOD(a,3)) subpartition by hash(a) subpartitions 2 (partition p0 values less than (1), partition p1 values less than (2), partition p2 values less than (3), partition p3 values less than (4)); ALTER TABLE t1 DROP PARTITION p0; ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p2; drop table t1; sql/partition_info.cc +38 −13 Original line number Diff line number Diff line Loading @@ -88,10 +88,10 @@ partition_info *partition_info::get_clone() The external routine needing this code is check_partition_info */ #define MAX_PART_NAME_SIZE 16 #define MAX_PART_NAME_SIZE 8 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; Loading @@ -102,9 +102,6 @@ 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))); move_ptr+=MAX_PART_NAME_SIZE; } while (++i < no_parts); Loading @@ -117,6 +114,36 @@ 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 *partition_info::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 Loading Loading @@ -167,8 +194,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 Loading Loading @@ -238,18 +264,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(); 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 { Loading sql/partition_info.h +2 −1 Original line number Diff line number Diff line Loading @@ -256,7 +256,8 @@ class partition_info : public Sql_alloc 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); char *create_subpartition_name(uint subpart_no, const char *part_name); bool has_unique_name(partition_element *element); }; Loading Loading
mysql-test/r/partition_pruning.result +5 −5 Original line number Diff line number Diff line Loading @@ -596,7 +596,7 @@ f_int1 NULL explain partitions select * from t1 where f_int1 is null; id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 part4_p2sp0 system NULL NULL NULL NULL 1 1 SIMPLE t1 part4_part4sp0 system NULL NULL NULL NULL 1 drop table t1; create table t1 (a int not null, b int not null) partition by list(a) Loading Loading @@ -625,16 +625,16 @@ insert into t1 values (1,1),(1,2),(1,3),(1,4), (2,1),(2,2),(2,3),(2,4), (NULL,1); explain partitions select * from t1 where a IS NULL AND (b=1 OR b=2); id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 pn_p3sp0,pn_p3sp1 system NULL NULL NULL NULL 1 1 SIMPLE t1 pn_pnsp0,pn_pnsp1 system NULL NULL NULL NULL 1 explain partitions select * from t1 where (a IS NULL or a < 1) AND (b=1 OR b=2); id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 pn_p3sp0,pn_p3sp1 system NULL NULL NULL NULL 1 1 SIMPLE t1 pn_pnsp0,pn_pnsp1 system NULL NULL NULL NULL 1 explain partitions select * from t1 where (a IS NULL or a < 2) AND (b=1 OR b=2); id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 p0_p0sp0,p0_p0sp1,pn_p3sp0,pn_p3sp1 ALL NULL NULL NULL NULL 5 Using where 1 SIMPLE t1 p0_p0sp0,p0_p0sp1,pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL 5 Using where explain partitions select * from t1 where (a IS NULL or a <= 1) AND (b=1 OR b=2); id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 p0_p0sp0,p0_p0sp1,pn_p3sp0,pn_p3sp1 ALL NULL NULL NULL NULL 5 Using where 1 SIMPLE t1 p0_p0sp0,p0_p0sp1,pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL 5 Using where drop table t1; create table t1 ( a int) partition by list (MOD(a, 10)) ( partition p0 values in (0), partition p1 values in (1), Loading
mysql-test/r/partition_range.result +24 −0 Original line number Diff line number Diff line Loading @@ -363,3 +363,27 @@ SELECT COUNT(*) FROM t1 WHERE c3 < '2000-12-31'; COUNT(*) 10 DROP TABLE t1; create table t1 (a int) partition by range (MOD(a,3)) subpartition by hash(a) subpartitions 2 (partition p0 values less than (1), partition p1 values less than (2), partition p2 values less than (3), partition p3 values less than (4)); ALTER TABLE t1 DROP PARTITION p3; ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p2; drop table t1; create table t1 (a int) partition by range (MOD(a,3)) subpartition by hash(a) subpartitions 2 (partition p0 values less than (1), partition p1 values less than (2), partition p2 values less than (3), partition p3 values less than (4)); ALTER TABLE t1 DROP PARTITION p0; ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p2; drop table t1;
mysql-test/t/partition_range.test +28 −0 Original line number Diff line number Diff line Loading @@ -388,3 +388,31 @@ SELECT COUNT(*) FROM t1 WHERE c3 BETWEEN '1996-12-31' AND '2000-12-31'; SELECT COUNT(*) FROM t1 WHERE c3 < '2000-12-31'; DROP TABLE t1; # # BUG 18962 Errors in DROP PARTITION # create table t1 (a int) partition by range (MOD(a,3)) subpartition by hash(a) subpartitions 2 (partition p0 values less than (1), partition p1 values less than (2), partition p2 values less than (3), partition p3 values less than (4)); ALTER TABLE t1 DROP PARTITION p3; ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p2; drop table t1; create table t1 (a int) partition by range (MOD(a,3)) subpartition by hash(a) subpartitions 2 (partition p0 values less than (1), partition p1 values less than (2), partition p2 values less than (3), partition p3 values less than (4)); ALTER TABLE t1 DROP PARTITION p0; ALTER TABLE t1 DROP PARTITION p1; ALTER TABLE t1 DROP PARTITION p2; drop table t1;
sql/partition_info.cc +38 −13 Original line number Diff line number Diff line Loading @@ -88,10 +88,10 @@ partition_info *partition_info::get_clone() The external routine needing this code is check_partition_info */ #define MAX_PART_NAME_SIZE 16 #define MAX_PART_NAME_SIZE 8 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; Loading @@ -102,9 +102,6 @@ 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))); move_ptr+=MAX_PART_NAME_SIZE; } while (++i < no_parts); Loading @@ -117,6 +114,36 @@ 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 *partition_info::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 Loading Loading @@ -167,8 +194,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 Loading Loading @@ -238,18 +264,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(); 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 { Loading
sql/partition_info.h +2 −1 Original line number Diff line number Diff line Loading @@ -256,7 +256,8 @@ class partition_info : public Sql_alloc 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); char *create_subpartition_name(uint subpart_no, const char *part_name); bool has_unique_name(partition_element *element); }; Loading