diff options
author | unknown <ramil/ram@mysql.com/ramil.myoffice.izhnet.ru> | 2007-07-18 12:13:45 +0500 |
---|---|---|
committer | unknown <ramil/ram@mysql.com/ramil.myoffice.izhnet.ru> | 2007-07-18 12:13:45 +0500 |
commit | 6947f2d1316c7b0b7ede841a097328da8c21aa4d (patch) | |
tree | 3d402edab86141c95ff86c4eafa22efbf0d16c81 /sql | |
parent | 7858729d94017d7bf62dfd50e4eb36b1e69cbf91 (diff) | |
download | mariadb-git-6947f2d1316c7b0b7ede841a097328da8c21aa4d.tar.gz |
Fix for bug #28125: ERROR 2013 when adding index.
Problem: we may break a multibyte char sequence using a key
reduced to maximum allowed length for a storage engine
(that leads to failed assertion in the innodb code,
see also #17530).
Fix: align truncated key length to multibyte char boundary.
mysql-test/r/innodb_mysql.result:
Fix for bug #28125: ERROR 2013 when adding index.
- test result.
mysql-test/t/innodb_mysql.test:
Fix for bug #28125: ERROR 2013 when adding index.
- test case.
sql/sql_table.cc:
Fix for bug #28125: ERROR 2013 when adding index.
- align truncated key length to multibyte char boundary.
- display real key length in bytes raising warnings.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_table.cc | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 87f23097a66..0da639f9896 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1357,6 +1357,8 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, length); push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_TOO_LONG_KEY, warn_buff); + /* Align key length to multibyte char boundary */ + length-= length % sql_field->charset->mbmaxlen; } else { @@ -1387,8 +1389,6 @@ 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(); - /* Align key length to multibyte char boundary */ - length-= length % sql_field->charset->mbmaxlen; if (key->type == Key::MULTIPLE) { /* not a critical problem */ @@ -1397,6 +1397,8 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, length); push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_TOO_LONG_KEY, warn_buff); + /* Align key length to multibyte char boundary */ + length-= length % sql_field->charset->mbmaxlen; } else { |