Commit 33fc8d50 authored by unknown's avatar unknown
Browse files

Merge bk-internal:/home/bk/mysql-4.1-maint

into  neptunus.(none):/home/msvensson/mysql/mysql-4.1-maint

parents d2f1fd79 6b9d3ccb
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -1235,13 +1235,30 @@ int mi_enable_indexes(MI_INFO *info)
  RETURN
    0  indexes are not 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)
{
  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;
}
+121 −0
Original line number Diff line number Diff line
@@ -528,6 +528,127 @@ create table t1 ( a timestamp );
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
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 table t1 (c1 int);
alter table t1 rename mysqltest1.t1;
+97 −0
Original line number Diff line number Diff line
@@ -361,6 +361,103 @@ create table t1 ( a timestamp );
alter table t1 add unique ( a(1) );
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
#             db name qualifying
+67 −6
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ static int copy_data_between_tables(TABLE *from,TABLE *to,
                                    enum enum_duplicates handle_duplicates,
                                    bool ignore,
                                    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 */


/*
  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
*/
@@ -3375,7 +3424,14 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
  if (!new_table->is_view)
    error=copy_data_between_tables(table,new_table,create_list,
				   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->count_cuted_fields= CHECK_FIELD_IGNORE;

@@ -3598,7 +3654,8 @@ copy_data_between_tables(TABLE *from,TABLE *to,
                         bool ignore,
			 uint order_num, ORDER *order,
			 ha_rows *copied,
			 ha_rows *deleted)
			 ha_rows *deleted,
                         enum enum_enable_or_disable keys_onoff)
{
  int error;
  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))
    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);
  to->file->start_bulk_insert(from->file->records);