From: Date: July 3 2009 2:00pm Subject: bzr commit into mysql-5.1-bugteam branch (martin.hansson:2936) Bug#45261 List-Archive: http://lists.mysql.com/commits/77894 X-Bug: 45261 Message-Id: <200907031202.n63C21EM013084@riff-raff> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1188360515==" --===============1188360515== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///data0/martin/bzr/bug45261/5.1bt-gca-commit/ based on revid:davi.arnaut@stripped 2936 Martin Hansson 2009-07-03 Bug#45261: Crash, stored procedure + decimal The truncation procedure for creating field for DECIMAL typed columns calculated overflow using a function that automatically truncated field length to avoid overflow, and this was caught much later than the actual error. Fixed by taking into accunt the truncation during calculation, and by adding an assertion in constructor for DECIMAL type column objects. @ mysql-test/r/type_newdecimal.result Bug#45261: - Wrong test result turned correct. - Test result. @ mysql-test/t/type_newdecimal.test Bug#45261: Test case. @ sql/field.cc Bug#45261: Added DBUG_ASSERT to ensure object's invariant is maintained. @ sql/field.h Bug#45261: Added comment to explain what member is for. @ sql/sql_select.cc Bug#45261: Fix: Using new non-truncating function. modified: mysql-test/r/type_newdecimal.result mysql-test/t/type_newdecimal.test sql/field.cc sql/field.h sql/sql_select.cc === modified file 'mysql-test/r/type_newdecimal.result' --- a/mysql-test/r/type_newdecimal.result 2008-11-18 09:52:03 +0000 +++ b/mysql-test/r/type_newdecimal.result 2009-07-03 12:00:48 +0000 @@ -1521,13 +1521,13 @@ f1 DROP TABLE t1; CREATE TABLE t1 SELECT 123451234512345123451234512345123451234512345.678906789067890678906789067890678906789067890 AS f1; Warnings: -Warning 1264 Out of range value for column 'f1' at row 1 +Note 1265 Data truncated for column 'f1' at row 1 DESC t1; Field Type Null Key Default Extra -f1 decimal(59,30) NO 0.000000000000000000000000000000 +f1 decimal(65,20) NO 0.00000000000000000000 SELECT f1 FROM t1; f1 -99999999999999999999999999999.999999999999999999999999999999 +123451234512345123451234512345123451234512345.67890678906789067891 DROP TABLE t1; select (1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 * 1.01500000 * 1.01500000 * 0.99500000); @@ -1577,3 +1577,47 @@ Error 1264 Out of range value for column select cast(98.6 as decimal(2,0)); cast(98.6 as decimal(2,0)) 99 +CREATE TABLE t1 SELECT +123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345 +AS a; +Warnings: +Note 1265 Data truncated for column 'a' at row 1 +SELECT a FROM t1; +a +123456789012345678901234567890123456789012345.12345678901234567890 +DESC t1; +Field Type Null Key Default Extra +a decimal(65,20) NO 0.00000000000000000000 +CREATE TABLE t2 SELECT +12345678901234567890123456789012345678901234567890123456789012345.1 +AS a; +Warnings: +Note 1265 Data truncated for column 'a' at row 1 +SELECT a FROM t2; +a +12345678901234567890123456789012345678901234567890123456789012345 +DESC t2; +Field Type Null Key Default Extra +a decimal(65,0) NO 0 +CREATE TABLE t3 SELECT +123456789012345678901234567890123456789012345678901234567890123456.1 +AS a; +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +SELECT a FROM t3; +a +99999999999999999999999999999999999999999999999999999999999999999 +DESC t3; +Field Type Null Key Default Extra +a decimal(65,0) NO 0 +CREATE TABLE t4 +SELECT .123456789012345678901234567890123456789012345678901234567890123456 AS a; +Warnings: +Note 1265 Data truncated for column 'a' at row 1 +SELECT a FROM t4; +a +0.123456789012345678901234567890 +DESC t4; +Field Type Null Key Default Extra +a decimal(30,30) NO 0.000000000000000000000000000000 +DROP TABLE t1, t2, t3, t4; === modified file 'mysql-test/t/type_newdecimal.test' --- a/mysql-test/t/type_newdecimal.test 2008-11-17 15:43:10 +0000 +++ b/mysql-test/t/type_newdecimal.test 2009-07-03 12:00:48 +0000 @@ -1257,3 +1257,31 @@ select cast(-3.4 as decimal(2,1)); select cast(99.6 as decimal(2,0)); select cast(-13.4 as decimal(2,1)); select cast(98.6 as decimal(2,0)); +# +# Bug#45261 Crash, stored procedure + decimal +# + +CREATE TABLE t1 SELECT +123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345 +AS a; +SELECT a FROM t1; +DESC t1; + +CREATE TABLE t2 SELECT +12345678901234567890123456789012345678901234567890123456789012345.1 +AS a; +SELECT a FROM t2; +DESC t2; + +CREATE TABLE t3 SELECT +123456789012345678901234567890123456789012345678901234567890123456.1 +AS a; +SELECT a FROM t3; +DESC t3; + +CREATE TABLE t4 +SELECT .123456789012345678901234567890123456789012345678901234567890123456 AS a; +SELECT a FROM t4; +DESC t4; + +DROP TABLE t1, t2, t3, t4; === modified file 'sql/field.cc' --- a/sql/field.cc 2009-06-09 16:44:26 +0000 +++ b/sql/field.cc 2009-07-03 12:00:48 +0000 @@ -2485,6 +2485,7 @@ Field_new_decimal::Field_new_decimal(uin { precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg); set_if_smaller(precision, DECIMAL_MAX_PRECISION); + DBUG_ASSERT(precision >= dec); DBUG_ASSERT((precision <= DECIMAL_MAX_PRECISION) && (dec <= DECIMAL_MAX_SCALE)); bin_size= my_decimal_get_binary_size(precision, dec); === modified file 'sql/field.h' --- a/sql/field.h 2009-06-09 16:44:26 +0000 +++ b/sql/field.h 2009-07-03 12:00:48 +0000 @@ -608,6 +608,11 @@ protected: class Field_num :public Field { public: + + /** + The scale of the Field's value, i.e. the number of digits to the right + of the decimal point. + */ const uint8 dec; bool zerofill,unsigned_flag; // Purify cannot handle bit fields Field_num(uchar *ptr_arg,uint32 len_arg, uchar *null_ptr_arg, === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2009-06-07 20:40:53 +0000 +++ b/sql/sql_select.cc 2009-07-03 12:00:48 +0000 @@ -9379,8 +9379,6 @@ static Field *create_tmp_field_from_item if (dec > 0) { - signed int overflow; - dec= min(dec, DECIMAL_MAX_SCALE); /* @@ -9390,15 +9388,19 @@ static Field *create_tmp_field_from_item +1: for decimal point */ - overflow= my_decimal_precision_to_length(intg + dec, dec, - item->unsigned_flag) - len; - - if (overflow > 0) - dec= max(0, dec - overflow); // too long, discard fract - else - len -= item->decimals - dec; // corrected value fits + /* Maximum length. Automatically truncated to avoid overflow. */ + len= my_decimal_precision_to_length(intg + dec, dec, item->unsigned_flag); + DBUG_ASSERT(len <= item->max_length); + if (intg >= item->max_length - (item->unsigned_flag ? 0 : 1)) + dec= 0; + /* Get the maximum number of decimal digits that can be stored. */ + uint new_precision= + my_decimal_length_to_precision(len, dec, item->unsigned_flag); + uint new_scale= new_precision - min(intg, len - (item->unsigned_flag ? 0 : 1)); + /* Throw out decimals if necessary. */ + if (dec > new_precision - intg) + dec= new_precision - intg; } - new_field= new Field_new_decimal(len, maybe_null, item->name, dec, item->unsigned_flag); break; --===============1188360515== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/martin.hansson@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: martin.hansson@stripped # target_branch: file:///data0/martin/bzr/bug45261/5.1bt-gca-commit/ # testament_sha1: 6b363e95af50d1a47d69858138c0abbe095da00b # timestamp: 2009-07-03 14:01:01 +0200 # base_revision_id: davi.arnaut@stripped\ # y7y7n931lbgnesb4 # # Begin bundle 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 --===============1188360515==--