mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-25900 Assertion octets < 1024' failed in Binlog_type_info_fixed_string::Binlog_type_info_fixed_string OR Assertion
field_length < 1024' failed in Field_string::save_field_metadata
A CHAR column cannot be longer than 1024, because Binlog_type_info_fixed_string::Binlog_type_info_fixed_string replies on this fact - it cannot store binlog metadata for longer columns. In case of the filename character set mbmaxlen is equal to 5, so only 1024/5=204 characters can fit into the 1024 limit. - In strict mode: Disallowing creation of a CHAR column with octet length grater than 1024. - In non-strict mode: Automatically convert CHAR with octet length>1024 into VARCHAR.
This commit is contained in:
@@ -132,4 +132,31 @@ a c
|
|||||||
@002d1 @002d1
|
@002d1 @002d1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET NAMES utf8;
|
SET NAMES utf8;
|
||||||
|
#
|
||||||
|
# MDEV-25900 Assertion `octets < 1024' failed in Binlog_type_info_fixed_string::Binlog_type_info_fixed_string OR Assertion `field_length < 1024' failed in Field_string::save_field_metadata
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a CHAR(204)) CHARACTER SET filename;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` char(204) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=filename COLLATE=filename
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a CHAR(205)) CHARACTER SET filename;
|
||||||
|
ERROR 42000: Column length too big for column 'a' (max = 204); use BLOB or TEXT instead
|
||||||
|
SET sql_mode='';
|
||||||
|
CREATE TABLE t1 (a CHAR(205)) CHARACTER SET filename;
|
||||||
|
Warnings:
|
||||||
|
Note 1246 Converting column 'a' from CHAR to VARCHAR
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` varchar(205) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=filename COLLATE=filename
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET sql_mode=DEFAULT;
|
||||||
|
CREATE TABLE t1 (a CHAR(205) CHARACTER SET latin1);
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET filename;
|
||||||
|
ERROR 42000: Column length too big for column 'a' (max = 204); use BLOB or TEXT instead
|
||||||
|
DROP TABLE t1;
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
|
@@ -141,4 +141,26 @@ SET NAMES utf8;
|
|||||||
|
|
||||||
--enable_ps_protocol
|
--enable_ps_protocol
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25900 Assertion `octets < 1024' failed in Binlog_type_info_fixed_string::Binlog_type_info_fixed_string OR Assertion `field_length < 1024' failed in Field_string::save_field_metadata
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a CHAR(204)) CHARACTER SET filename;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--error ER_TOO_BIG_FIELDLENGTH
|
||||||
|
CREATE TABLE t1 (a CHAR(205)) CHARACTER SET filename;
|
||||||
|
|
||||||
|
SET sql_mode='';
|
||||||
|
CREATE TABLE t1 (a CHAR(205)) CHARACTER SET filename;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET sql_mode=DEFAULT;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a CHAR(205) CHARACTER SET latin1);
|
||||||
|
--error ER_TOO_BIG_FIELDLENGTH
|
||||||
|
ALTER TABLE t1 CONVERT TO CHARACTER SET filename;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
|
@@ -4734,6 +4734,33 @@ bool Column_definition::prepare_blob_field(THD *thd)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("Column_definition::prepare_blob_field");
|
DBUG_ENTER("Column_definition::prepare_blob_field");
|
||||||
|
|
||||||
|
if (real_field_type() == FIELD_TYPE_STRING && length > 1024)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(charset->mbmaxlen > 4);
|
||||||
|
/*
|
||||||
|
Convert long CHAR columns to VARCHAR.
|
||||||
|
CHAR has an octet length limit of 1024 bytes.
|
||||||
|
The code in Binlog_type_info_fixed_string::Binlog_type_info_fixed_string
|
||||||
|
relies on this limit. If octet length of a CHAR column is greater
|
||||||
|
than 1024, then it cannot write its metadata to binlog properly.
|
||||||
|
In case of the filename character set with mbmaxlen=5,
|
||||||
|
the maximum possible character length is 1024/5=204 characters.
|
||||||
|
Upgrade to VARCHAR if octet length is greater than 1024.
|
||||||
|
*/
|
||||||
|
char warn_buff[MYSQL_ERRMSG_SIZE];
|
||||||
|
if (thd->is_strict_mode())
|
||||||
|
{
|
||||||
|
my_error(ER_TOO_BIG_FIELDLENGTH, MYF(0), field_name.str,
|
||||||
|
static_cast<ulong>(1024 / charset->mbmaxlen));
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
|
set_handler(&type_handler_varchar);
|
||||||
|
my_snprintf(warn_buff, sizeof(warn_buff), ER_THD(thd, ER_AUTO_CONVERT),
|
||||||
|
field_name.str, "CHAR", "VARCHAR");
|
||||||
|
push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, ER_AUTO_CONVERT,
|
||||||
|
warn_buff);
|
||||||
|
}
|
||||||
|
|
||||||
if (length > MAX_FIELD_VARCHARLENGTH && !(flags & BLOB_FLAG))
|
if (length > MAX_FIELD_VARCHARLENGTH && !(flags & BLOB_FLAG))
|
||||||
{
|
{
|
||||||
/* Convert long VARCHAR columns to TEXT or BLOB */
|
/* Convert long VARCHAR columns to TEXT or BLOB */
|
||||||
|
Reference in New Issue
Block a user