mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
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().
This commit is contained in:
@@ -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;
|
|||||||
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,
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user