mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
MDEV-17551 assert or crashed table when using blobs
The bug was that when long item-strings was converted to VARCHAR, type_handler::string_type_handler() didn't take into account max VARCHAR length. The resulting Aria temporary table was created with a VARCHAR field of length 1 when it should have been 65537. This caused MariaDB to send impossible records to ma_write() and Aria reported eventually the table as crashed. Fixed by updating Type_handler::string_type_handler() to not create too long VARCHAR fields. To make things extra safe, I also added checks in when writing dynamic Aria records to ensure we find the wrong record during write instead of during read.
This commit is contained in:
@@ -327,6 +327,8 @@ Type_handler::string_type_handler(uint max_octet_length)
|
||||
return &type_handler_long_blob;
|
||||
else if (max_octet_length >= 65536)
|
||||
return &type_handler_medium_blob;
|
||||
else if (max_octet_length >= MAX_FIELD_VARCHARLENGTH)
|
||||
return &type_handler_blob;
|
||||
return &type_handler_varchar;
|
||||
}
|
||||
|
||||
@@ -1372,6 +1374,7 @@ Field *Type_handler_varchar::make_conversion_table_field(TABLE *table,
|
||||
const Field *target)
|
||||
const
|
||||
{
|
||||
DBUG_ASSERT(HA_VARCHAR_PACKLENGTH(metadata) <= MAX_FIELD_VARCHARLENGTH);
|
||||
return new(table->in_use->mem_root)
|
||||
Field_varstring(NULL, metadata, HA_VARCHAR_PACKLENGTH(metadata),
|
||||
(uchar *) "", 1, Field::NONE, &empty_clex_str,
|
||||
@@ -2364,6 +2367,8 @@ Field *Type_handler_varchar::make_table_field(const LEX_CSTRING *name,
|
||||
TABLE *table) const
|
||||
|
||||
{
|
||||
DBUG_ASSERT(HA_VARCHAR_PACKLENGTH(attr.max_length) <=
|
||||
MAX_FIELD_VARCHARLENGTH);
|
||||
return new (table->in_use->mem_root)
|
||||
Field_varstring(addr.ptr, attr.max_length,
|
||||
HA_VARCHAR_PACKLENGTH(attr.max_length),
|
||||
|
||||
Reference in New Issue
Block a user