Skip to content

Commit a659291

Browse files
author
Alexander Barkov
committed
MDEV-11586 UNION of FLOAT type results in erroneous precision
Fixing the asymmetry in the array field_types_merge_rules[][] which caused data loss when mixing FLOAT + BIGINT in UNIONs or hybrid functions: 1. FLOAT + INT = DOUBLE 2. FLOAT + BIGINT = FLOAT 3. INT + FLOAT = DOUBLE 4. BIGINT + FLOAT = DOUBLE Now FLOAT + BIGINT (as in #2) also produces DOUBLE, like the cases #1,#3,#4 do.
1 parent 3557de6 commit a659291

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

mysql-test/r/type_float.result

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,5 +772,31 @@ t1 CREATE TABLE `t1` (
772772
) ENGINE=MyISAM DEFAULT CHARSET=latin1
773773
drop table if exists t1;
774774
#
775+
# MDEV-11586 UNION of FLOAT type results in erroneous precision
776+
#
777+
CREATE TABLE t1 (f FLOAT);
778+
INSERT INTO t1 VALUES (1.1);
779+
SELECT f FROM t1 UNION SELECT 1;
780+
f
781+
1.100000023841858
782+
1
783+
SELECT 1 UNION SELECT f FROM t1;
784+
1
785+
1
786+
1.100000023841858
787+
SELECT f FROM t1 UNION SELECT 2147483647;
788+
f
789+
1.100000023841858
790+
2147483647
791+
SELECT 2147483647 UNION SELECT f FROM t1;
792+
2147483647
793+
2147483647
794+
1.100000023841858
795+
SELECT CASE WHEN 0 THEN (SELECT f FROM t1) ELSE 2147483647 END AS c1,
796+
CASE WHEN 1 THEN 2147483647 ELSE (SELECT f FROM t1) END AS c2;
797+
c1 c2
798+
2147483647 2147483647
799+
DROP TABLE t1;
800+
#
775801
# End of 10.2 tests
776802
#

mysql-test/t/type_float.test

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,21 @@ show create table t1;
533533

534534
drop table if exists t1;
535535

536+
--echo #
537+
--echo # MDEV-11586 UNION of FLOAT type results in erroneous precision
538+
--echo #
539+
540+
CREATE TABLE t1 (f FLOAT);
541+
INSERT INTO t1 VALUES (1.1);
542+
SELECT f FROM t1 UNION SELECT 1;
543+
SELECT 1 UNION SELECT f FROM t1;
544+
SELECT f FROM t1 UNION SELECT 2147483647;
545+
SELECT 2147483647 UNION SELECT f FROM t1;
546+
SELECT CASE WHEN 0 THEN (SELECT f FROM t1) ELSE 2147483647 END AS c1,
547+
CASE WHEN 1 THEN 2147483647 ELSE (SELECT f FROM t1) END AS c2;
548+
DROP TABLE t1;
549+
550+
536551
--echo #
537552
--echo # End of 10.2 tests
538553
--echo #

sql/field.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ static enum_field_types field_types_merge_rules [FIELDTYPE_NUM][FIELDTYPE_NUM]=
231231
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
232232
MYSQL_TYPE_FLOAT, MYSQL_TYPE_VARCHAR,
233233
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
234-
MYSQL_TYPE_FLOAT, MYSQL_TYPE_FLOAT,
234+
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_FLOAT,
235235
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
236236
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
237237
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR

0 commit comments

Comments
 (0)