mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge ahristov@bk-internal.mysql.com:/home/bk/mysql-4.1-maint
into example.com:/work/bug24395-v2/my41 myisam/mi_open.c: Auto merged
This commit is contained in:
@ -1235,13 +1235,30 @@ int mi_enable_indexes(MI_INFO *info)
|
|||||||
RETURN
|
RETURN
|
||||||
0 indexes are not disabled
|
0 indexes are not disabled
|
||||||
1 all indexes are disabled
|
1 all indexes are disabled
|
||||||
[2 non-unique indexes are disabled - NOT YET IMPLEMENTED]
|
2 non-unique indexes are disabled
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int mi_indexes_are_disabled(MI_INFO *info)
|
int mi_indexes_are_disabled(MI_INFO *info)
|
||||||
{
|
{
|
||||||
MYISAM_SHARE *share= info->s;
|
MYISAM_SHARE *share= info->s;
|
||||||
|
|
||||||
return (! share->state.key_map && share->base.keys);
|
/*
|
||||||
|
No keys or all are enabled. keys is the number of keys. Left shifted
|
||||||
|
gives us only one bit set. When decreased by one, gives us all all bits
|
||||||
|
up to this one set and it gets unset.
|
||||||
|
*/
|
||||||
|
if (!share->base.keys ||
|
||||||
|
(share->state.key_map == (ULL(1) << share->base.keys) - ULL(1)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* All are disabled */
|
||||||
|
if (!share->state.key_map)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
We have keys. Some enabled, some disabled.
|
||||||
|
Don't check for any non-unique disabled but return directly 2
|
||||||
|
*/
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,6 +528,127 @@ create table t1 ( a timestamp );
|
|||||||
alter table t1 add unique ( a(1) );
|
alter table t1 add unique ( a(1) );
|
||||||
ERROR 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
|
ERROR 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
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
drop table if exists t1;
|
||||||
|
create table t1 (a int, key(a));
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
"this used not to disable the index"
|
||||||
|
alter table t1 modify a int, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||||
|
alter table t1 enable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
alter table t1 modify a bigint, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||||
|
alter table t1 enable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
alter table t1 add b char(10), disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||||
|
alter table t1 add c decimal(10,2), enable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
"this however did"
|
||||||
|
alter table t1 disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||||
|
desc t1;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
a bigint(20) YES MUL NULL
|
||||||
|
b char(10) YES NULL
|
||||||
|
c decimal(10,2) YES NULL
|
||||||
|
alter table t1 add d decimal(15,5);
|
||||||
|
"The key should still be disabled"
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||||
|
drop table t1;
|
||||||
|
"Now will test with one unique index"
|
||||||
|
create table t1(a int, b char(10), unique(a));
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
alter table t1 disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
alter table t1 enable keys;
|
||||||
|
"If no copy on noop change, this won't touch the data file"
|
||||||
|
"Unique index, no change"
|
||||||
|
alter table t1 modify a int, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
"Change the type implying data copy"
|
||||||
|
"Unique index, no change"
|
||||||
|
alter table t1 modify a bigint, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
alter table t1 modify a bigint;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
alter table t1 modify a int;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
drop table t1;
|
||||||
|
"Now will test with one unique and one non-unique index"
|
||||||
|
create table t1(a int, b char(10), unique(a), key(b));
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
t1 1 b 1 b A NULL NULL NULL YES BTREE
|
||||||
|
alter table t1 disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||||
|
alter table t1 enable keys;
|
||||||
|
"If no copy on noop change, this won't touch the data file"
|
||||||
|
"The non-unique index will be disabled"
|
||||||
|
alter table t1 modify a int, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||||
|
alter table t1 enable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
t1 1 b 1 b A NULL NULL NULL YES BTREE
|
||||||
|
"Change the type implying data copy"
|
||||||
|
"The non-unique index will be disabled"
|
||||||
|
alter table t1 modify a bigint, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||||
|
"Change again the type, but leave the indexes as_is"
|
||||||
|
alter table t1 modify a int;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||||
|
"Try the same. When data is no copied on similar tables, this is noop"
|
||||||
|
alter table t1 modify a int;
|
||||||
|
show indexes from t1;
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
|
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||||
|
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||||
|
drop table t1;
|
||||||
create database mysqltest1;
|
create database mysqltest1;
|
||||||
create table t1 (c1 int);
|
create table t1 (c1 int);
|
||||||
alter table t1 rename mysqltest1.t1;
|
alter table t1 rename mysqltest1.t1;
|
||||||
|
@ -361,6 +361,103 @@ create table t1 ( a timestamp );
|
|||||||
alter table t1 add unique ( a(1) );
|
alter table t1 add unique ( a(1) );
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #24395: ALTER TABLE DISABLE KEYS doesn't work when modifying the table
|
||||||
|
#
|
||||||
|
# This problem happens if the data change is compatible.
|
||||||
|
# Changing to the same type is compatible for example.
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
drop table if exists t1;
|
||||||
|
--enable_warnings
|
||||||
|
create table t1 (a int, key(a));
|
||||||
|
show indexes from t1;
|
||||||
|
--echo "this used not to disable the index"
|
||||||
|
alter table t1 modify a int, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
alter table t1 enable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
alter table t1 modify a bigint, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
alter table t1 enable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
alter table t1 add b char(10), disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
alter table t1 add c decimal(10,2), enable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
--echo "this however did"
|
||||||
|
alter table t1 disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
desc t1;
|
||||||
|
|
||||||
|
alter table t1 add d decimal(15,5);
|
||||||
|
--echo "The key should still be disabled"
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo "Now will test with one unique index"
|
||||||
|
create table t1(a int, b char(10), unique(a));
|
||||||
|
show indexes from t1;
|
||||||
|
alter table t1 disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
alter table t1 enable keys;
|
||||||
|
|
||||||
|
--echo "If no copy on noop change, this won't touch the data file"
|
||||||
|
--echo "Unique index, no change"
|
||||||
|
alter table t1 modify a int, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
--echo "Change the type implying data copy"
|
||||||
|
--echo "Unique index, no change"
|
||||||
|
alter table t1 modify a bigint, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
alter table t1 modify a bigint;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
alter table t1 modify a int;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo "Now will test with one unique and one non-unique index"
|
||||||
|
create table t1(a int, b char(10), unique(a), key(b));
|
||||||
|
show indexes from t1;
|
||||||
|
alter table t1 disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
alter table t1 enable keys;
|
||||||
|
|
||||||
|
|
||||||
|
--echo "If no copy on noop change, this won't touch the data file"
|
||||||
|
--echo "The non-unique index will be disabled"
|
||||||
|
alter table t1 modify a int, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
alter table t1 enable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
--echo "Change the type implying data copy"
|
||||||
|
--echo "The non-unique index will be disabled"
|
||||||
|
alter table t1 modify a bigint, disable keys;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
--echo "Change again the type, but leave the indexes as_is"
|
||||||
|
alter table t1 modify a int;
|
||||||
|
show indexes from t1;
|
||||||
|
--echo "Try the same. When data is no copied on similar tables, this is noop"
|
||||||
|
alter table t1 modify a int;
|
||||||
|
show indexes from t1;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug#11493 - Alter table rename to default database does not work without
|
# Bug#11493 - Alter table rename to default database does not work without
|
||||||
# db name qualifying
|
# db name qualifying
|
||||||
|
@ -34,11 +34,12 @@ const char *primary_key_name="PRIMARY";
|
|||||||
static bool check_if_keyname_exists(const char *name,KEY *start, KEY *end);
|
static bool check_if_keyname_exists(const char *name,KEY *start, KEY *end);
|
||||||
static char *make_unique_key_name(const char *field_name,KEY *start,KEY *end);
|
static char *make_unique_key_name(const char *field_name,KEY *start,KEY *end);
|
||||||
static int copy_data_between_tables(TABLE *from,TABLE *to,
|
static int copy_data_between_tables(TABLE *from,TABLE *to,
|
||||||
List<create_field> &create,
|
List<create_field> &create,
|
||||||
enum enum_duplicates handle_duplicates,
|
enum enum_duplicates handle_duplicates,
|
||||||
bool ignore,
|
bool ignore,
|
||||||
uint order_num, ORDER *order,
|
uint order_num, ORDER *order,
|
||||||
ha_rows *copied,ha_rows *deleted);
|
ha_rows *copied, ha_rows *deleted,
|
||||||
|
enum enum_enable_or_disable keys_onoff);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2836,6 +2837,54 @@ int mysql_drop_indexes(THD *thd, TABLE_LIST *table_list,
|
|||||||
#endif /* NOT_USED */
|
#endif /* NOT_USED */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Manages enabling/disabling of indexes for ALTER TABLE
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
alter_table_manage_keys()
|
||||||
|
table Target table
|
||||||
|
indexes_were_disabled Whether the indexes of the from table
|
||||||
|
were disabled
|
||||||
|
keys_onoff ENABLE | DISABLE | LEAVE_AS_IS
|
||||||
|
|
||||||
|
RETURN VALUES
|
||||||
|
FALSE OK
|
||||||
|
TRUE Error
|
||||||
|
*/
|
||||||
|
|
||||||
|
static
|
||||||
|
bool alter_table_manage_keys(TABLE *table, int indexes_were_disabled,
|
||||||
|
enum enum_enable_or_disable keys_onoff)
|
||||||
|
{
|
||||||
|
int error= 0;
|
||||||
|
DBUG_ENTER("alter_table_manage_keys");
|
||||||
|
DBUG_PRINT("enter", ("table=%p were_disabled=%d on_off=%d",
|
||||||
|
table, indexes_were_disabled, keys_onoff));
|
||||||
|
|
||||||
|
switch (keys_onoff) {
|
||||||
|
case ENABLE:
|
||||||
|
error= table->file->enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
|
||||||
|
break;
|
||||||
|
case LEAVE_AS_IS:
|
||||||
|
if (!indexes_were_disabled)
|
||||||
|
break;
|
||||||
|
/* fall-through: disabled indexes */
|
||||||
|
case DISABLE:
|
||||||
|
error= table->file->disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error == HA_ERR_WRONG_COMMAND)
|
||||||
|
{
|
||||||
|
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||||
|
ER_ILLEGAL_HA, ER(ER_ILLEGAL_HA), table->table_name);
|
||||||
|
error= 0;
|
||||||
|
} else if (error)
|
||||||
|
table->file->print_error(error, MYF(0));
|
||||||
|
|
||||||
|
DBUG_RETURN(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Alter table
|
Alter table
|
||||||
*/
|
*/
|
||||||
@ -3375,7 +3424,14 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||||||
if (!new_table->is_view)
|
if (!new_table->is_view)
|
||||||
error=copy_data_between_tables(table,new_table,create_list,
|
error=copy_data_between_tables(table,new_table,create_list,
|
||||||
handle_duplicates, ignore,
|
handle_duplicates, ignore,
|
||||||
order_num, order, &copied, &deleted);
|
order_num, order, &copied, &deleted,
|
||||||
|
alter_info->keys_onoff);
|
||||||
|
/*
|
||||||
|
No need to have call to alter_table_manage_keys() in the else because
|
||||||
|
in 4.1 we always copy data, except for views. In 5.0 it could happen
|
||||||
|
that no data is copied and only frm is modified. Then we have to handle
|
||||||
|
alter_info->keys_onoff outside of copy_data_between_tables
|
||||||
|
*/
|
||||||
thd->last_insert_id=next_insert_id; // Needed for correct log
|
thd->last_insert_id=next_insert_id; // Needed for correct log
|
||||||
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
|
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
|
||||||
|
|
||||||
@ -3598,7 +3654,8 @@ copy_data_between_tables(TABLE *from,TABLE *to,
|
|||||||
bool ignore,
|
bool ignore,
|
||||||
uint order_num, ORDER *order,
|
uint order_num, ORDER *order,
|
||||||
ha_rows *copied,
|
ha_rows *copied,
|
||||||
ha_rows *deleted)
|
ha_rows *deleted,
|
||||||
|
enum enum_enable_or_disable keys_onoff)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
Copy_field *copy,*copy_end;
|
Copy_field *copy,*copy_end;
|
||||||
@ -3630,6 +3687,10 @@ copy_data_between_tables(TABLE *from,TABLE *to,
|
|||||||
|
|
||||||
if (to->file->external_lock(thd, F_WRLCK))
|
if (to->file->external_lock(thd, F_WRLCK))
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
|
/* We need external lock before we can disable/enable keys */
|
||||||
|
alter_table_manage_keys(to, from->file->indexes_are_disabled(), keys_onoff);
|
||||||
|
|
||||||
from->file->info(HA_STATUS_VARIABLE);
|
from->file->info(HA_STATUS_VARIABLE);
|
||||||
to->file->start_bulk_insert(from->file->records);
|
to->file->start_bulk_insert(from->file->records);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user