Commit a0d3a351 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-20790 CSV table with INET6 can be created and inserted into, but cannot be read from

parent 5d6d28f2
#
# 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
#
--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 #
......@@ -820,6 +820,16 @@ int ha_tina::find_current_row(uchar *buf)
if (read_all || bitmap_is_set(table->read_set, (*field)->field_index))
{
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
......@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment