Skip to content

Commit

Permalink
MDEV-20785 Converting INET6 to CHAR(39) produces garbage without a wa…
Browse files Browse the repository at this point in the history
…rning
  • Loading branch information
abarkov committed Oct 9, 2019
1 parent c78ae29 commit b37386d
Show file tree
Hide file tree
Showing 3 changed files with 227 additions and 1 deletion.
124 changes: 124 additions & 0 deletions plugin/type_inet/mysql-test/type_inet/type_inet6.result
Expand Up @@ -1266,6 +1266,117 @@ Warning 1292 Incorrect inet6 value: '::192.168.0.1'
Warning 1292 Incorrect inet6 value: '::ffff:192.168.0.1'
DROP TABLE t1;
#
# ALTER to character string data types
#
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS CHAR(39)) FROM t1;
CAST(a AS CHAR(39))
2001:db8::ff00:42:8329
ALTER TABLE t1 MODIFY a CHAR(39);
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a VARCHAR(39);
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a TINYTEXT;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a TEXT;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a MEDIUMTEXT;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a LONGTEXT;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
#
# ALTER from character string data types
#
CREATE OR REPLACE TABLE t1 (a CHAR(64));
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
CAST(a AS INET6)
2001:db8::ff00:42:8329
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a VARCHAR(64));
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
CAST(a AS INET6)
2001:db8::ff00:42:8329
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a TINYTEXT);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
CAST(a AS INET6)
2001:db8::ff00:42:8329
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a TEXT);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
CAST(a AS INET6)
2001:db8::ff00:42:8329
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a MEDIUMTEXT);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
CAST(a AS INET6)
2001:db8::ff00:42:8329
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 (a LONGTEXT);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
CAST(a AS INET6)
2001:db8::ff00:42:8329
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
#
# Limit clause parameter
# TODO: this should fail.
# The test for a valid data type should be moved
Expand All @@ -1274,3 +1385,16 @@ DROP TABLE t1;
#
EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL LIMIT ?' USING CAST('::' AS INET6);
1
#
# MDEV-20785 Converting INET6 to CHAR(39) produces garbage without a warning
#
CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS CHAR(39)) FROM t1;
CAST(a AS CHAR(39))
2001:db8::ff00:42:8329
ALTER TABLE t1 MODIFY a CHAR(39);
SELECT * FROM t1;
a
2001:db8::ff00:42:8329
DROP TABLE t1;
102 changes: 102 additions & 0 deletions plugin/type_inet/mysql-test/type_inet/type_inet6.test
Expand Up @@ -813,6 +813,96 @@ SELECT id, length(a), a, IS_IPV4_MAPPED(BINARY a) FROM t1 ORDER BY id;
SELECT id, length(a), a, IS_IPV4_COMPAT(BINARY a) FROM t1 ORDER BY id;
DROP TABLE t1;


--echo #
--echo # ALTER to character string data types
--echo #

CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS CHAR(39)) FROM t1;
ALTER TABLE t1 MODIFY a CHAR(39);
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a VARCHAR(39);
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a TINYTEXT;
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a TEXT;
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a MEDIUMTEXT;
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
ALTER TABLE t1 MODIFY a LONGTEXT;
SELECT * FROM t1;
DROP TABLE t1;


--echo #
--echo # ALTER from character string data types
--echo #

CREATE OR REPLACE TABLE t1 (a CHAR(64));
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a VARCHAR(64));
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a TINYTEXT);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a TEXT);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a MEDIUMTEXT);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
DROP TABLE t1;

CREATE OR REPLACE TABLE t1 (a LONGTEXT);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS INET6) FROM t1;
ALTER TABLE t1 MODIFY a INET6;
SELECT * FROM t1;
DROP TABLE t1;


--echo #
--echo # Limit clause parameter
--echo # TODO: this should fail.
Expand All @@ -833,3 +923,15 @@ EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL LIMIT ?' USING CAST('::' AS INET6);
## - This should fail with the "illegal data type" error:
## EXTRACT(MINUTE...)
##


--echo #
--echo # MDEV-20785 Converting INET6 to CHAR(39) produces garbage without a warning
--echo #

CREATE OR REPLACE TABLE t1 (a INET6);
INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
SELECT CAST(a AS CHAR(39)) FROM t1;
ALTER TABLE t1 MODIFY a CHAR(39);
SELECT * FROM t1;
DROP TABLE t1;
2 changes: 1 addition & 1 deletion sql/field_conv.cc
Expand Up @@ -786,7 +786,7 @@ Field::Copy_func *Field_string::get_copy_func(const Field *from) const
{
if (from->type() == MYSQL_TYPE_BIT)
return do_field_int;
if (Field_string::real_type() != from->real_type() ||
if (Field_string::type_handler() != from->type_handler() ||
Field_string::charset() != from->charset())
return do_field_string;
if (Field_string::pack_length() < from->pack_length())
Expand Down

0 comments on commit b37386d

Please sign in to comment.