diff --git a/mysql-test/r/partition_column.result b/mysql-test/r/partition_column.result index ddc48b635cf00cc9597500cf1f1f825be66cc0e1..458343a6b92883de4484f059bbb776f092266d05 100644 --- a/mysql-test/r/partition_column.result +++ b/mysql-test/r/partition_column.result @@ -1,4 +1,44 @@ drop table if exists t1; +CREATE TABLE t1 (a DECIMAL) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN (0)); +ERROR HY000: Field 'a' is of a not allowed type for this type of partitioning +CREATE TABLE t1 (a BLOB) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN ("X")); +ERROR HY000: A BLOB field is not allowed in partition function +CREATE TABLE t1 (a TEXT) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN ("X")); +ERROR HY000: A BLOB field is not allowed in partition function +CREATE TABLE t1 (a FLOAT) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN (0.0)); +ERROR HY000: Field 'a' is of a not allowed type for this type of partitioning +CREATE TABLE t1 (a DOUBLE) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN (0.0)); +ERROR HY000: Field 'a' is of a not allowed type for this type of partitioning +CREATE TABLE t1 (d TIMESTAMP) +PARTITION BY RANGE COLUMNS(d) +(PARTITION p0 VALUES LESS THAN ('2000-01-01'), +PARTITION p1 VALUES LESS THAN ('2040-01-01')); +ERROR HY000: Field 'd' is of a not allowed type for this type of partitioning +CREATE TABLE t1 (d BIT(1)) +PARTITION BY RANGE COLUMNS(d) +(PARTITION p0 VALUES LESS THAN (0), +PARTITION p1 VALUES LESS THAN (1)); +ERROR HY000: Field 'd' is of a not allowed type for this type of partitioning +CREATE TABLE t1 (d ENUM("YES","NO")) +PARTITION BY RANGE COLUMNS(d) +(PARTITION p0 VALUES LESS THAN ("NO"), +PARTITION p1 VALUES LESS THAN (MAXVALUE)); +ERROR HY000: Field 'd' is of a not allowed type for this type of partitioning +CREATE TABLE t1 (d SET("Car","MC")) +PARTITION BY RANGE COLUMNS(d) +(PARTITION p0 VALUES LESS THAN ("MC"), +PARTITION p1 VALUES LESS THAN (MAXVALUE)); +ERROR HY000: Field 'd' is of a not allowed type for this type of partitioning create table t1 (a int, b int) partition by range columns (a,b) ( partition p0 values less than (maxvalue, 10), @@ -430,16 +470,6 @@ partition by range columns(d) ( partition p0 values less than ('2000-01-01'), partition p1 values less than ('2040-01-01')); ERROR HY000: Partition column values of incorrect type -create table t1 (d timestamp) -partition by range columns(d) -( partition p0 values less than ('2000-01-01'), -partition p1 values less than ('2040-01-01')); -ERROR HY000: Field 'd' is of a not allowed type for this type of partitioning -create table t1 (d bit(1)) -partition by range columns(d) -( partition p0 values less than (0), -partition p1 values less than (1)); -ERROR HY000: Field 'd' is of a not allowed type for this type of partitioning create table t1 (a int, b int) partition by range columns(a,b) (partition p0 values less than (maxvalue, 10)); diff --git a/mysql-test/t/partition_column.test b/mysql-test/t/partition_column.test index a0e944ceb092f4bfc1c19d2bbcc8d11f04c81a29..d1d2d666a39f11c25e76399358741a9defb83012 100644 --- a/mysql-test/t/partition_column.test +++ b/mysql-test/t/partition_column.test @@ -8,6 +8,59 @@ drop table if exists t1; --enable_warnings +# +# Bug#51347: assertion with show create table + partition by columns +# on decimal column +# +--error ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD +CREATE TABLE t1 (a DECIMAL) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN (0)); + +--error ER_BLOB_FIELD_IN_PART_FUNC_ERROR +CREATE TABLE t1 (a BLOB) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN ("X")); + +--error ER_BLOB_FIELD_IN_PART_FUNC_ERROR +CREATE TABLE t1 (a TEXT) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN ("X")); + +--error ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD +CREATE TABLE t1 (a FLOAT) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN (0.0)); + +--error ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD +CREATE TABLE t1 (a DOUBLE) +PARTITION BY RANGE COLUMNS (a) +(PARTITION p0 VALUES LESS THAN (0.0)); + +--error ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD +CREATE TABLE t1 (d TIMESTAMP) +PARTITION BY RANGE COLUMNS(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 COLUMNS(d) +(PARTITION p0 VALUES LESS THAN (0), + PARTITION p1 VALUES LESS THAN (1)); + +--error ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD +CREATE TABLE t1 (d ENUM("YES","NO")) +PARTITION BY RANGE COLUMNS(d) +(PARTITION p0 VALUES LESS THAN ("NO"), + PARTITION p1 VALUES LESS THAN (MAXVALUE)); + +--error ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD +CREATE TABLE t1 (d SET("Car","MC")) +PARTITION BY RANGE COLUMNS(d) +(PARTITION p0 VALUES LESS THAN ("MC"), + PARTITION p1 VALUES LESS THAN (MAXVALUE)); + # # BUG#49180, Possible to define empty intervals for column list partitioning # @@ -285,18 +338,6 @@ partition by range columns(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 columns(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 columns(d) -( partition p0 values less than (0), - partition p1 values less than (1)); - create table t1 (a int, b int) partition by range columns(a,b) (partition p0 values less than (maxvalue, 10)); diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index d400e96ce7e08a4db8989f6251ccfb771b14200a..cfb57475b68fb5d707d424f71f8394f0aa64745f 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -2128,8 +2128,6 @@ static int check_part_field(enum_field_types sql_type, } switch (sql_type) { - case MYSQL_TYPE_NEWDECIMAL: - case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_TINY: case MYSQL_TYPE_SHORT: case MYSQL_TYPE_LONG: @@ -2151,6 +2149,8 @@ static int check_part_field(enum_field_types sql_type, *result_type= STRING_RESULT; *need_cs_check= TRUE; return FALSE; + case MYSQL_TYPE_NEWDECIMAL: + case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_NULL: case MYSQL_TYPE_FLOAT: