Commit d0b611a7 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-24335 Unexpected question mark in the end of a TINYTEXT column

my_copy_fix_mb() passed MIN(src_length,dst_length) to
my_append_fix_badly_formed_tail(). It could break a multi-byte
character in the middle, which put the question mark to the
destination.

Fixing the code to pass the true src_length to
my_append_fix_badly_formed_tail().
parent 026984c3
...@@ -11256,5 +11256,16 @@ DROP TABLE kv; ...@@ -11256,5 +11256,16 @@ DROP TABLE kv;
DROP VIEW v1; DROP VIEW v1;
SET NAMES utf8; SET NAMES utf8;
# #
# MDEV-24335 Unexpected question mark in the end of a TINYTEXT column
#
CREATE TABLE t1 (a TINYTEXT character set utf8);
INSERT IGNORE INTO t1 VALUES (REPEAT(_utf8 0xD184, 250));
Warnings:
Warning 1366 Incorrect string value: '\xD1\x84\xD1\x84\xD1\x84...' for column `test`.`t1`.`a` at row 1
SELECT LENGTH(a), CHAR_LENGTH(a), RIGHT(a,3) FROM t1;
LENGTH(a) CHAR_LENGTH(a) RIGHT(a,3)
254 127 ффф
DROP TABLE t1;
#
# End of 10.2 tests # End of 10.2 tests
# #
...@@ -2183,6 +2183,15 @@ DROP TABLE kv; ...@@ -2183,6 +2183,15 @@ DROP TABLE kv;
DROP VIEW v1; DROP VIEW v1;
SET NAMES utf8; SET NAMES utf8;
--echo #
--echo # MDEV-24335 Unexpected question mark in the end of a TINYTEXT column
--echo #
CREATE TABLE t1 (a TINYTEXT character set utf8);
INSERT IGNORE INTO t1 VALUES (REPEAT(_utf8 0xD184, 250));
SELECT LENGTH(a), CHAR_LENGTH(a), RIGHT(a,3) FROM t1;
DROP TABLE t1;
--echo # --echo #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #
...@@ -401,10 +401,10 @@ my_copy_fix_mb(CHARSET_INFO *cs, ...@@ -401,10 +401,10 @@ my_copy_fix_mb(CHARSET_INFO *cs,
size_t well_formed_nchars; size_t well_formed_nchars;
size_t well_formed_length; size_t well_formed_length;
size_t fixed_length; size_t fixed_length;
size_t min_length= MY_MIN(src_length, dst_length);
set_if_smaller(src_length, dst_length);
well_formed_nchars= cs->cset->well_formed_char_length(cs, well_formed_nchars= cs->cset->well_formed_char_length(cs,
src, src + src_length, src, src + min_length,
nchars, status); nchars, status);
DBUG_ASSERT(well_formed_nchars <= nchars); DBUG_ASSERT(well_formed_nchars <= nchars);
well_formed_length= status->m_source_end_pos - src; well_formed_length= status->m_source_end_pos - src;
......
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