Below is the list of changes that have just been committed into a local
5.0 repository of andrey. When andrey does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2006-11-27 19:45:15+01:00, andrey@stripped +6 -0
Merge example.com:/work/bug24395-v2/my41
into example.com:/work/bug24395-v2/my50
fix for bug#24395 merge
MERGE: 1.1616.2847.4
myisam/mi_open.c@stripped, 2006-11-27 19:45:12+01:00, andrey@stripped +2 -3
manual merge - use macroses provided in 5.0
MERGE: 1.80.2.7
mysql-test/r/alter_table.result@stripped, 2006-11-27 19:45:12+01:00, andrey@stripped +1
-1
update result
MERGE: 1.40.1.11
mysql-test/t/alter_table.test@stripped, 2006-11-27 19:25:03+01:00, andrey@stripped +0 -0
Auto merged
MERGE: 1.29.1.12
sql/mysql_priv.h@stripped, 2006-11-27 19:25:03+01:00, andrey@stripped +0 -0
Auto merged
MERGE: 1.186.91.57
sql/sql_table.cc@stripped, 2006-11-27 19:45:12+01:00, andrey@stripped +6 -14
manual merge
MERGE: 1.157.2.154
sql/table.cc@stripped, 2006-11-27 19:25:03+01:00, andrey@stripped +0 -0
Auto merged
MERGE: 1.111.4.10
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: andrey
# Host: example.com
# Root: /work/bug24395-v2/my50/RESYNC
--- 1.96/myisam/mi_open.c 2006-11-27 19:45:26 +01:00
+++ 1.97/myisam/mi_open.c 2006-11-27 19:45:26 +01:00
@@ -1260,15 +1260,32 @@ int mi_enable_indexes(MI_INFO *info)
Test if indexes are disabled.
RETURN
- 0 indexes are not disabled
- 1 all indexes are disabled
- [2 non-unique indexes are disabled - NOT YET IMPLEMENTED]
+ 0 Indexes are not disabled
+ 1 All indexes are disabled
+ 2 Non-unique indexes are disabled
*/
int mi_indexes_are_disabled(MI_INFO *info)
{
MYISAM_SHARE *share= info->s;
- return (! mi_is_any_key_active(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 ||
+ (mi_is_all_keys_active(share->state.key_map, share->base.keys)))
+ return 0;
+
+ /* All are disabled */
+ if (mi_is_any_key_active(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;
}
--- 1.420/sql/mysql_priv.h 2006-11-27 19:45:26 +01:00
+++ 1.421/sql/mysql_priv.h 2006-11-27 19:45:26 +01:00
@@ -1492,6 +1492,7 @@ void update_create_info_from_table(HA_CR
int rename_file_ext(const char * from,const char * to,const char * ext);
bool check_db_name(char *db);
bool check_column_name(const char *name);
+bool at_least_one_non_unique_index_exists(const TABLE * const table);
bool check_table_name(const char *name, uint length);
char *get_field(MEM_ROOT *mem, Field *field);
bool get_field(MEM_ROOT *mem, Field *field, class String *res);
--- 1.326/sql/sql_table.cc 2006-11-27 19:45:26 +01:00
+++ 1.327/sql/sql_table.cc 2006-11-27 19:45:26 +01:00
@@ -2935,6 +2935,85 @@ err:
/*
+ Finds whether the table has at least one non-unique index
+
+ SYNOPSIS
+ at_least_one_non_unique_index_exists()
+ table Opened table
+
+ RETURN VALUES
+ FALSE No
+ TRUE Yes
+*/
+
+bool at_least_one_non_unique_index_exists(const TABLE * const table)
+{
+
+ KEY *key_info, *key_info_end;
+ DBUG_ENTER("at_least_one_non_unique_index_exists");
+
+ /*
+ Reverse walk
+ Keys are in the following order:
+ 1. Primary
+ 2. Unique
+ 3. Non-unique
+ 4. Fulltext
+ */
+ key_info= (key_info_end= (table->key_info - 1)) + table->keys;
+ for (;key_info != key_info_end ; key_info--)
+ if (!(key_info->flags & HA_NOSAME))
+ DBUG_RETURN(TRUE);
+
+ DBUG_RETURN(FALSE);
+}
+
+static bool alter_table_manage_keys(THD *thd, TABLE *table, TABLE *new_table,
+ enum enum_enable_or_disable keys_onoff)
+{
+ int error= 0;
+
+ switch (keys_onoff) {
+ case ENABLE:
+ /*
+ In 4.1 we always create a copy table. Therefore all keys are enabled
+ implicitly.
+ */
+ break;
+ case LEAVE_AS_IS:
+ {
+ /*
+ The indexes of a table could have been disabled. Thus we have to
+ check for this and if it is the case to disable them because new_table
+ is a new table which when created gets it's indexes enabled implicitly.
+ */
+ bool indexes_were_disabled= table->file->indexes_are_disabled();
+ /*
+ When all indexes are disabled and there is 1+ unique indexes, or
+ there are unique indexes disabled.
+ */
+ if ((indexes_were_disabled == 1 &&
+ at_least_one_non_unique_index_exists(new_table)) ||
+ indexes_were_disabled == 2)
+ /* fall-through: disable indexes */;
+ else
+ break;
+ }
+ case DISABLE:
+ error= new_table->file->disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
+ if (error == HA_ERR_WRONG_COMMAND)
+ {
+ push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, ER_ILLEGAL_HA,
+ ER(ER_ILLEGAL_HA), table->table_name);
+ error= 0;
+ } else if (error)
+ new_table->file->print_error(error, MYF(0));
+ }
+ return error;
+}
+
+
+/*
Alter table
*/
@@ -3582,7 +3661,12 @@ view_err:
thd->proc_info="copy to tmp table";
next_insert_id=thd->next_insert_id; // Remember for logging
copied=deleted=0;
- if (new_table && !new_table->s->is_view)
+ if (new_table &&
+ !new_table->s->is_view
+ !(error= ha_enable_transaction(thd, FALSE)) &&
+ !(error= new_table->file->external_lock(thd, F_WRLCK)) &&
+ !(error= alter_table_manage_keys(thd, table, new_table,
+ alter_info->keys_onoff)))
{
new_table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
new_table->next_number_field=new_table->found_next_number_field;
@@ -3832,22 +3916,9 @@ copy_data_between_tables(TABLE *from,TAB
bool auto_increment_field_copied= 0;
ulong save_sql_mode;
DBUG_ENTER("copy_data_between_tables");
-
- /*
- Turn off recovery logging since rollback of an alter table is to
- delete the new table so there is no need to log the changes to it.
-
- This needs to be done before external_lock
- */
- error= ha_enable_transaction(thd, FALSE);
- if (error)
- DBUG_RETURN(-1);
if (!(copy= new Copy_field[to->s->fields]))
DBUG_RETURN(-1); /* purecov: inspected */
-
- if (to->file->external_lock(thd, F_WRLCK))
- DBUG_RETURN(-1);
/* We can abort alter table for any table type */
thd->no_trans_update= 0;
--- 1.236/sql/table.cc 2006-11-27 19:45:26 +01:00
+++ 1.237/sql/table.cc 2006-11-27 19:45:26 +01:00
@@ -3002,6 +3002,7 @@ Field_iterator_table_ref::get_natural_co
return nj_col;
}
+
/*
Cleanup this table for re-execution.
--- 1.58/mysql-test/r/alter_table.result 2006-11-27 19:45:26 +01:00
+++ 1.59/mysql-test/r/alter_table.result 2006-11-27 19:45:26 +01:00
@@ -541,7 +541,128 @@ 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;
-create database mysqltest;
+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 mysqltest.t1;
drop table t1;
--- 1.45/mysql-test/t/alter_table.test 2006-11-27 19:45:26 +01:00
+++ 1.46/mysql-test/t/alter_table.test 2006-11-27 19:45:26 +01:00
@@ -372,6 +372,103 @@ 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
#
| Thread |
|---|
| • bk commit into 5.0 tree (andrey:1.2334) BUG#24395 | ahristov | 27 Nov |