Skip to content

Commit

Permalink
MDEV-23366 ROUND(18446744073709551615,rand()*0) returns a wrong result
Browse files Browse the repository at this point in the history
Changing that in case of *INT and hex hybrid input:
- ROUND(x,NULL) creates a column with the same type as x.
  The old code created a DOUBLE column, which was not relevant at all.
  This change simplifies the code a lot.

- ROUND(x,non_constant) creates a column of the INT, BIGINT or DECIMAL
  data type (depending on the exact type of x).
  The old code created a column of the DOUBLE data type,
  which lead to precision loss. Hence MDEV-23366.

- ROUND(bigint_30,negative_constant) creates a column of the DECIMAL(30,0)
  data type. The old code created DECIMAL(29,0), which looked strange:
  the data type promoted to a higher one, but max length reduced.
  Now the length attribute is preserved.
  • Loading branch information
abarkov committed Aug 3, 2020
1 parent 97f7bfc commit 9840bb2
Show file tree
Hide file tree
Showing 8 changed files with 300 additions and 55 deletions.
3 changes: 1 addition & 2 deletions mysql-test/main/func_math.result
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,6 @@ truncate(4, cast(-2 as unsigned)) truncate(4, 18446744073709551614) truncate(4,
4 4 0
Warnings:
Note 1105 Cast to unsigned converted negative integer to it's positive complement
Note 1105 Cast to unsigned converted negative integer to it's positive complement
select round(10000000000000000000, -19), truncate(10000000000000000000, -19);
round(10000000000000000000, -19) truncate(10000000000000000000, -19)
10000000000000000000 10000000000000000000
Expand Down Expand Up @@ -1784,7 +1783,7 @@ ROUND(10e0,NULL) AS c3;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` double DEFAULT NULL,
`c1` int(2) DEFAULT NULL,
`c2` double DEFAULT NULL,
`c3` double DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Expand Down
37 changes: 37 additions & 0 deletions mysql-test/main/type_hex_hybrid.result
Original file line number Diff line number Diff line change
Expand Up @@ -195,5 +195,42 @@ ROUND(0xFFFFFFFFFFFFFFFF,-10) ROUND(0xFFFFFFFFFFFFFFFF,-11)
18446744070000000000 18446744100000000000
DROP TABLE t1;
#
# MDEV-23366 ROUND(18446744073709551615,rand()*0) returns a wrong result
#
SELECT
ROUND(0xFFFFFFFFFFFFFFFF,NULL) AS c1,
ROUND(0xFFFFFFFFFFFFFFFF,rand()*0) AS c2,
ROUND(0xFFFFFFFFFFFFFFFF,-1) AS c3,
ROUND(0xFFFFFFFFFFFFFFFF,-19) AS c4,
ROUND(0xFFFFFFFFFFFFFFFF,rand()*0-19) AS c5;
c1 NULL
c2 18446744073709551615
c3 18446744073709551620
c4 20000000000000000000
c5 20000000000000000000
CREATE OR REPLACE TABLE t1 AS
SELECT
ROUND(0xFFFFFFFFFFFFFFFF,NULL) AS c1,
ROUND(0xFFFFFFFFFFFFFFFF,rand()*0) AS c2,
ROUND(0xFFFFFFFFFFFFFFFF,-1) AS c3,
ROUND(0xFFFFFFFFFFFFFFFF,-19) AS c4,
ROUND(0xFFFFFFFFFFFFFFFF,rand()*0-19) AS c5;
SELECT * FROM t1;
c1 NULL
c2 18446744073709551615
c3 18446744073709551620
c4 20000000000000000000
c5 20000000000000000000
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`c1` bigint(20) unsigned DEFAULT NULL,
`c2` decimal(21,0) unsigned NOT NULL,
`c3` decimal(21,0) unsigned NOT NULL,
`c4` decimal(21,0) unsigned NOT NULL,
`c5` decimal(21,0) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
#
# End of 10.4 tests
#
25 changes: 25 additions & 0 deletions mysql-test/main/type_hex_hybrid.test
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,31 @@ SELECT * FROM t1;
DROP TABLE t1;


--echo #
--echo # MDEV-23366 ROUND(18446744073709551615,rand()*0) returns a wrong result
--echo #

--vertical_results
SELECT
ROUND(0xFFFFFFFFFFFFFFFF,NULL) AS c1,
ROUND(0xFFFFFFFFFFFFFFFF,rand()*0) AS c2,
ROUND(0xFFFFFFFFFFFFFFFF,-1) AS c3,
ROUND(0xFFFFFFFFFFFFFFFF,-19) AS c4,
ROUND(0xFFFFFFFFFFFFFFFF,rand()*0-19) AS c5;

CREATE OR REPLACE TABLE t1 AS
SELECT
ROUND(0xFFFFFFFFFFFFFFFF,NULL) AS c1,
ROUND(0xFFFFFFFFFFFFFFFF,rand()*0) AS c2,
ROUND(0xFFFFFFFFFFFFFFFF,-1) AS c3,
ROUND(0xFFFFFFFFFFFFFFFF,-19) AS c4,
ROUND(0xFFFFFFFFFFFFFFFF,rand()*0-19) AS c5;

SELECT * FROM t1;
SHOW CREATE TABLE t1;
DROP TABLE t1;
--horizontal_results

--echo #
--echo # End of 10.4 tests
--echo #
165 changes: 165 additions & 0 deletions mysql-test/main/type_int.result
Original file line number Diff line number Diff line change
Expand Up @@ -1163,6 +1163,75 @@ ROUND(a,-2) 9223372036854775800
ROUND(a,-19) 10000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
CALL p1('bigint(22)');
bigint(22)
Table t2
Create Table CREATE TABLE `t2` (
`a` bigint(22) DEFAULT NULL,
`ROUND(a,-1)` decimal(22,0) DEFAULT NULL,
`ROUND(a,-2)` decimal(22,0) DEFAULT NULL,
`ROUND(a,-19)` decimal(22,0) DEFAULT NULL,
`ROUND(a,-20)` decimal(22,0) DEFAULT NULL,
`ROUND(a,-30)` decimal(22,0) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
a -9223372036854775808
ROUND(a,-1) -9223372036854775810
ROUND(a,-2) -9223372036854775800
ROUND(a,-19) -10000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
a 9223372036854775807
ROUND(a,-1) 9223372036854775810
ROUND(a,-2) 9223372036854775800
ROUND(a,-19) 10000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
CALL p1('bigint(23)');
bigint(23)
Table t2
Create Table CREATE TABLE `t2` (
`a` bigint(23) DEFAULT NULL,
`ROUND(a,-1)` decimal(23,0) DEFAULT NULL,
`ROUND(a,-2)` decimal(23,0) DEFAULT NULL,
`ROUND(a,-19)` decimal(23,0) DEFAULT NULL,
`ROUND(a,-20)` decimal(23,0) DEFAULT NULL,
`ROUND(a,-30)` decimal(23,0) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
a -9223372036854775808
ROUND(a,-1) -9223372036854775810
ROUND(a,-2) -9223372036854775800
ROUND(a,-19) -10000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
a 9223372036854775807
ROUND(a,-1) 9223372036854775810
ROUND(a,-2) 9223372036854775800
ROUND(a,-19) 10000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
CALL p1('bigint(30)');
bigint(30)
Table t2
Create Table CREATE TABLE `t2` (
`a` bigint(30) DEFAULT NULL,
`ROUND(a,-1)` decimal(30,0) DEFAULT NULL,
`ROUND(a,-2)` decimal(30,0) DEFAULT NULL,
`ROUND(a,-19)` decimal(30,0) DEFAULT NULL,
`ROUND(a,-20)` decimal(30,0) DEFAULT NULL,
`ROUND(a,-30)` decimal(30,0) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
a -9223372036854775808
ROUND(a,-1) -9223372036854775810
ROUND(a,-2) -9223372036854775800
ROUND(a,-19) -10000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
a 9223372036854775807
ROUND(a,-1) 9223372036854775810
ROUND(a,-2) 9223372036854775800
ROUND(a,-19) 10000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
CALL p1('tinyint unsigned');
tinyint unsigned
Table t2
Expand Down Expand Up @@ -1324,7 +1393,103 @@ ROUND(a,-2) 18446744073709551600
ROUND(a,-19) 20000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
CALL p1('bigint(22) unsigned');
bigint(22) unsigned
Table t2
Create Table CREATE TABLE `t2` (
`a` bigint(22) unsigned DEFAULT NULL,
`ROUND(a,-1)` decimal(23,0) unsigned DEFAULT NULL,
`ROUND(a,-2)` decimal(23,0) unsigned DEFAULT NULL,
`ROUND(a,-19)` decimal(23,0) unsigned DEFAULT NULL,
`ROUND(a,-20)` decimal(23,0) unsigned DEFAULT NULL,
`ROUND(a,-30)` decimal(23,0) unsigned DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
a 0
ROUND(a,-1) 0
ROUND(a,-2) 0
ROUND(a,-19) 0
ROUND(a,-20) 0
ROUND(a,-30) 0
a 18446744073709551615
ROUND(a,-1) 18446744073709551620
ROUND(a,-2) 18446744073709551600
ROUND(a,-19) 20000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
CALL p1('bigint(23) unsigned');
bigint(23) unsigned
Table t2
Create Table CREATE TABLE `t2` (
`a` bigint(23) unsigned DEFAULT NULL,
`ROUND(a,-1)` decimal(24,0) unsigned DEFAULT NULL,
`ROUND(a,-2)` decimal(24,0) unsigned DEFAULT NULL,
`ROUND(a,-19)` decimal(24,0) unsigned DEFAULT NULL,
`ROUND(a,-20)` decimal(24,0) unsigned DEFAULT NULL,
`ROUND(a,-30)` decimal(24,0) unsigned DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
a 0
ROUND(a,-1) 0
ROUND(a,-2) 0
ROUND(a,-19) 0
ROUND(a,-20) 0
ROUND(a,-30) 0
a 18446744073709551615
ROUND(a,-1) 18446744073709551620
ROUND(a,-2) 18446744073709551600
ROUND(a,-19) 20000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
CALL p1('bigint(30) unsigned');
bigint(30) unsigned
Table t2
Create Table CREATE TABLE `t2` (
`a` bigint(30) unsigned DEFAULT NULL,
`ROUND(a,-1)` decimal(31,0) unsigned DEFAULT NULL,
`ROUND(a,-2)` decimal(31,0) unsigned DEFAULT NULL,
`ROUND(a,-19)` decimal(31,0) unsigned DEFAULT NULL,
`ROUND(a,-20)` decimal(31,0) unsigned DEFAULT NULL,
`ROUND(a,-30)` decimal(31,0) unsigned DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
a 0
ROUND(a,-1) 0
ROUND(a,-2) 0
ROUND(a,-19) 0
ROUND(a,-20) 0
ROUND(a,-30) 0
a 18446744073709551615
ROUND(a,-1) 18446744073709551620
ROUND(a,-2) 18446744073709551600
ROUND(a,-19) 20000000000000000000
ROUND(a,-20) 0
ROUND(a,-30) 0
DROP PROCEDURE p1;
#
# MDEV-23366 ROUND(18446744073709551615,rand()*0) returns a wrong result
#
SELECT
ROUND(18446744073709551615,NULL) AS c1,
ROUND(18446744073709551615,rand()*0) AS c2,
ROUND(18446744073709551615,rand()*0-19) AS c3;
c1 NULL
c2 18446744073709551615
c3 20000000000000000000
CREATE OR REPLACE TABLE t1 AS
SELECT
ROUND(18446744073709551615,NULL) AS c1,
ROUND(18446744073709551615,rand()*0) AS c2,
ROUND(18446744073709551615,rand()*0-19) AS c3;
SELECT * FROM t1;
c1 NULL
c2 18446744073709551615
c3 20000000000000000000
SHOW CREATE TABLE t1;
Table t1
Create Table CREATE TABLE `t1` (
`c1` bigint(20) unsigned DEFAULT NULL,
`c2` decimal(21,0) unsigned NOT NULL,
`c3` decimal(21,0) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
#
# End of 10.4 tests
#
34 changes: 28 additions & 6 deletions mysql-test/main/type_int.test
Original file line number Diff line number Diff line change
Expand Up @@ -394,9 +394,9 @@ CALL p1('int');
CALL p1('bigint');
CALL p1('bigint(20)');
CALL p1('bigint(21)');
#CALL p1('bigint(22)');
#CALL p1('bigint(23)');
#CALL p1('bigint(30)');
CALL p1('bigint(22)');
CALL p1('bigint(23)');
CALL p1('bigint(30)');

CALL p1('tinyint unsigned');
CALL p1('smallint unsigned');
Expand All @@ -405,14 +405,36 @@ CALL p1('int unsigned');
CALL p1('bigint unsigned');
CALL p1('bigint(20) unsigned');
CALL p1('bigint(21) unsigned');
#CALL p1('bigint(22) unsigned');
#CALL p1('bigint(23) unsigned');
#CALL p1('bigint(30) unsigned');
CALL p1('bigint(22) unsigned');
CALL p1('bigint(23) unsigned');
CALL p1('bigint(30) unsigned');
--horizontal_results

DROP PROCEDURE p1;


--echo #
--echo # MDEV-23366 ROUND(18446744073709551615,rand()*0) returns a wrong result
--echo #

--vertical_results
SELECT
ROUND(18446744073709551615,NULL) AS c1,
ROUND(18446744073709551615,rand()*0) AS c2,
ROUND(18446744073709551615,rand()*0-19) AS c3;

CREATE OR REPLACE TABLE t1 AS
SELECT
ROUND(18446744073709551615,NULL) AS c1,
ROUND(18446744073709551615,rand()*0) AS c2,
ROUND(18446744073709551615,rand()*0-19) AS c3;

SELECT * FROM t1;
SHOW CREATE TABLE t1;
DROP TABLE t1;
--horizontal_results


--echo #
--echo # End of 10.4 tests
--echo #
Loading

0 comments on commit 9840bb2

Please sign in to comment.