Skip to content

Commit d046b13

Browse files
committed
MDEV-20548 Unexpected error on CREATE..SELECT HEX(num)
Item_func_hex::fix_length_and_dec() evaluated a too short data type for signed numeric arguments, which resulted in a 'Data too long for column' error on CREATE..SELECT. Fixing the code to take into account that a short negative numer can produce a long HEX value: -1 -> 'FFFFFFFFFFFFFFFF' Also fixing Item_func_hex::val_str_ascii_from_val_real(). Without this change, MTR test with HEX with negative float point arguments failed on some platforms (aarch64, ppc64le, s390-x).
1 parent e7b76f8 commit d046b13

File tree

11 files changed

+514
-7
lines changed

11 files changed

+514
-7
lines changed

mysql-test/main/func_str.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ t1 CREATE TABLE `t1` (
748748
`bin(130)` varchar(64) DEFAULT NULL,
749749
`oct(130)` varchar(64) DEFAULT NULL,
750750
`conv(130,16,10)` varchar(64) DEFAULT NULL,
751-
`hex(130)` varchar(6) DEFAULT NULL,
751+
`hex(130)` varchar(16) DEFAULT NULL,
752752
`char(130)` varbinary(4) DEFAULT NULL,
753753
`format(130,10)` varchar(25) DEFAULT NULL,
754754
`left(_latin2'a',1)` varchar(1) CHARACTER SET latin2 COLLATE latin2_general_ci DEFAULT NULL,

mysql-test/main/type_float.result

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,3 +1206,82 @@ DROP VIEW v1;
12061206
#
12071207
# End of 10.4 tests
12081208
#
1209+
#
1210+
# Start of 10.5 tests
1211+
#
1212+
#
1213+
# MDEV-20548 Unexpected error on CREATE..SELECT HEX(num)
1214+
#
1215+
SET sql_mode=STRICT_ALL_TABLES;
1216+
CREATE TABLE t1 AS SELECT HEX(-2e0) AS h;
1217+
SELECT * FROM t1;
1218+
h
1219+
FFFFFFFFFFFFFFFE
1220+
SHOW COLUMNS IN t1;
1221+
Field Type Null Key Default Extra
1222+
h varchar(16) YES NULL
1223+
DROP TABLE t1;
1224+
CREATE TABLE t1 AS SELECT HEX(-1e0) AS h;
1225+
SELECT * FROM t1;
1226+
h
1227+
FFFFFFFFFFFFFFFF
1228+
SHOW COLUMNS IN t1;
1229+
Field Type Null Key Default Extra
1230+
h varchar(16) YES NULL
1231+
DROP TABLE t1;
1232+
CREATE TABLE t1 AS SELECT HEX(1e0) AS h;
1233+
SELECT * FROM t1;
1234+
h
1235+
1
1236+
SHOW COLUMNS IN t1;
1237+
Field Type Null Key Default Extra
1238+
h varchar(16) YES NULL
1239+
DROP TABLE t1;
1240+
CREATE TABLE t1 AS SELECT HEX(2e0) AS h;
1241+
SELECT * FROM t1;
1242+
h
1243+
2
1244+
SHOW COLUMNS IN t1;
1245+
Field Type Null Key Default Extra
1246+
h varchar(16) YES NULL
1247+
DROP TABLE t1;
1248+
CREATE TABLE t1 (a FLOAT);
1249+
INSERT INTO t1 VALUES (-1e38),(-255),(-2),(-1),(+1),(+2),(255),(1e38);
1250+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
1251+
SELECT * FROM t2 ORDER BY a;
1252+
a h
1253+
-1e38 FFFFFFFFFFFFFFFF
1254+
-255 FFFFFFFFFFFFFF01
1255+
-2 FFFFFFFFFFFFFFFE
1256+
-1 FFFFFFFFFFFFFFFF
1257+
1 1
1258+
2 2
1259+
255 FF
1260+
1e38 FFFFFFFFFFFFFFFF
1261+
SHOW COLUMNS IN t2;
1262+
Field Type Null Key Default Extra
1263+
a float YES NULL
1264+
h varchar(16) YES NULL
1265+
DROP TABLE t1, t2;
1266+
CREATE TABLE t1 (a DOUBLE);
1267+
INSERT INTO t1 VALUES (-1e308),(-255),(-2),(-1),(+1),(+2),(255),(1e308);
1268+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
1269+
SELECT * FROM t2 ORDER BY a;
1270+
a h
1271+
-1e308 FFFFFFFFFFFFFFFF
1272+
-255 FFFFFFFFFFFFFF01
1273+
-2 FFFFFFFFFFFFFFFE
1274+
-1 FFFFFFFFFFFFFFFF
1275+
1 1
1276+
2 2
1277+
255 FF
1278+
1e308 FFFFFFFFFFFFFFFF
1279+
SHOW COLUMNS IN t2;
1280+
Field Type Null Key Default Extra
1281+
a double YES NULL
1282+
h varchar(16) YES NULL
1283+
DROP TABLE t1, t2;
1284+
SET sql_mode=DEFAULT;
1285+
#
1286+
# End of 10.5 tests
1287+
#

mysql-test/main/type_float.test

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,3 +745,54 @@ DROP VIEW v1;
745745
--echo #
746746
--echo # End of 10.4 tests
747747
--echo #
748+
749+
--echo #
750+
--echo # Start of 10.5 tests
751+
--echo #
752+
753+
--echo #
754+
--echo # MDEV-20548 Unexpected error on CREATE..SELECT HEX(num)
755+
--echo #
756+
757+
SET sql_mode=STRICT_ALL_TABLES;
758+
759+
CREATE TABLE t1 AS SELECT HEX(-2e0) AS h;
760+
SELECT * FROM t1;
761+
SHOW COLUMNS IN t1;
762+
DROP TABLE t1;
763+
764+
CREATE TABLE t1 AS SELECT HEX(-1e0) AS h;
765+
SELECT * FROM t1;
766+
SHOW COLUMNS IN t1;
767+
DROP TABLE t1;
768+
769+
CREATE TABLE t1 AS SELECT HEX(1e0) AS h;
770+
SELECT * FROM t1;
771+
SHOW COLUMNS IN t1;
772+
DROP TABLE t1;
773+
774+
CREATE TABLE t1 AS SELECT HEX(2e0) AS h;
775+
SELECT * FROM t1;
776+
SHOW COLUMNS IN t1;
777+
DROP TABLE t1;
778+
779+
780+
CREATE TABLE t1 (a FLOAT);
781+
INSERT INTO t1 VALUES (-1e38),(-255),(-2),(-1),(+1),(+2),(255),(1e38);
782+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
783+
SELECT * FROM t2 ORDER BY a;
784+
SHOW COLUMNS IN t2;
785+
DROP TABLE t1, t2;
786+
787+
CREATE TABLE t1 (a DOUBLE);
788+
INSERT INTO t1 VALUES (-1e308),(-255),(-2),(-1),(+1),(+2),(255),(1e308);
789+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
790+
SELECT * FROM t2 ORDER BY a;
791+
SHOW COLUMNS IN t2;
792+
DROP TABLE t1, t2;
793+
794+
SET sql_mode=DEFAULT;
795+
796+
--echo #
797+
--echo # End of 10.5 tests
798+
--echo #

mysql-test/main/type_int.result

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,5 +1686,166 @@ c0
16861686
127
16871687
drop table t1;
16881688
#
1689+
# MDEV-20548 Unexpected error on CREATE..SELECT HEX(num)
1690+
#
1691+
SET sql_mode=STRICT_ALL_TABLES;
1692+
CREATE TABLE t1 AS SELECT HEX(-2) AS h;
1693+
SELECT * FROM t1;
1694+
h
1695+
FFFFFFFFFFFFFFFE
1696+
SHOW COLUMNS IN t1;
1697+
Field Type Null Key Default Extra
1698+
h varchar(16) YES NULL
1699+
DROP TABLE t1;
1700+
CREATE TABLE t1 AS SELECT HEX(-1) AS h;
1701+
SELECT * FROM t1;
1702+
h
1703+
FFFFFFFFFFFFFFFF
1704+
SHOW COLUMNS IN t1;
1705+
Field Type Null Key Default Extra
1706+
h varchar(16) YES NULL
1707+
DROP TABLE t1;
1708+
CREATE TABLE t1 AS SELECT HEX(1) AS h;
1709+
SELECT * FROM t1;
1710+
h
1711+
1
1712+
SHOW COLUMNS IN t1;
1713+
Field Type Null Key Default Extra
1714+
h varchar(16) YES NULL
1715+
DROP TABLE t1;
1716+
CREATE TABLE t1 AS SELECT HEX(2) AS h;
1717+
SELECT * FROM t1;
1718+
h
1719+
2
1720+
SHOW COLUMNS IN t1;
1721+
Field Type Null Key Default Extra
1722+
h varchar(16) YES NULL
1723+
DROP TABLE t1;
1724+
CREATE TABLE t1 (a TINYINT);
1725+
INSERT INTO t1 VALUES (-0x80),(-2),(-1),(1),(2),(0x7f);
1726+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
1727+
SELECT * FROM t2;
1728+
a h
1729+
-128 FFFFFFFFFFFFFF80
1730+
-2 FFFFFFFFFFFFFFFE
1731+
-1 FFFFFFFFFFFFFFFF
1732+
1 1
1733+
2 2
1734+
127 7F
1735+
SHOW COLUMNS IN t2;
1736+
Field Type Null Key Default Extra
1737+
a tinyint(4) YES NULL
1738+
h varchar(16) YES NULL
1739+
DROP TABLE t1, t2;
1740+
CREATE TABLE t1 (a SMALLINT);
1741+
INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff);
1742+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
1743+
SELECT * FROM t2;
1744+
a h
1745+
-32768 FFFFFFFFFFFF8000
1746+
-128 FFFFFFFFFFFFFF80
1747+
-2 FFFFFFFFFFFFFFFE
1748+
-1 FFFFFFFFFFFFFFFF
1749+
1 1
1750+
2 2
1751+
127 7F
1752+
32767 7FFF
1753+
SHOW COLUMNS IN t2;
1754+
Field Type Null Key Default Extra
1755+
a smallint(6) YES NULL
1756+
h varchar(16) YES NULL
1757+
DROP TABLE t1, t2;
1758+
CREATE TABLE t1 (a MEDIUMINT);
1759+
INSERT INTO t1 VALUES (-0x800000);
1760+
INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff);
1761+
INSERT INTO t1 VALUES (0x7fffff);
1762+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
1763+
SELECT * FROM t2;
1764+
a h
1765+
-8388608 FFFFFFFFFF800000
1766+
-32768 FFFFFFFFFFFF8000
1767+
-128 FFFFFFFFFFFFFF80
1768+
-2 FFFFFFFFFFFFFFFE
1769+
-1 FFFFFFFFFFFFFFFF
1770+
1 1
1771+
2 2
1772+
127 7F
1773+
32767 7FFF
1774+
8388607 7FFFFF
1775+
SHOW COLUMNS IN t2;
1776+
Field Type Null Key Default Extra
1777+
a mediumint(9) YES NULL
1778+
h varchar(16) YES NULL
1779+
DROP TABLE t1, t2;
1780+
CREATE TABLE t1 (a INT);
1781+
INSERT INTO t1 VALUES (-0x80000000);
1782+
INSERT INTO t1 VALUES (-0x800000);
1783+
INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff);
1784+
INSERT INTO t1 VALUES (0x7fffff);
1785+
INSERT INTO t1 VALUES (0x7fffffff);
1786+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
1787+
SELECT * FROM t2;
1788+
a h
1789+
-2147483648 FFFFFFFF80000000
1790+
-8388608 FFFFFFFFFF800000
1791+
-32768 FFFFFFFFFFFF8000
1792+
-128 FFFFFFFFFFFFFF80
1793+
-2 FFFFFFFFFFFFFFFE
1794+
-1 FFFFFFFFFFFFFFFF
1795+
1 1
1796+
2 2
1797+
127 7F
1798+
32767 7FFF
1799+
8388607 7FFFFF
1800+
2147483647 7FFFFFFF
1801+
SHOW COLUMNS IN t2;
1802+
Field Type Null Key Default Extra
1803+
a int(11) YES NULL
1804+
h varchar(16) YES NULL
1805+
DROP TABLE t1, t2;
1806+
CREATE TABLE t1 (a BIGINT);
1807+
INSERT INTO t1 VALUES (-0x8000000000000000);
1808+
INSERT INTO t1 VALUES (-0x80000000000000);
1809+
INSERT INTO t1 VALUES (-0x800000000000);
1810+
INSERT INTO t1 VALUES (-0x8000000000);
1811+
INSERT INTO t1 VALUES (-0x80000000);
1812+
INSERT INTO t1 VALUES (-0x800000);
1813+
INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff);
1814+
INSERT INTO t1 VALUES (0x7fffff);
1815+
INSERT INTO t1 VALUES (0x7fffffff);
1816+
INSERT INTO t1 VALUES (0x7fffffffff);
1817+
INSERT INTO t1 VALUES (0x7fffffffffff);
1818+
INSERT INTO t1 VALUES (0x7fffffffffffff);
1819+
INSERT INTO t1 VALUES (0x7fffffffffffffff);
1820+
CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1;
1821+
SELECT * FROM t2;
1822+
a h
1823+
-9223372036854775808 8000000000000000
1824+
-36028797018963968 FF80000000000000
1825+
-140737488355328 FFFF800000000000
1826+
-549755813888 FFFFFF8000000000
1827+
-2147483648 FFFFFFFF80000000
1828+
-8388608 FFFFFFFFFF800000
1829+
-32768 FFFFFFFFFFFF8000
1830+
-128 FFFFFFFFFFFFFF80
1831+
-2 FFFFFFFFFFFFFFFE
1832+
-1 FFFFFFFFFFFFFFFF
1833+
1 1
1834+
2 2
1835+
127 7F
1836+
32767 7FFF
1837+
8388607 7FFFFF
1838+
2147483647 7FFFFFFF
1839+
549755813887 7FFFFFFFFF
1840+
140737488355327 7FFFFFFFFFFF
1841+
36028797018963967 7FFFFFFFFFFFFF
1842+
9223372036854775807 7FFFFFFFFFFFFFFF
1843+
SHOW COLUMNS IN t2;
1844+
Field Type Null Key Default Extra
1845+
a bigint(20) YES NULL
1846+
h varchar(16) YES NULL
1847+
DROP TABLE t1, t2;
1848+
SET sql_mode=DEFAULT;
1849+
#
16891850
# End of 10.5 tests
16901851
#

0 commit comments

Comments
 (0)