mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			748 lines
		
	
	
	
		
			28 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			748 lines
		
	
	
	
		
			28 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| ################################################################################
 | |
| # 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_NULL_IN_VALUES_LESS_THAN
 | |
| 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_NULL_IN_VALUES_LESS_THAN
 | |
| 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
 | |
| 
 | 
