| Bug #61540 | Contribution to Bug #60176 max(if(1,unsigned,signed)) inconsistent | ||
|---|---|---|---|
| Submitted: | 16 Jun 2011 16:08 | Modified: | 21 Jun 2011 10:50 |
| Reporter: | Yuli Vasiliev | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | MySQL Server | Severity: | S3 (Non-critical) |
| Version: | 5.1 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | Contribution | ||
[21 Jun 2011 10:53]
Valeriy Kravchuk
Let's say it is a duplicate of bug #60176. Read http://forge.mysql.com/wiki/Sun_Contributor_Agreement about the details of OCA.

Description: The problem is, in case of the if function, that the unsigned flag is determined incorrectly. To solve the problem, the unsighed_flag variable in the Item_func_if::fix_length_and_dec() function (Item_cmpfunc.cc) must be determined as the result of a logical disjunction performed on the unsigned flags of the arguments: unsigned_flag=args[1]->unsigned_flag || args[2]->unsigned_flag; rather than a logical conjunction, as we have it now: unsigned_flag=args[1]->unsigned_flag && args[2]->unsigned_flag; How to repeat: === modified file 'sql/item_cmpfunc.cc' --- item_cmpfunc.cc 2011-03-31 18:59:11 +0000 +++ item_cmpfunc.cc 2011-06-16 10:15:03 +0000 @@ -0,0 +1,17 @@ void Item_func_if::fix_length_and_dec() { maybe_null=args[1]->maybe_null || args[2]->maybe_null; decimals= max(args[1]->decimals, args[2]->decimals); - unsigned_flag=args[1]->unsigned_flag && args[2]->unsigned_flag; + unsigned_flag=args[1]->unsigned_flag || args[2]->unsigned_flag; }