mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Fix for bug #13372 (decimal union)
mysql-test/r/type_decimal.result: test result fixed mysql-test/r/type_float.result: test result fixed mysql-test/t/type_decimal.test: test case added mysql-test/t/type_float.test: test case added sql/item.cc: Fixed counting of the max_length for the REAL_RESULT
This commit is contained in:
parent
ab7ec7ee8f
commit
087f7cc82a
5 changed files with 79 additions and 4 deletions
|
@ -1,4 +1,4 @@
|
|||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t1, t2, t3;
|
||||
SET SQL_WARNINGS=1;
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL auto_increment,
|
||||
|
@ -655,3 +655,18 @@ select * from t1;
|
|||
a b
|
||||
123.12345 123.1
|
||||
drop table t1;
|
||||
create table t1 (d decimal(10,1));
|
||||
create table t2 (d decimal(10,9));
|
||||
insert into t1 values ("100000000.0");
|
||||
insert into t2 values ("1.23456780");
|
||||
create table t3 select * from t2 union select * from t1;
|
||||
select * from t3;
|
||||
d
|
||||
1.234567800
|
||||
100000000.000000000
|
||||
show create table t3;
|
||||
Table Create Table
|
||||
t3 CREATE TABLE `t3` (
|
||||
`d` decimal(18,9) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1, t2, t3;
|
||||
|
|
|
@ -235,3 +235,18 @@ select * from t1 where reckey=1.09E2;
|
|||
reckey recdesc
|
||||
109 Has 109 as key
|
||||
drop table t1;
|
||||
create table t1 (d double(10,1));
|
||||
create table t2 (d double(10,9));
|
||||
insert into t1 values ("100000000.0");
|
||||
insert into t2 values ("1.23456780");
|
||||
create table t3 select * from t2 union select * from t1;
|
||||
select * from t3;
|
||||
d
|
||||
1.234567800
|
||||
100000000.000000000
|
||||
show create table t3;
|
||||
Table Create Table
|
||||
t3 CREATE TABLE `t3` (
|
||||
`d` double(61,9) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1, t2, t3;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# bug in decimal() with negative numbers by kaido@tradenet.ee
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t1, t2, t3;
|
||||
--enable_warnings
|
||||
SET SQL_WARNINGS=1;
|
||||
|
||||
|
@ -276,4 +276,16 @@ update t1 set b=a;
|
|||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #13372 (decimal union)
|
||||
#
|
||||
create table t1 (d decimal(10,1));
|
||||
create table t2 (d decimal(10,9));
|
||||
insert into t1 values ("100000000.0");
|
||||
insert into t2 values ("1.23456780");
|
||||
create table t3 select * from t2 union select * from t1;
|
||||
select * from t3;
|
||||
show create table t3;
|
||||
drop table t1, t2, t3;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
|
|
@ -149,4 +149,17 @@ select * from t1 where reckey=109;
|
|||
select * from t1 where reckey=1.09E2;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #13372 (decimal union)
|
||||
#
|
||||
create table t1 (d double(10,1));
|
||||
create table t2 (d double(10,9));
|
||||
insert into t1 values ("100000000.0");
|
||||
insert into t2 values ("1.23456780");
|
||||
create table t3 select * from t2 union select * from t1;
|
||||
select * from t3;
|
||||
show create table t3;
|
||||
drop table t1, t2, t3;
|
||||
|
||||
|
||||
# End of 4.1 tests
|
||||
|
|
24
sql/item.cc
24
sql/item.cc
|
@ -3205,9 +3205,14 @@ enum_field_types Item_type_holder::get_real_type(Item *item)
|
|||
|
||||
bool Item_type_holder::join_types(THD *thd, Item *item)
|
||||
{
|
||||
uint max_length_orig= max_length;
|
||||
uint decimals_orig= decimals;
|
||||
max_length= max(max_length, display_length(item));
|
||||
decimals= max(decimals, item->decimals);
|
||||
fld_type= Field::field_type_merge(fld_type, get_real_type(item));
|
||||
if (Field::result_merge_type(fld_type) == STRING_RESULT)
|
||||
switch (Field::result_merge_type(fld_type))
|
||||
{
|
||||
case STRING_RESULT:
|
||||
{
|
||||
const char *old_cs, *old_derivation;
|
||||
old_cs= collation.collation->name;
|
||||
|
@ -3221,8 +3226,23 @@ bool Item_type_holder::join_types(THD *thd, Item *item)
|
|||
"UNION");
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
decimals= max(decimals, item->decimals);
|
||||
case REAL_RESULT:
|
||||
{
|
||||
decimals= max(decimals, item->decimals);
|
||||
if (decimals != NOT_FIXED_DEC)
|
||||
{
|
||||
int delta1= max_length_orig - decimals_orig;
|
||||
int delta2= item->max_length - item->decimals;
|
||||
max_length= max(delta1, delta2) + decimals;
|
||||
}
|
||||
else
|
||||
max_length= (fld_type == MYSQL_TYPE_FLOAT) ? FLT_DIG+6 : DBL_DIG+7;
|
||||
break;
|
||||
}
|
||||
default:;
|
||||
};
|
||||
maybe_null|= item->maybe_null;
|
||||
get_full_info(item);
|
||||
return FALSE;
|
||||
|
|
Loading…
Reference in a new issue