From 5eaa7936f667f4c38ea54310f5511dc323a8f039 Mon Sep 17 00:00:00 2001 From: Mattias Jonsson Date: Thu, 4 Mar 2010 11:24:39 +0100 Subject: [PATCH] Bug#51347: assertion with show create table + partition by columns on decimal column The problem was that there was no check to disallow DECIMAL columns in the code (it was accepted as if it was INTEGER). Solution was to correctly disallow DECIMAL columns in COLUMNS partitioning. As documented. mysql-test/r/partition_column.result: Bug#51347: assertion with show create table + partition by columns on decimal column updated test result mysql-test/t/partition_column.test: Bug#51347: assertion with show create table + partition by columns on decimal column Added test to verify column types that is not supported sql/sql_partition.cc: Bug#51347: assertion with show create table + partition by columns on decimal column Moved DECIMAL types to be disallowed as column types in COLUMNS partitioning --- mysql-test/r/partition_column.result | 50 ++++++++++++++++----- mysql-test/t/partition_column.test | 65 +++++++++++++++++++++++----- sql/sql_partition.cc | 4 +- 3 files changed, 95 insertions(+), 24 deletions(-) diff --git a/mysql-test/r/partition_column.result b/mysql-test/r/partition_column.result index ddc48b635cf..458343a6b92 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 a0e944ceb09..d1d2d666a39 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 d400e96ce7e..cfb57475b68 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: