| Bug #11283 | cast as decimal | ||
|---|---|---|---|
| Submitted: | 13 Jun 2005 10:13 | Modified: | 24 Jun 2005 17:37 |
| Reporter: | Yoshiaki Tajika (Basic Quality Contributor) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S2 (Serious) |
| Version: | 5.0.7-beta-nightly-20050521 | OS: | Linux (linux) |
| Assigned to: | Igor Babaev | CPU Architecture: | Any |
[15 Jun 2005 15:10]
Igor Babaev
This bug was analyzed by Alexander Ivanov. Here's what he found out: The cause of the bug is incorrect behavior of the Field_longstr::val_decimal() function. Details are as follows. Field_longstr is the base class for Field_string, Field_varstring, and Field_blob classes. The Field_longstr::val_decimal() function behaves correctly only in case of Field_string class. As to other two classes they require specific implementation of this function. Alexander also prepared a fix: The original val_decimal() function is moved from the Field_longstr class to the Field_string class. Two newly implemented val_decimal() functions are added to the Field_varstring and Field_blob classes, respectively.
[15 Jun 2005 15:27]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/26028
[15 Jun 2005 17:02]
Igor Babaev
ChangeSet
1.1945 05/06/15 08:27:33 igor@rurik.mysql.com +4 -0
cast.result, cast.test:
Added test case for bug #11283.
field.h, field.cc:
Fixed bug #11283: wrong conversion from varchar to decimal.
Added methods Field_string::val_decimal,
Field_varstring::val_decimal, Field_blob::val_decimal.
They are not inherited from the base class Field_longstr
anymore.
The fix will appear in 5.0.8.
[24 Jun 2005 17:37]
Mike Hillyer
CAST section of refman updated, fix documented in 5.0.8 changelog: <listitem><para><literal>CAST( ... AS DECIMAL) didn't work for strings. (Bug #11283)</literal></para></listitem>

Description: cast(int_column as decimal) returns incorrect result. How to repeat: drop table if exists t1; create table t1(c1 varchar(6)) engine=myisam default charset=latin1; insert into t1 values('1'); select cast(c1 as decimal) from t1; -- (a) select cast('1' as decimal); -- (b) Then, (a) returned 0.00. Odd result. (b) returned 1.00. It's OK. I expect that (a) also returns 1.00.