From 0c57a67ce0434fa78e2b64f569a271d166371a32 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Jan 2005 17:44:18 +0100 Subject: [PATCH] Correctly truncate integers inserted into field and double columns with a number of decimals specified. (Bug #7361) mysql-test/t/type_float.test: Add test for maximum values of float and double columns with number of decimals mysql-test/r/type_float.result: Add results for new test mysql-test/r/type_float.result.es: Add results for new test sql/field.cc: Use ::store(double nr) from ::store(longlong nr) so we get the same range checking --- mysql-test/r/type_float.result | 36 +++++++++++++++++++++++++++++++ mysql-test/r/type_float.result.es | 36 +++++++++++++++++++++++++++++++ mysql-test/t/type_float.test | 10 +++++++++ sql/field.cc | 36 ++----------------------------- 4 files changed, 84 insertions(+), 34 deletions(-) diff --git a/mysql-test/r/type_float.result b/mysql-test/r/type_float.result index 2f996382586..9dd92c13c98 100644 --- a/mysql-test/r/type_float.result +++ b/mysql-test/r/type_float.result @@ -143,3 +143,39 @@ drop table t1; create table t1 (f float(54)); ERROR 42000: Incorrect column specifier for column 'f' drop table if exists t1; +create table t1 (f float(4,3)); +insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); +Warnings: +Warning 1264 Data truncated; out of range for column 'f' at row 1 +Warning 1264 Data truncated; out of range for column 'f' at row 2 +Warning 1264 Data truncated; out of range for column 'f' at row 3 +Warning 1264 Data truncated; out of range for column 'f' at row 4 +Warning 1264 Data truncated; out of range for column 'f' at row 5 +Warning 1264 Data truncated; out of range for column 'f' at row 6 +select * from t1; +f +-9.999 +-9.999 +-9.999 +9.999 +9.999 +9.999 +drop table if exists t1; +create table t1 (f double(4,3)); +insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); +Warnings: +Warning 1264 Data truncated; out of range for column 'f' at row 1 +Warning 1264 Data truncated; out of range for column 'f' at row 2 +Warning 1264 Data truncated; out of range for column 'f' at row 3 +Warning 1264 Data truncated; out of range for column 'f' at row 4 +Warning 1264 Data truncated; out of range for column 'f' at row 5 +Warning 1264 Data truncated; out of range for column 'f' at row 6 +select * from t1; +f +-9.999 +-9.999 +-9.999 +9.999 +9.999 +9.999 +drop table if exists t1; diff --git a/mysql-test/r/type_float.result.es b/mysql-test/r/type_float.result.es index 4bfe644d7fb..64d9be7e30f 100644 --- a/mysql-test/r/type_float.result.es +++ b/mysql-test/r/type_float.result.es @@ -143,3 +143,39 @@ drop table t1; create table t1 (f float(54)); ERROR 42000: Incorrect column specifier for column 'f' drop table if exists t1; +create table t1 (f float(4,3)); +insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); +Warnings: +Warning 1264 Data truncated; out of range for column 'f' at row 1 +Warning 1264 Data truncated; out of range for column 'f' at row 2 +Warning 1264 Data truncated; out of range for column 'f' at row 3 +Warning 1264 Data truncated; out of range for column 'f' at row 4 +Warning 1264 Data truncated; out of range for column 'f' at row 5 +Warning 1264 Data truncated; out of range for column 'f' at row 6 +select * from t1; +f +-9.999 +-9.999 +-9.999 +9.999 +9.999 +9.999 +drop table if exists t1; +create table t1 (f double(4,3)); +insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); +Warnings: +Warning 1264 Data truncated; out of range for column 'f' at row 1 +Warning 1264 Data truncated; out of range for column 'f' at row 2 +Warning 1264 Data truncated; out of range for column 'f' at row 3 +Warning 1264 Data truncated; out of range for column 'f' at row 4 +Warning 1264 Data truncated; out of range for column 'f' at row 5 +Warning 1264 Data truncated; out of range for column 'f' at row 6 +select * from t1; +f +-9.999 +-9.999 +-9.999 +9.999 +9.999 +9.999 +drop table if exists t1; diff --git a/mysql-test/t/type_float.test b/mysql-test/t/type_float.test index 26ac272c6d4..3fe3afa3fac 100644 --- a/mysql-test/t/type_float.test +++ b/mysql-test/t/type_float.test @@ -93,3 +93,13 @@ create table t1 (f float(54)); # Should give an error drop table if exists t1; --enable_warnings +# Ensure that maximum values as the result of number of decimals +# being specified in table schema are enforced (Bug #7361) +create table t1 (f float(4,3)); +insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); +select * from t1; +drop table if exists t1; +create table t1 (f double(4,3)); +insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); +select * from t1; +drop table if exists t1; diff --git a/sql/field.cc b/sql/field.cc index b27a319b00e..e2c11cc7372 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2395,23 +2395,7 @@ int Field_float::store(double nr) int Field_float::store(longlong nr) { - int error= 0; - float j= (float) nr; - if (unsigned_flag && j < 0) - { - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); - j=0; - error= 1; - } -#ifdef WORDS_BIGENDIAN - if (table->db_low_byte_first) - { - float4store(ptr,j); - } - else -#endif - memcpy_fixed(ptr,(byte*) &j,sizeof(j)); - return error; + return store((double)nr); } @@ -2690,23 +2674,7 @@ int Field_double::store(double nr) int Field_double::store(longlong nr) { - double j= (double) nr; - int error= 0; - if (unsigned_flag && j < 0) - { - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); - error= 1; - j=0; - } -#ifdef WORDS_BIGENDIAN - if (table->db_low_byte_first) - { - float8store(ptr,j); - } - else -#endif - doublestore(ptr,j); - return error; + return store((double)nr); }