################################################################################ # inc/partition_syntax.inc # # # # Purpose: # # Tests around Create partitioned tables syntax # # # #------------------------------------------------------------------------------# # Original Author: mleich # # Original Date: 2006-03-05 # # Change Author: # # Change Date: # # Change: # ################################################################################ # FIXME Implement testcases, where it is checked that all create and # alter table statements # - with missing mandatory parameters are rejected # - with optional parameters are accepted # - with wrong combinations of optional parameters are rejected # - ............ --echo --echo #======================================================================== --echo # 1. Any PRIMARY KEYs or UNIQUE INDEXes must contain the columns used --echo # within the partitioning functions --echo #======================================================================== --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings # --echo #------------------------------------------------------------------------ --echo # 1.1 column of partitioning function not included in PRIMARY KEY --echo # PARTITION BY HASH/KEY/LIST/RANGE --echo #------------------------------------------------------------------------ #----------- PARTITION BY HASH --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY HASH(f_int1) PARTITIONS 2; --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY HASH(f_int1 + f_int2) PARTITIONS 2; #----------- PARTITION BY KEY --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY KEY(f_int1) PARTITIONS 2; --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY KEY(f_int1,f_int2) PARTITIONS 2; #----------- PARTITION BY LIST --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY LIST(f_int1) (PARTITION part1 VALUES IN (1)); --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY LIST(f_int1 + f_int2) (PARTITION part1 VALUES IN (1)); #----------- PARTITION BY RANGE --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY RANGE(f_int1) (PARTITION part1 VALUES LESS THAN (1)); --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY RANGE(f_int1 + f_int2) (PARTITION part1 VALUES LESS THAN (1)); # --echo #------------------------------------------------------------------------ --echo # 1.2 column of partitioning function not included in UNIQUE INDEX --echo # PARTITION BY HASH/KEY/LIST/RANGE --echo # Variant a) Without additional PRIMARY KEY --echo # Variant b) With correct additional PRIMARY KEY --echo # Variant 1) one column in partitioning function --echo # Variant 2) two columns in partitioning function --echo #------------------------------------------------------------------------ # Note: If the CREATE TABLE statement contains no PRIMARY KEY but # UNIQUE INDEXes the MySQL layer tells the storage to use # the first UNIQUE INDEX as PRIMARY KEY. let $unique_index= UNIQUE INDEX (f_int2); #----------- PARTITION BY HASH let $partition_scheme= PARTITION BY HASH(f_int1) PARTITIONS 2; --source suite/parts/inc/partition_syntax_2.inc let $partition_scheme= PARTITION BY HASH(f_int1 + f_int2) PARTITIONS 2; --source suite/parts/inc/partition_syntax_2.inc #----------- PARTITION BY KEY let $partition_scheme= PARTITION BY KEY(f_int1) PARTITIONS 2; --source suite/parts/inc/partition_syntax_2.inc let $partition_scheme= PARTITION BY KEY(f_int1,f_int2) PARTITIONS 2; --source suite/parts/inc/partition_syntax_2.inc #----------- PARTITION BY LIST let $partition_scheme= PARTITION BY LIST(MOD(f_int1,3)) (PARTITION partN VALUES IN (NULL), PARTITION part0 VALUES IN (0), PARTITION part1 VALUES IN (1), PARTITION part2 VALUES IN (2)); --source suite/parts/inc/partition_syntax_2.inc let $partition_scheme= PARTITION BY LIST(MOD(f_int1 + f_int2,3)) (PARTITION partN VALUES IN (NULL), PARTITION part0 VALUES IN (0), PARTITION part1 VALUES IN (1), PARTITION part2 VALUES IN (2)); --source suite/parts/inc/partition_syntax_2.inc #----------- PARTITION BY RANGE let $partition_scheme= PARTITION BY RANGE(f_int1) (PARTITION part1 VALUES LESS THAN (1), PARTITION part2 VALUES LESS THAN (2147483646)); --source suite/parts/inc/partition_syntax_2.inc let $partition_scheme= PARTITION BY RANGE(f_int1 + f_int2) (PARTITION part1 VALUES LESS THAN (1), PARTITION part2 VALUES LESS THAN (2147483646)); --source suite/parts/inc/partition_syntax_2.inc # --echo #------------------------------------------------------------------------ --echo # 1.3 column of subpartitioning function not included in PRIMARY KEY --echo # PARTITION BY RANGE/LIST -- SUBPARTITION BY HASH/KEY --echo #------------------------------------------------------------------------ #----------- PARTITION BY RANGE -- SUBPARTITION BY HASH --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY RANGE(f_int2) SUBPARTITION BY HASH(f_int1) (PARTITION part1 VALUES LESS THAN (1) (SUBPARTITION subpart1)); #----------- PARTITION BY RANGE -- SUBPARTITION BY KEY --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY RANGE(f_int2) SUBPARTITION BY KEY(f_int1) (PARTITION part1 VALUES LESS THAN (1) (SUBPARTITION subpart1)); #----------- PARTITION BY LIST -- SUBPARTITION BY HASH --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY LIST(f_int2) SUBPARTITION BY HASH(f_int1) (PARTITION part1 VALUES IN (1) (SUBPARTITION subpart1)); #----------- PARTITION BY LIST -- SUBPARTITION BY KEY --error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int2) ) PARTITION BY LIST(f_int2) SUBPARTITION BY KEY(f_int1) (PARTITION part1 VALUES IN (1) (SUBPARTITION subpart1)); # --echo #------------------------------------------------------------------------ --echo # 1.4 column of subpartitioning function not included in UNIQUE INDEX --echo # PARTITION BY RANGE/LIST -- SUBPARTITION BY HASH/KEY --echo # Variant a) Without additional PRIMARY KEY --echo # Variant b) With correct additional PRIMARY KEY --echo #------------------------------------------------------------------------ let $partition_scheme= PARTITION BY RANGE(f_int2) SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 3 (PARTITION part1 VALUES LESS THAN (1), PARTITION part2 VALUES LESS THAN (2147483646)); --source suite/parts/inc/partition_syntax_2.inc #----------- PARTITION BY RANGE -- SUBPARTITION BY KEY let $partition_scheme= PARTITION BY RANGE(f_int2) SUBPARTITION BY KEY(f_int1) SUBPARTITIONS 3 (PARTITION part1 VALUES LESS THAN (1), PARTITION part2 VALUES LESS THAN (2147483646)); --source suite/parts/inc/partition_syntax_2.inc #----------- PARTITION BY LIST -- SUBPARTITION BY HASH let $partition_scheme= PARTITION BY LIST(MOD(f_int2,3)) SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 2 (PARTITION partN VALUES IN (NULL), PARTITION part0 VALUES IN (0), PARTITION part1 VALUES IN (1), PARTITION part2 VALUES IN (2)); --source suite/parts/inc/partition_syntax_2.inc #----------- PARTITION BY LIST -- SUBPARTITION BY KEY let $partition_scheme= PARTITION BY LIST(MOD(f_int2,3)) SUBPARTITION BY KEY(f_int1) SUBPARTITIONS 2 (PARTITION partN VALUES IN (NULL), PARTITION part0 VALUES IN (0), PARTITION part1 VALUES IN (1), PARTITION part2 VALUES IN (2)); --source suite/parts/inc/partition_syntax_2.inc --echo --echo #======================================================================== --echo # 2 Some properties around subpartitioning --echo #======================================================================== --echo #------------------------------------------------------------------------ --echo # 2.1 Subpartioned table without subpartitioning rule must be rejected --echo #------------------------------------------------------------------------ --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings # Bug#15961 Partitions: Creation of subpart. table without subpart. rule not rejected --error ER_SUBPARTITION_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11)); --echo #------------------------------------------------------------------------ --echo # 2.2 Every partition must have the same number of subpartitions. --echo # This is a limitation of MySQL 5.1, which could be removed in --echo # later releases. --echo #------------------------------------------------------------------------ --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list, PRIMARY KEY (f_int1) ) PARTITION BY RANGE(f_int1) SUBPARTITION BY KEY(f_int1) ( PARTITION part1 VALUES LESS THAN (0) (SUBPARTITION subpart1), PARTITION part2 VALUES LESS THAN ($max_row_div4) (SUBPARTITION subpart1, SUBPARTITION subpart2)); --echo --echo #======================================================================== --echo # 3 VALUES clauses --echo #======================================================================== --echo #------------------------------------------------------------------------ --echo # 3.1 The constants in VALUES IN clauses must differ --echo #------------------------------------------------------------------------ --error ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY LIST(MOD(f_int1,2)) ( PARTITION part1 VALUES IN (-1), PARTITION part2 VALUES IN (0), PARTITION part3 VALUES IN (-1)); # constant followed by the same constant --error ER_RANGE_NOT_INCREASING_ERROR CREATE TABLE t1 (f1 BIGINT, f2 BIGINT) PARTITION BY RANGE(f1) (PARTITION part1 VALUES LESS THAN (0), PARTITION part2 VALUES LESS THAN (0), PARTITION part3 VALUES LESS THAN (10000)); --echo #------------------------------------------------------------------------ --echo # 3.2 The constants in VALUES LESS must be in increasing order --echo #------------------------------------------------------------------------ # constant followed somewhere by the smaller constant --error ER_RANGE_NOT_INCREASING_ERROR CREATE TABLE t1 (f1 BIGINT, f2 BIGINT) PARTITION BY RANGE(f1) (PARTITION part1 VALUES LESS THAN (0), PARTITION part2 VALUES LESS THAN (-1), PARTITION part3 VALUES LESS THAN (10000)); --echo #------------------------------------------------------------------------ --echo # 3.3 LIST partitions must be defined with VALUES IN --echo #------------------------------------------------------------------------ --error ER_PARTITION_WRONG_VALUES_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY LIST(MOD(f_int1,2)) ( PARTITION part1 VALUES LESS THAN (-1), PARTITION part2 VALUES LESS THAN (0), PARTITION part3 VALUES LESS THAN (1000)); --echo #------------------------------------------------------------------------ --echo # 3.4 RANGE partitions must be defined with VALUES LESS THAN --echo #------------------------------------------------------------------------ --error ER_PARTITION_WRONG_VALUES_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) ( PARTITION part1 VALUES IN (-1), PARTITION part2 VALUES IN (0), PARTITION part3 VALUES IN (1000)); --echo #------------------------------------------------------------------------ --echo # 3.5 Use of NULL in VALUES clauses --echo #------------------------------------------------------------------------ --echo # 3.5.1 NULL in RANGE partitioning clause --echo # 3.5.1.1 VALUE LESS THAN (NULL) is not allowed --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) ( PARTITION part1 VALUES LESS THAN (NULL), PARTITION part2 VALUES LESS THAN (1000)); --echo # 3.5.1.2 VALUE LESS THAN (NULL) is not allowed --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) ( PARTITION part1 VALUES LESS THAN (NULL), PARTITION part2 VALUES LESS THAN (1000)); --echo # 3.5.2 NULL in LIST partitioning clause --echo # 3.5.2.1 VALUE IN (NULL) eval CREATE TABLE t1 ( $column_list ) PARTITION BY LIST(MOD(f_int1,2)) ( PARTITION part1 VALUES IN (NULL), PARTITION part2 VALUES IN (0), PARTITION part3 VALUES IN (1)); DROP TABLE t1; --echo # 3.5.2.2 VALUE IN (NULL) # Attention: It is intended that there is no partition with # VALUES IN (0), because there was a time where NULL was treated as zero eval CREATE TABLE t1 ( $column_list ) PARTITION BY LIST(MOD(f_int1,2)) ( PARTITION part1 VALUES IN (NULL), PARTITION part3 VALUES IN (1)); --source suite/parts/inc/partition_layout_check1.inc DROP TABLE t1; --echo # 3.5.3 Reveal that IN (...NULL) is not mapped to IN(0) # Bug#15447: Partitions: NULL is treated as zero # We would get a clash here if such a mapping would be done. eval CREATE TABLE t1 ( $column_list ) PARTITION BY LIST(MOD(f_int1,2)) ( PARTITION part1 VALUES IN (NULL), PARTITION part2 VALUES IN (0), PARTITION part3 VALUES IN (1)); --source suite/parts/inc/partition_layout_check1.inc DROP TABLE t1; # FIXME Implement some non integer constant tests --echo --echo #======================================================================== --echo # 4. Check assigning the number of partitions and subpartitions --echo # with and without named partitions/subpartitions --echo #======================================================================== --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings --echo #------------------------------------------------------------------------ --echo # 4.1 (positive) without partition/subpartition number assignment --echo #------------------------------------------------------------------------ --echo # 4.1.1 no partition number, no named partitions eval CREATE TABLE t1 ( $column_list ) PARTITION BY HASH(f_int1); --source suite/parts/inc/partition_layout_check1.inc DROP TABLE t1; --echo # 4.1.2 no partition number, named partitions eval CREATE TABLE t1 ( $column_list ) PARTITION BY HASH(f_int1) (PARTITION part1, PARTITION part2); --source suite/parts/inc/partition_layout_check1.inc DROP TABLE t1; # Attention: Several combinations are impossible # If subpartitioning exists # - partitioning algorithm must be RANGE or LIST # This implies the assignment of named partitions. # - subpartitioning algorithm must be HASH or KEY --echo # 4.1.3 variations on no partition/subpartition number, named partitions, --echo # different subpartitions are/are not named # # Partition name -- "properties" # part1 -- first/non last # part2 -- non first/non last # part3 -- non first/ last # # Testpattern: # named subpartitions in # Partition part1 part2 part3 # N N N # N N Y # N Y N # N Y Y # Y N N # Y N Y # Y Y N # Y Y Y --disable_query_log let $part01= CREATE TABLE t1 ( ; let $part02= ) PARTITION BY RANGE(f_int1) SUBPARTITION BY HASH(f_int1); # eval SET @aux = '(PARTITION part1 VALUES LESS THAN ($max_row_div2),'; let $part1_N= `SELECT @AUX`; eval SET @aux = '(PARTITION part1 VALUES LESS THAN ($max_row_div2) (SUBPARTITION subpart11 , SUBPARTITION subpart12 ),'; let $part1_Y= `SELECT @AUX`; # eval SET @aux = 'PARTITION part2 VALUES LESS THAN ($max_row),'; let $part2_N= `SELECT @AUX`; eval SET @aux = 'PARTITION part2 VALUES LESS THAN ($max_row) (SUBPARTITION subpart21 , SUBPARTITION subpart22 ),'; let $part2_Y= `SELECT @AUX`; # eval SET @aux = 'PARTITION part3 VALUES LESS THAN $MAX_VALUE)'; let $part3_N= `SELECT @AUX`; eval SET @aux = 'PARTITION part3 VALUES LESS THAN $MAX_VALUE (SUBPARTITION subpart31 , SUBPARTITION subpart32 ))'; let $part3_Y= `SELECT @AUX`; --enable_query_log eval $part01 $column_list $part02 $part1_N $part2_N $part3_N ; DROP TABLE t1; # Bug#15407 Partitions: crash if subpartition --error ER_PARSE_ERROR eval $part01 $column_list $part02 $part1_N $part2_N $part3_Y ; --error ER_PARSE_ERROR eval $part01 $column_list $part02 $part1_N $part2_Y $part3_N ; --error ER_PARSE_ERROR eval $part01 $column_list $part02 $part1_N $part2_Y $part3_Y ; --error ER_PARSE_ERROR eval $part01 $column_list $part02 $part1_Y $part2_N $part3_N ; --error ER_PARSE_ERROR eval $part01 $column_list $part02 $part1_Y $part2_N $part3_Y ; --error ER_PARSE_ERROR eval $part01 $column_list $part02 $part1_Y $part2_Y $part3_N ; eval $part01 $column_list $part02 $part1_Y $part2_Y $part3_Y ; --source suite/parts/inc/partition_layout_check1.inc DROP TABLE t1; --echo #------------------------------------------------------------------------ --echo # 4.2 partition/subpartition numbers good and bad values and notations --echo #------------------------------------------------------------------------ --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings --echo # 4.2.1 partition/subpartition numbers INTEGER notation # mleich: "positive/negative" is my private judgement. It need not to # correspond with the server response. # (positive) number = 2 let $part_number= 2; --source suite/parts/inc/partition_syntax_1.inc # (positive) special case number = 1 let $part_number= 1; --source suite/parts/inc/partition_syntax_1.inc # (negative) 0 is non sense let $part_number= 0; --source suite/parts/inc/partition_syntax_1.inc # (negative) -1 is non sense let $part_number= -1; --source suite/parts/inc/partition_syntax_1.inc # (negative) 1000000 is too huge let $part_number= 1000000; --source suite/parts/inc/partition_syntax_1.inc --echo # 4.2.2 partition/subpartition numbers DECIMAL notation # (positive) number = 2.0 let $part_number= 2.0; --source suite/parts/inc/partition_syntax_1.inc # (negative) -2.0 is non sense let $part_number= -2.0; --source suite/parts/inc/partition_syntax_1.inc # (negative) case number = 0.0 is non sense let $part_number= 0.0; --source suite/parts/inc/partition_syntax_1.inc # Bug#15890 Partitions: Strange interpretation of partition number # (negative) number = 1.6 is non sense let $part_number= 1.6; --source suite/parts/inc/partition_syntax_1.inc # (negative) number is too huge let $part_number= 999999999999999999999999999999.999999999999999999999999999999; --source suite/parts/inc/partition_syntax_1.inc # (negative) number is nearly zero let $part_number= 0.000000000000000000000000000001; --source suite/parts/inc/partition_syntax_1.inc --echo # 4.2.3 partition/subpartition numbers FLOAT notation ##### FLOAT notation # (positive) number = 2.0E+0 let $part_number= 2.0E+0; --source suite/parts/inc/partition_syntax_1.inc # Bug#15890 Partitions: Strange interpretation of partition number # (positive) number = 0.2E+1 let $part_number= 0.2E+1; --source suite/parts/inc/partition_syntax_1.inc # (negative) -2.0E+0 is non sense let $part_number= -2.0E+0; --source suite/parts/inc/partition_syntax_1.inc # Bug#15890 Partitions: Strange interpretation of partition number # (negative) 0.16E+1 is non sense let $part_number= 0.16E+1; --source suite/parts/inc/partition_syntax_1.inc # (negative) 0.0E+300 is zero let $part_number= 0.0E+300; --source suite/parts/inc/partition_syntax_1.inc # Bug#15890 Partitions: Strange interpretation of partition number # (negative) 1E+300 is too huge let $part_number= 1E+300; --source suite/parts/inc/partition_syntax_1.inc # (negative) 1E-300 is nearly zero let $part_number= 1E-300; --source suite/parts/inc/partition_syntax_1.inc --echo # 4.2.4 partition/subpartition numbers STRING notation ##### STRING notation # (negative?) case number = '2' let $part_number= '2'; --source suite/parts/inc/partition_syntax_1.inc # (negative?) case number = '2.0' let $part_number= '2.0'; --source suite/parts/inc/partition_syntax_1.inc # (negative?) case number = '0.2E+1' let $part_number= '0.2E+1'; --source suite/parts/inc/partition_syntax_1.inc # (negative) Strings starts with digit, but 'A' follows let $part_number= '2A'; --source suite/parts/inc/partition_syntax_1.inc # (negative) Strings starts with 'A', but digit follows let $part_number= 'A2'; --source suite/parts/inc/partition_syntax_1.inc # (negative) empty string let $part_number= ''; --source suite/parts/inc/partition_syntax_1.inc # (negative) string without any digits let $part_number= 'GARBAGE'; --source suite/parts/inc/partition_syntax_1.inc --echo # 4.2.5 partition/subpartition numbers other notations # (negative) Strings starts with digit, but 'A' follows let $part_number= 2A; --source suite/parts/inc/partition_syntax_1.inc # (negative) Strings starts with 'A', but digit follows let $part_number= A2; --source suite/parts/inc/partition_syntax_1.inc # (negative) string without any digits let $part_number= GARBAGE; --source suite/parts/inc/partition_syntax_1.inc # (negative?) double quotes let $part_number= "2"; --source suite/parts/inc/partition_syntax_1.inc # (negative) Strings starts with digit, but 'A' follows let $part_number= "2A"; --source suite/parts/inc/partition_syntax_1.inc # (negative) Strings starts with 'A', but digit follows let $part_number= "A2"; --source suite/parts/inc/partition_syntax_1.inc # (negative) string without any digits let $part_number= "GARBAGE"; --source suite/parts/inc/partition_syntax_1.inc --echo # 4.2.6 (negative) partition/subpartition numbers per @variables SET @aux = 5; --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY HASH(f_int1) PARTITIONS @aux; --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) SUBPARTITION BY HASH(f_int1) SUBPARTITIONS @aux = 5 (PARTITION part1 VALUES LESS THAN ($max_row_div2), PARTITION part2 VALUES LESS THAN $MAX_VALUE); --echo #------------------------------------------------------------------------ --echo # 4.3 Mixups of assigned partition/subpartition numbers and names --echo #------------------------------------------------------------------------ --echo # 4.3.1 (positive) number of partition/subpartition --echo # = number of named partition/subpartition eval CREATE TABLE t1 ( $column_list ) PARTITION BY HASH(f_int1) PARTITIONS 2 ( PARTITION part1, PARTITION part2 ) ; --source suite/parts/inc/partition_layout_check1.inc DROP TABLE t1; eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) PARTITIONS 2 SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 2 ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11, SUBPARTITION subpart12), PARTITION part2 VALUES LESS THAN $MAX_VALUE (SUBPARTITION subpart21, SUBPARTITION subpart22) ); --source suite/parts/inc/partition_layout_check1.inc DROP TABLE t1; --echo # 4.3.2 (positive) number of partition/subpartition , --echo # 0 (= no) named partition/subpartition --echo # already checked above --echo # 4.3.3 (negative) number of partitions/subpartitions --echo # > number of named partitions/subpartitions --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY HASH(f_int1) PARTITIONS 2 ( PARTITION part1 ) ; # Wrong number of named subpartitions in first partition --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 2 ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11 ), PARTITION part2 VALUES LESS THAN $MAX_VALUE (SUBPARTITION subpart21, SUBPARTITION subpart22) ); # Wrong number of named subpartitions in non first/non last partition --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 2 ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11, SUBPARTITION subpart12), PARTITION part2 VALUES LESS THAN (2000) (SUBPARTITION subpart21 ), PARTITION part3 VALUES LESS THAN $MAX_VALUE (SUBPARTITION subpart31, SUBPARTITION subpart32) ); # Wrong number of named subpartitions in last partition --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) PARTITIONS 2 SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 2 ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11, SUBPARTITION subpart12), PARTITION part2 VALUES LESS THAN $MAX_VALUE (SUBPARTITION subpart21 ) ); --echo # 4.3.4 (negative) number of partitions < number of named partitions --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY HASH(f_int1) PARTITIONS 1 ( PARTITION part1, PARTITION part2 ) ; # Wrong number of named subpartitions in first partition --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 1 ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11, SUBPARTITION subpart12), PARTITION part2 VALUES LESS THAN $MAX_VALUE (SUBPARTITION subpart21, SUBPARTITION subpart22) ); # Wrong number of named subpartitions in non first/non last partition --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 1 ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11, SUBPARTITION subpart12), PARTITION part2 VALUES LESS THAN (2000) (SUBPARTITION subpart21 ), PARTITION part3 VALUES LESS THAN $MAX_VALUE (SUBPARTITION subpart31, SUBPARTITION subpart32) ); # Wrong number of named subpartitions in last partition --error ER_PARSE_ERROR eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) SUBPARTITION BY HASH(f_int1) SUBPARTITIONS 1 ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11, SUBPARTITION subpart12), PARTITION part2 VALUES LESS THAN $MAX_VALUE (SUBPARTITION subpart21, SUBPARTITION subpart22) ); --echo --echo #======================================================================== --echo # 5. Checks of logical partition/subpartition name --echo # file name clashes during CREATE TABLE --echo #======================================================================== --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings --echo #------------------------------------------------------------------------ --echo # 5.1 (negative) A partition/subpartition name used more than once --echo #------------------------------------------------------------------------ --echo # 5.1.1 duplicate partition name --error ER_SAME_NAME_PARTITION eval CREATE TABLE t1 ( $column_list ) PARTITION BY HASH(f_int1) (PARTITION part1, PARTITION part1); # --echo # 5.1.2 duplicate subpartition name # Bug#15408 Partitions: subpartition names are not unique --error ER_SAME_NAME_PARTITION eval CREATE TABLE t1 ( $column_list ) PARTITION BY RANGE(f_int1) SUBPARTITION BY HASH(f_int1) ( PARTITION part1 VALUES LESS THAN (1000) (SUBPARTITION subpart11, SUBPARTITION subpart11) ); # FIXME Implement testcases with filename problems # existing file of other table --- partition/subpartition file name # partition/subpartition file name --- file of the same table