MDEV-32249 strings/ctype-ucs2.c:2336: my_vsnprintf_utf32: Assertion `(n % 4) == 0' failed in my_vsnprintf_utf32 on INSERT
The crash inside my_vsnprintf_utf32() happened correctly, because the caller methods: Field_string::sql_rpl_type() Field_varstring::sql_rpl_type() mis-used the charset library and sent pure ASCII data to the virtual function snprintf() of a utf32 CHARSET_INFO. It was wrong to use Field::charset() in sql_rpl_type(). We're printing the metadata (the data type) here, not the column data. The string contraining the data type of a CHAR/VARCHAR column is a pure ASCII string. Fixing to use res->charset() to print, like all virtual implementations of sql_type() do. Review was done by Andrei Elkin. Thanks to Andrei for proposing MTR test improvents.
This commit is contained in:
parent
3f1a256234
commit
6400b199ac
@ -19,6 +19,64 @@ connection master;
|
||||
INSERT INTO t1(c1) VALUES ('insert into t1');
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
#
|
||||
# MDEV-32249 strings/ctype-ucs2.c:2336: my_vsnprintf_utf32: Assertion `(n
|
||||
#
|
||||
#
|
||||
# Testing with VARCHAR
|
||||
#
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL SLAVE_TYPE_CONVERSIONS= '';
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
CREATE TABLE t1 (a INT);
|
||||
connection slave;
|
||||
ALTER TABLE t1 MODIFY a VARCHAR(1) CHARACTER SET utf32;
|
||||
connection master;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
connection slave;
|
||||
include/wait_for_slave_sql_error.inc [errno=1677]
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` varchar(1) CHARACTER SET utf32 COLLATE utf32_general_ci DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
|
||||
START SLAVE;
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
#
|
||||
# Testing with CHAR
|
||||
#
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL SLAVE_TYPE_CONVERSIONS= '';
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
CREATE TABLE t1 (a INT);
|
||||
connection slave;
|
||||
ALTER TABLE t1 MODIFY a CHAR(1) CHARACTER SET utf32;
|
||||
connection master;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
connection slave;
|
||||
include/wait_for_slave_sql_error.inc [errno=1677]
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` char(1) CHARACTER SET utf32 COLLATE utf32_general_ci DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
|
||||
START SLAVE;
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
connection slave;
|
||||
SET GLOBAL SLAVE_TYPE_CONVERSIONS= @saved_slave_type_conversions;
|
||||
include/stop_slave.inc
|
||||
include/start_slave.inc
|
||||
|
@ -34,10 +34,78 @@ DROP TABLE t1;
|
||||
|
||||
--sync_slave_with_master
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-32249 strings/ctype-ucs2.c:2336: my_vsnprintf_utf32: Assertion `(n
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # Testing with VARCHAR
|
||||
--echo #
|
||||
|
||||
-- connection slave
|
||||
-- source include/stop_slave.inc
|
||||
SET GLOBAL SLAVE_TYPE_CONVERSIONS= '';
|
||||
-- source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
CREATE TABLE t1 (a INT);
|
||||
|
||||
--sync_slave_with_master
|
||||
ALTER TABLE t1 MODIFY a VARCHAR(1) CHARACTER SET utf32;
|
||||
|
||||
--connection master
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
--connection slave
|
||||
# ER_SLAVE_CONVERSION_FAILED
|
||||
--let $slave_sql_errno= 1677
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
SHOW CREATE TABLE t1;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
|
||||
START SLAVE;
|
||||
|
||||
--connection master
|
||||
DROP TABLE t1;
|
||||
--sync_slave_with_master
|
||||
|
||||
--echo #
|
||||
--echo # Testing with CHAR
|
||||
--echo #
|
||||
|
||||
-- connection slave
|
||||
-- source include/stop_slave.inc
|
||||
SET GLOBAL SLAVE_TYPE_CONVERSIONS= '';
|
||||
-- source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
CREATE TABLE t1 (a INT);
|
||||
|
||||
--sync_slave_with_master
|
||||
ALTER TABLE t1 MODIFY a CHAR(1) CHARACTER SET utf32;
|
||||
|
||||
--connection master
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
--connection slave
|
||||
# ER_SLAVE_CONVERSION_FAILED
|
||||
--let $slave_sql_errno= 1677
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
SHOW CREATE TABLE t1;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
|
||||
START SLAVE;
|
||||
|
||||
--connection master
|
||||
DROP TABLE t1;
|
||||
--sync_slave_with_master
|
||||
|
||||
|
||||
# assertion: the slave woul hit an/several assertions:
|
||||
# before and during slave conversion procedure
|
||||
# Now that is fixed, it wont.
|
||||
|
||||
-- connection slave
|
||||
SET GLOBAL SLAVE_TYPE_CONVERSIONS= @saved_slave_type_conversions;
|
||||
-- source include/stop_slave.inc
|
||||
-- source include/start_slave.inc
|
||||
|
@ -7487,9 +7487,10 @@ void Field_string::sql_type(String &res) const
|
||||
*/
|
||||
void Field_string::sql_rpl_type(String *res) const
|
||||
{
|
||||
CHARSET_INFO *cs=charset();
|
||||
if (Field_string::has_charset())
|
||||
{
|
||||
CHARSET_INFO *cs= res->charset();
|
||||
DBUG_ASSERT(cs->mbminlen == 1);
|
||||
size_t length= cs->cset->snprintf(cs, (char*) res->ptr(),
|
||||
res->alloced_length(),
|
||||
"char(%u octets) character set %s",
|
||||
@ -7978,9 +7979,10 @@ void Field_varstring::sql_type(String &res) const
|
||||
*/
|
||||
void Field_varstring::sql_rpl_type(String *res) const
|
||||
{
|
||||
CHARSET_INFO *cs=charset();
|
||||
if (Field_varstring::has_charset())
|
||||
{
|
||||
CHARSET_INFO *cs= res->charset();
|
||||
DBUG_ASSERT(cs->mbminlen == 1);
|
||||
size_t length= cs->cset->snprintf(cs, (char*) res->ptr(),
|
||||
res->alloced_length(),
|
||||
"varchar(%u octets) character set %s",
|
||||
|
Loading…
x
Reference in New Issue
Block a user