summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2019-10-09 22:25:58 +0400
committerAlexander Barkov <bar@mariadb.com>2019-10-09 22:25:58 +0400
commitb37386d854b37743a7b4ae578312dd27bec055ce (patch)
treed1e90933eb8925fb1e583881c175c9b8fc08c0dc
parentc78ae293b4baf1ae92f523089961907c3b006845 (diff)
downloadmariadb-git-b37386d854b37743a7b4ae578312dd27bec055ce.tar.gz
MDEV-20785 Converting INET6 to CHAR(39) produces garbage without a warning
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6.result124
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6.test102
-rw-r--r--sql/field_conv.cc2
3 files changed, 227 insertions, 1 deletions
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.result b/plugin/type_inet/mysql-test/type_inet/type_inet6.result
index 7d88cce3d81..b402e1cae2a 100644
--- a/plugin/type_inet/mysql-test/type_inet/type_inet6.result
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.result
@@ -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
@@ -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;
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.test b/plugin/type_inet/mysql-test/type_inet/type_inet6.test
index a28caa4d7d3..2abcb2a9fc5 100644
--- a/plugin/type_inet/mysql-test/type_inet/type_inet6.test
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.test
@@ -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.
@@ -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;
diff --git a/sql/field_conv.cc b/sql/field_conv.cc
index bcd4c5fbb38..f96c6742ea7 100644
--- a/sql/field_conv.cc
+++ b/sql/field_conv.cc
@@ -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())