summaryrefslogtreecommitdiff
path: root/sql/sql_table.cc
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2006-02-21 18:09:32 +0300
committerunknown <evgen@moonbone.local>2006-02-21 18:09:32 +0300
commit71ee8615c34db5299d51bc440309371ea08b5923 (patch)
treeae74b5f230c89a5d2c3fff3b419026ac31881893 /sql/sql_table.cc
parent387ae4abcf2d484aebe9eae6edcab81c8c9556f9 (diff)
downloadmariadb-git-71ee8615c34db5299d51bc440309371ea08b5923.tar.gz
Fixed bug#17530: Incorrect key truncation on table creation caused server crash.
When a too long field is used for a key, only a prefix part of the field is used. Length is reduced to the max key length allowed for storage. But if the field have a multibyte charset it is possible to break multibyte char sequence. This leads to the failed assertion in the innodb code and server crash when a record is inserted. The make_prepare_table() now aligns truncated key length to the boundary of multibyte char. mysql-test/t/create.test: Added test case for bug#17530: Incorrect key truncation on table creation caused server crash. mysql-test/r/create.result: Added test case for bug#17530: Incorrect key truncation on table creation caused server crash. sql/sql_table.cc: Fixed bug#17530: Incorrect key truncation on table creation caused server crash. The make_prepare_table() now aligns truncated key length to the boundary of multibyte char.
Diffstat (limited to 'sql/sql_table.cc')
-rw-r--r--sql/sql_table.cc4
1 files changed, 3 insertions, 1 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index de350b83985..a84d70f7835 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1299,7 +1299,9 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
}
if (length > file->max_key_part_length() && key->type != Key::FULLTEXT)
{
- length=file->max_key_part_length();
+ length= file->max_key_part_length();
+ /* Align key length to multibyte char boundary */
+ length-= length % sql_field->charset->mbmaxlen;
if (key->type == Key::MULTIPLE)
{
/* not a critical problem */