# # Tests for the new column list partitioning introduced in second # version for partitioning. # --source include/have_partition.inc --disable_warnings drop table if exists t1; --enable_warnings # # BUG#48164, too long partition fields causes crash # --error ER_PARTITION_FIELDS_TOO_LONG create table t1 (a varchar(1500), b varchar(1570)) partition by list column_list(a,b) ( partition p0 values in (('a','b'))); create table t1 (a varchar(1023) character set utf8 collate utf8_spanish2_ci) partition by range column_list(a) ( partition p0 values less than ('CZ'), partition p1 values less than ('CH'), partition p2 values less than ('D')); insert into t1 values ('czz'),('chi'),('ci'),('cg'); select * from t1 where a between 'cg' AND 'ci'; drop table t1; # # BUG#48165, sql_mode gives error # set @@sql_mode=allow_invalid_dates; --error ER_WRONG_TYPE_COLUMN_VALUE_ERROR create table t1 (a char, b char, c date) partition by range column_list (a,b,c) ( partition p0 values less than (0,0,to_days('3000-11-31'))); --error ER_WRONG_TYPE_COLUMN_VALUE_ERROR create table t1 (a char, b char, c date) partition by range column_list (a,b,c) ( partition p0 values less than (0,0,'3000-11-31')); set @@sql_mode=''; # # BUG#48163, Dagger in UCS2 not working as partition value # create table t1 (a varchar(2) character set ucs2) partition by list column_list (a) (partition p0 values in (0x2020), partition p1 values in ('')); show create table t1; insert into t1 values (''); insert into t1 values (_ucs2 0x2020); drop table t1; create table t1 (a int, b char(10), c varchar(25), d datetime) partition by range column_list(a,b,c,d) subpartition by hash (to_seconds(d)) subpartitions 4 ( partition p0 values less than (1, 0, MAXVALUE, '1900-01-01'), partition p1 values less than (1, 'a', MAXVALUE, '1999-01-01'), partition p2 values less than (1, 'a', MAXVALUE, MAXVALUE), partition p3 values less than (1, MAXVALUE, MAXVALUE, MAXVALUE)); select partition_method, partition_expression, partition_description from information_schema.partitions where table_name = "t1"; show create table t1; drop table t1; --error ER_NULL_IN_VALUES_LESS_THAN create table t1 (a int, b int) partition by range column_list (a,b) (partition p0 values less than (NULL, maxvalue)); --error ER_MAXVALUE_IN_VALUES_IN, ER_PARSE_ERROR create table t1 (a int, b int) partition by list column_list(a,b) ( partition p0 values in ((maxvalue, 0))); create table t1 (a int, b int) partition by list column_list (a,b) ( partition p0 values in ((0,0))); --error ER_MAXVALUE_IN_VALUES_IN, ER_PARSE_ERROR alter table t1 add partition (partition p1 values in (maxvalue, maxvalue)); drop table t1; # # BUG#47837, Crash when two same fields in column list processing # --error ER_SAME_NAME_PARTITION_FIELD create table t1 (a int, b int) partition by key (a,a); --error ER_SAME_NAME_PARTITION_FIELD create table t1 (a int, b int) partition by list column_list(a,a) ( partition p values in ((1,1))); # # BUG#47838, List partitioning have problems with <= and >= # create table t1 (a int signed) partition by list (a) ( partition p0 values in (1, 3, 5, 7, 9, NULL), partition p1 values in (2, 4, 6, 8, 0)); insert into t1 values (NULL),(0),(1),(2),(2),(4),(4),(4),(8),(8); select * from t1 where NULL <= a; select * from t1 where a is null; explain partitions select * from t1 where a is null; select * from t1 where a <= 1; drop table t1; create table t1 (a int signed) partition by list column_list(a) ( partition p0 values in (1, 3, 5, 7, 9, NULL), partition p1 values in (2, 4, 6, 8, 0)); insert into t1 values (NULL),(0),(1),(2),(2),(4),(4),(4),(8),(8); select * from t1 where a <= NULL; select * from t1 where a is null; explain partitions select * from t1 where a is null; select * from t1 where a <= 1; drop table t1; create table t1 (a int, b int) partition by list column_list(a,b) ( partition p0 values in ((1, NULL), (2, NULL), (NULL, NULL)), partition p1 values in ((1,1), (2,2)), partition p2 values in ((3, NULL), (NULL, 1))); select partition_method, partition_expression, partition_description from information_schema.partitions where table_name = "t1"; show create table t1; # # BUG#47754 Crash when selecting using NOT BETWEEN for column list partitioning # insert into t1 values (3, NULL); insert into t1 values (NULL, 1); insert into t1 values (NULL, NULL); insert into t1 values (1, NULL); insert into t1 values (2, NULL); insert into t1 values (1,1); insert into t1 values (2,2); select * from t1 where a = 1; select * from t1 where a = 2; select * from t1 where a > 8; select * from t1 where a not between 8 and 8; show create table t1; drop table t1; --error ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR create table t1 (a int) partition by list (a) ( partition p0 values in (1), partition p1 values in (1)); create table t1 (a int) partition by list (a) ( partition p0 values in (2, 1), partition p1 values in (4, NULL, 3)); select partition_method, partition_expression, partition_description from information_schema.partitions where table_name = "t1"; show create table t1; insert into t1 values (1); insert into t1 values (2); insert into t1 values (3); insert into t1 values (4); insert into t1 values (NULL); --error ER_NO_PARTITION_FOR_GIVEN_VALUE insert into t1 values (5); drop table t1; --error ER_PARSE_ERROR create table t1 (a int) partition by list column_list(a) ( partition p0 values in (2, 1), partition p1 values in ((4), (NULL), (3))); create table t1 (a int) partition by list column_list(a) ( partition p0 values in (2, 1), partition p1 values in (4, NULL, 3)); select partition_method, partition_expression, partition_description from information_schema.partitions where table_name = "t1"; show create table t1; insert into t1 values (1); insert into t1 values (2); insert into t1 values (3); insert into t1 values (4); insert into t1 values (NULL); --error ER_NO_PARTITION_FOR_GIVEN_VALUE insert into t1 values (5); show create table t1; drop table t1; create table t1 (a int, b char(10), c varchar(5), d int) partition by range column_list(a,b,c) subpartition by key (c,d) subpartitions 3 ( partition p0 values less than (1,'abc','abc'), partition p1 values less than (2,'abc','abc'), partition p2 values less than (3,'abc','abc'), partition p3 values less than (4,'abc','abc')); select partition_method, partition_expression, partition_description from information_schema.partitions where table_name = "t1"; show create table t1; insert into t1 values (1,'a','b',1),(2,'a','b',2),(3,'a','b',3); insert into t1 values (1,'b','c',1),(2,'b','c',2),(3,'b','c',3); insert into t1 values (1,'c','d',1),(2,'c','d',2),(3,'c','d',3); insert into t1 values (1,'d','e',1),(2,'d','e',2),(3,'d','e',3); select * from t1 where (a = 1 AND b < 'd' AND (c = 'b' OR (c = 'c' AND d = 1)) OR (a = 1 AND b >= 'a' AND (c = 'c' OR (c = 'd' AND d = 2)))); drop table t1; create table t1 (a int, b varchar(2), c int) partition by range column_list (a, b, c) (partition p0 values less than (1, 'A', 1), partition p1 values less than (1, 'B', 1)); select partition_method, partition_expression, partition_description from information_schema.partitions where table_name = "t1"; show create table t1; insert into t1 values (1, 'A', 1); explain partitions select * from t1 where a = 1 AND b <= 'A' and c = 1; select * from t1 where a = 1 AND b <= 'A' and c = 1; drop table t1; create table t1 (a char, b char, c char) partition by list column_list(a) ( partition p0 values in ('a')); insert into t1 (a) values ('a'); select * from t1 where a = 'a'; drop table t1; --error ER_WRONG_TYPE_COLUMN_VALUE_ERROR create table t1 (d time) partition by range column_list(d) ( partition p0 values less than ('2000-01-01'), partition p1 values less than ('2040-01-01')); --error ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD create table t1 (d timestamp) partition by range column_list(d) ( partition p0 values less than ('2000-01-01'), partition p1 values less than ('2040-01-01')); --error ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD create table t1 (d bit(1)) partition by range column_list(d) ( partition p0 values less than (0), partition p1 values less than (1)); create table t1 (a int, b int) partition by range column_list(a,b) (partition p0 values less than (maxvalue, 10)); drop table t1; create table t1 (d date) partition by range column_list(d) ( partition p0 values less than ('2000-01-01'), partition p1 values less than ('2009-01-01')); drop table t1; create table t1 (d date) partition by range column_list(d) ( partition p0 values less than ('1999-01-01'), partition p1 values less than ('2000-01-01')); drop table t1; create table t1 (d date) partition by range column_list(d) ( partition p0 values less than ('2000-01-01'), partition p1 values less than ('3000-01-01')); drop table t1; create table t1 (a int, b int) partition by range column_list(a,b) (partition p2 values less than (99,99), partition p1 values less than (99,999)); insert into t1 values (99,998); select * from t1 where b = 998; drop table t1; create table t1 as select to_seconds(null) as to_seconds; select data_type from information_schema.columns where column_name='to_seconds'; drop table t1; --error ER_PARSE_ERROR create table t1 (a int, b int) partition by list column_list(a,b) (partition p0 values in ((maxvalue,maxvalue))); create table t1 (a int, b int) partition by range column_list(a,b) (partition p0 values less than (maxvalue,maxvalue)); drop table t1; create table t1 (a int) partition by list column_list(a) (partition p0 values in (0)); select partition_method from information_schema.partitions where table_name='t1'; drop table t1; create table t1 (a char(6)) partition by range column_list(a) (partition p0 values less than ('H23456'), partition p1 values less than ('M23456')); insert into t1 values ('F23456'); select * from t1; drop table t1; -- error 1054 create table t1 (a char(6)) partition by range column_list(a) (partition p0 values less than (H23456), partition p1 values less than (M23456)); -- error ER_RANGE_NOT_INCREASING_ERROR create table t1 (a char(6)) partition by range column_list(a) (partition p0 values less than (23456), partition p1 values less than (23456)); -- error 1064 create table t1 (a int, b int) partition by range column_list(a,b) (partition p0 values less than (10)); -- error ER_PARTITION_COLUMN_LIST_ERROR create table t1 (a int, b int) partition by range column_list(a,b) (partition p0 values less than (1,1,1); create table t1 (a int, b int) partition by range column_list(a,b) (partition p0 values less than (1, 0), partition p1 values less than (2, maxvalue), partition p2 values less than (3, 3), partition p3 values less than (10, maxvalue)); -- error ER_NO_PARTITION_FOR_GIVEN_VALUE insert into t1 values (11,0); insert into t1 values (0,1),(1,1),(2,1),(3,1),(3,4),(4,9),(9,1); select * from t1; alter table t1 partition by range column_list(b,a) (partition p0 values less than (1,2), partition p1 values less than (3,3), partition p2 values less than (9,5)); explain partitions select * from t1 where b < 2; select * from t1 where b < 2; explain partitions select * from t1 where b < 4; select * from t1 where b < 4; alter table t1 reorganize partition p1 into (partition p11 values less than (2,2), partition p12 values less than (3,3)); -- error ER_REORG_OUTSIDE_RANGE alter table t1 reorganize partition p0 into (partition p01 values less than (0,3), partition p02 values less than (1,1)); -- error ER_PARTITION_COLUMN_LIST_ERROR alter table t1 reorganize partition p2 into (partition p2 values less than(9,6,1)); -- error ER_PARTITION_COLUMN_LIST_ERROR alter table t1 reorganize partition p2 into (partition p2 values less than (10)); alter table t1 reorganize partition p2 into (partition p21 values less than (4,7), partition p22 values less than (9,5)); explain partitions select * from t1 where b < 4; select * from t1 where b < 4; drop table t1; create table t1 (a int, b int) partition by list column_list(a,b) subpartition by hash (b) subpartitions 2 (partition p0 values in ((0,0), (1,1)), partition p1 values in ((1000,1000))); insert into t1 values (1000,1000); #select * from t1 where a = 0 and b = 0; drop table t1; create table t1 (a char, b char, c char) partition by range column_list(a,b,c) ( partition p0 values less than ('a','b','c')); alter table t1 add partition (partition p1 values less than ('b','c','d')); drop table t1;