1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Bug #31031 ALTER TABLE regression in 5.0

An ALTER TABLE statement which added a column and added
a non-partial index on it failed with:
            
"ERROR 1089 (HY000): Incorrect sub part key; the used
key part isn't a string, the used length is longer than
the key part, or the storage engine doesn't support unique
sub keys"
            
In a check introduced to fix an earlier bug (no. 26794),
to allow for indices on spatial type columns, the
test expression was flawed (a logical OR was used instead
of a logical AND), which led to this regression.
            
The code in question does a sanity check on the key, and
the flawed code mistakenly classified any index created
in the way specified above as a partial index.  Since
many data types does not allow partial indices, the
statement would fail.
This commit is contained in:
Magne Mahre
2009-10-09 15:04:58 +02:00
parent 63350dfc8b
commit e15708d5d2
3 changed files with 38 additions and 7 deletions

View File

@ -3233,13 +3233,21 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
}
}
else if (!f_is_geom(sql_field->pack_flag) &&
(column->length > length ||
!Field::type_can_have_key_part (sql_field->sql_type) ||
((f_is_packed(sql_field->pack_flag) ||
((file->ha_table_flags() & HA_NO_PREFIX_CHAR_KEYS) &&
(key_info->flags & HA_NOSAME))) &&
column->length != length)))
{
((column->length > length &&
!Field::type_can_have_key_part (sql_field->sql_type)) ||
((f_is_packed(sql_field->pack_flag) ||
((file->ha_table_flags() & HA_NO_PREFIX_CHAR_KEYS) &&
(key_info->flags & HA_NOSAME))) &&
column->length != length)))
{
/* Catch invalid uses of partial keys.
A key is identified as 'partial' if column->length != length.
A partial key is invalid if they data type does
not allow it, or the field is packed (as in MyISAM),
or the storage engine doesn't allow prefixed search and
the key is primary key.
*/
my_message(ER_WRONG_SUB_KEY, ER(ER_WRONG_SUB_KEY), MYF(0));
DBUG_RETURN(TRUE);
}