summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2019-10-11 22:51:01 +0400
committerAlexander Barkov <bar@mariadb.com>2019-10-11 22:51:01 +0400
commita0d3a351b8c5c2eb757270f31f9741b94f88ff1d (patch)
tree66162c7361efac12d007c476b2c4a070a23d8e97
parent5d6d28f274e38a7691fa30a6674452ad6c8870fd (diff)
downloadmariadb-git-a0d3a351b8c5c2eb757270f31f9741b94f88ff1d.tar.gz
MDEV-20790 CSV table with INET6 can be created and inserted into, but cannot be read from
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_csv.result70
-rw-r--r--plugin/type_inet/mysql-test/type_inet/type_inet6_csv.test51
-rw-r--r--storage/csv/ha_tina.cc12
3 files changed, 132 insertions, 1 deletions
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_csv.result b/plugin/type_inet/mysql-test/type_inet/type_inet6_csv.result
new file mode 100644
index 00000000000..8e972235b06
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_csv.result
@@ -0,0 +1,70 @@
+#
+# Start of 10.5 tests
+#
+#
+# MDEV-274 The data type for IPv6/IPv4 addresses in MariaDB
+#
+SET default_storage_engine=CSV;
+CREATE TABLE t1 (a INET6 NOT NULL);
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` inet6 NOT NULL
+) ENGINE=CSV DEFAULT CHARSET=latin1
+FOR i IN 0..255
+DO
+INSERT INTO t1 VALUES (CONCAT('::', HEX(i)));
+END FOR
+$$
+SELECT * FROM t1 WHERE a='::ff';
+a
+::ff
+SELECT * FROM t1 WHERE a>='::fe' ORDER BY a;
+a
+::fe
+::ff
+SELECT * FROM t1 WHERE a IN ('::80','::a0','::f0') ORDER BY a;
+a
+::80
+::a0
+::f0
+SELECT * FROM t1 WHERE a BETWEEN '::80' AND '::81' ORDER BY a;
+a
+::80
+::81
+SELECT * FROM t1 WHERE a=CAST('::ff' AS INET6);
+a
+::ff
+UPDATE t1 SET a=CONCAT('ffff', a) WHERE a LIKE '::a%';
+SELECT * FROM t1 WHERE a LIKE 'ffff::%' ORDER BY a;
+a
+ffff::a
+ffff::a0
+ffff::a1
+ffff::a2
+ffff::a3
+ffff::a4
+ffff::a5
+ffff::a6
+ffff::a7
+ffff::a8
+ffff::a9
+ffff::aa
+ffff::ab
+ffff::ac
+ffff::ad
+ffff::ae
+ffff::af
+DROP TABLE t1;
+#
+# MDEV-20790 CSV table with INET6 can be created and inserted into, but cannot be read from
+#
+CREATE TABLE t1 (a INET6 NOT NULL) ENGINE=CSV;
+INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
+SELECT * FROM t1;
+a
+2001:db8::ff00:42:8329
+DROP TABLE t1;
+#
+# End of 10.5 tests
+#
diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6_csv.test b/plugin/type_inet/mysql-test/type_inet/type_inet6_csv.test
new file mode 100644
index 00000000000..65761cf0af7
--- /dev/null
+++ b/plugin/type_inet/mysql-test/type_inet/type_inet6_csv.test
@@ -0,0 +1,51 @@
+--source include/have_csv.inc
+
+--echo #
+--echo # Start of 10.5 tests
+--echo #
+
+--echo #
+--echo # MDEV-274 The data type for IPv6/IPv4 addresses in MariaDB
+--echo #
+
+SET default_storage_engine=CSV;
+
+CREATE TABLE t1 (a INET6 NOT NULL);
+SHOW CREATE TABLE t1;
+
+DELIMITER $$;
+FOR i IN 0..255
+DO
+ INSERT INTO t1 VALUES (CONCAT('::', HEX(i)));
+END FOR
+$$
+DELIMITER ;$$
+
+SELECT * FROM t1 WHERE a='::ff';
+
+SELECT * FROM t1 WHERE a>='::fe' ORDER BY a;
+
+SELECT * FROM t1 WHERE a IN ('::80','::a0','::f0') ORDER BY a;
+
+SELECT * FROM t1 WHERE a BETWEEN '::80' AND '::81' ORDER BY a;
+
+SELECT * FROM t1 WHERE a=CAST('::ff' AS INET6);
+
+UPDATE t1 SET a=CONCAT('ffff', a) WHERE a LIKE '::a%';
+SELECT * FROM t1 WHERE a LIKE 'ffff::%' ORDER BY a;
+
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-20790 CSV table with INET6 can be created and inserted into, but cannot be read from
+--echo #
+
+CREATE TABLE t1 (a INET6 NOT NULL) ENGINE=CSV;
+INSERT INTO t1 VALUES ('2001:db8::ff00:42:8329');
+SELECT * FROM t1;
+DROP TABLE t1;
+
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index e67a43a3c1b..e5c980e0c28 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -821,6 +821,16 @@ int ha_tina::find_current_row(uchar *buf)
{
bool is_enum= ((*field)->real_type() == MYSQL_TYPE_ENUM);
/*
+ If "field" distinguishes between text and binary formats (e.g. INET6),
+ we cannot pass buffer.char() (which is &my_charset_bin) to store(),
+ to avoid "field" mis-interpreting the data format as binary.
+ Let's pass my_charset_latin1 to tell the field that we're storing
+ in text format.
+ */
+ CHARSET_INFO *storecs=
+ (*field)->type_handler()->convert_to_binary_using_val_native() ?
+ &my_charset_latin1 : buffer.charset();
+ /*
Here CHECK_FIELD_WARN checks that all values in the csv file are valid
which is normally the case, if they were written by
INSERT -> ha_tina::write_row. '0' values on ENUM fields are considered
@@ -828,7 +838,7 @@ int ha_tina::find_current_row(uchar *buf)
Thus, for enums we silence the warning, as it doesn't really mean
an invalid value.
*/
- if ((*field)->store(buffer.ptr(), buffer.length(), buffer.charset(),
+ if ((*field)->store(buffer.ptr(), buffer.length(), storecs,
is_enum ? CHECK_FIELD_IGNORE : CHECK_FIELD_WARN))
{
if (!is_enum)