diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-10-11 22:51:01 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-10-11 22:51:01 +0400 |
commit | a0d3a351b8c5c2eb757270f31f9741b94f88ff1d (patch) | |
tree | 66162c7361efac12d007c476b2c4a070a23d8e97 | |
parent | 5d6d28f274e38a7691fa30a6674452ad6c8870fd (diff) | |
download | mariadb-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.result | 70 | ||||
-rw-r--r-- | plugin/type_inet/mysql-test/type_inet/type_inet6_csv.test | 51 | ||||
-rw-r--r-- | storage/csv/ha_tina.cc | 12 |
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) |