From: Date: July 3 2009 4:32pm Subject: bzr commit into mysql-5.1-bugteam branch (martin.hansson:2936) Bug#45261 List-Archive: http://lists.mysql.com/commits/77912 X-Bug: 45261 Message-Id: <200907031434.n63EY3dJ018088@riff-raff> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1441490717==" --===============1441490717== 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 14:32:53 +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 14:32:53 +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 14:32:53 +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 14:32:53 +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 14:32:53 +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,18 @@ 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); + if (intg >= DECIMAL_MAX_PRECISION) + 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_scale) + dec= new_scale; } - new_field= new Field_new_decimal(len, maybe_null, item->name, dec, item->unsigned_flag); break; --===============1441490717== 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: af7e61f691f1b814e7afb5797af1b8bc567ea18f # timestamp: 2009-07-03 16:33:03 +0200 # base_revision_id: davi.arnaut@stripped\ # y7y7n931lbgnesb4 # # Begin bundle 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 --===============1441490717==--