diff --git a/mysql-test/r/type_float.result b/mysql-test/r/type_float.result index d243985332e..fc7e4c5f346 100644 --- a/mysql-test/r/type_float.result +++ b/mysql-test/r/type_float.result @@ -225,3 +225,7 @@ select * from t1 where reckey=1.09E2; reckey recdesc 109 Has 109 as key drop table t1; +create table t1 (s1 float(0,2)); +ERROR 42000: For float(M,D) or double(M,D), M must be >= D (column 's1'). +create table t1 (s1 float(1,2)); +ERROR 42000: For float(M,D) or double(M,D), M must be >= D (column 's1'). diff --git a/mysql-test/t/type_float.test b/mysql-test/t/type_float.test index c0f1854d5b2..bb7bd37039b 100644 --- a/mysql-test/t/type_float.test +++ b/mysql-test/t/type_float.test @@ -147,3 +147,12 @@ select * from t1 where reckey=1.09E2; drop table t1; # End of 4.1 tests + +# +# bug #12694 (float(m,d) specifications) +# + +--error 1443 +create table t1 (s1 float(0,2)); +--error 1443 +create table t1 (s1 float(1,2)); diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index c9b717211ce..f2a91d5b88b 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5419,3 +5419,5 @@ ER_ROW_IS_REFERENCED_2 23000 eng "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)" ER_NO_REFERENCED_ROW_2 23000 eng "Cannot add or update a child row: a foreign key constraint fails (%.192s)" +ER_M_BIGGER_THAN_D 42000 S1009 + eng "For float(M,D) or double(M,D), M must be >= D (column '%-.64s')." diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ff3d56266f6..a5faff5cf61 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -5814,19 +5814,31 @@ new_create_field(THD *thd, char *field_name, enum_field_types type, new_field->decimals= NOT_FIXED_DEC; break; } - if (!length) + if (!length && !decimals) { new_field->length = FLT_DIG+6; new_field->decimals= NOT_FIXED_DEC; } + if (new_field->length < new_field->decimals && + new_field->decimals != NOT_FIXED_DEC) + { + my_error(ER_M_BIGGER_THAN_D, MYF(0), field_name); + DBUG_RETURN(NULL); + } break; case FIELD_TYPE_DOUBLE: allowed_type_modifier= AUTO_INCREMENT_FLAG; - if (!length) + if (!length && !decimals) { new_field->length = DBL_DIG+7; new_field->decimals=NOT_FIXED_DEC; } + if (new_field->length < new_field->decimals && + new_field->decimals != NOT_FIXED_DEC) + { + my_error(ER_M_BIGGER_THAN_D, MYF(0), field_name); + DBUG_RETURN(NULL); + } break; case FIELD_TYPE_TIMESTAMP: if (!length)