Fix for bug#50946: fast index creation still seems to copy the table
Problem: ALTER TABLE ADD INDEX may lead to table copying if there's numeric field(s) with non-default display width modificator specified. Fix: compare numeric field's storage lenghts when we decide whether they can be considered 'equal' for table alteration purposes.
This commit is contained in:
parent
9ea5576662
commit
4a1a64ec53
@ -18,3 +18,26 @@ SELECT MAX(a) FROM t1 GROUP BY a,b;
|
|||||||
ERROR 23000: Can't write; duplicate key in table 'tmp_table'
|
ERROR 23000: Can't write; duplicate key in table 'tmp_table'
|
||||||
set tmp_table_size=default;
|
set tmp_table_size=default;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# Bug #50946: fast index creation still seems to copy the table
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT(100) NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (1), (0), (2);
|
||||||
|
SET SESSION debug='+d,alter_table_only_index_change';
|
||||||
|
ALTER TABLE t1 ADD INDEX a(a);
|
||||||
|
SET SESSION debug=DEFAULT;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(100) NOT NULL,
|
||||||
|
KEY `a` (`a`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a
|
||||||
|
0
|
||||||
|
1
|
||||||
|
2
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# End of 5.1 tests
|
||||||
|
#
|
||||||
|
@ -33,3 +33,19 @@ set tmp_table_size=default;
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #50946: fast index creation still seems to copy the table
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (a INT(100) NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (1), (0), (2);
|
||||||
|
SET SESSION debug='+d,alter_table_only_index_change';
|
||||||
|
ALTER TABLE t1 ADD INDEX a(a);
|
||||||
|
SET SESSION debug=DEFAULT;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 5.1 tests
|
||||||
|
--echo #
|
||||||
|
12
sql/field.cc
12
sql/field.cc
@ -8878,14 +8878,20 @@ bool Field_num::eq_def(Field *field)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check whether two numeric fields can be considered 'equal' for table
|
||||||
|
alteration purposes. Fields are equal if they are of the same type
|
||||||
|
and retain the same pack length.
|
||||||
|
*/
|
||||||
|
|
||||||
uint Field_num::is_equal(Create_field *new_field)
|
uint Field_num::is_equal(Create_field *new_field)
|
||||||
{
|
{
|
||||||
return ((new_field->sql_type == real_type()) &&
|
return ((new_field->sql_type == real_type()) &&
|
||||||
((new_field->flags & UNSIGNED_FLAG) == (uint) (flags &
|
((new_field->flags & UNSIGNED_FLAG) ==
|
||||||
UNSIGNED_FLAG)) &&
|
(uint) (flags & UNSIGNED_FLAG)) &&
|
||||||
((new_field->flags & AUTO_INCREMENT_FLAG) ==
|
((new_field->flags & AUTO_INCREMENT_FLAG) ==
|
||||||
(uint) (flags & AUTO_INCREMENT_FLAG)) &&
|
(uint) (flags & AUTO_INCREMENT_FLAG)) &&
|
||||||
(new_field->length <= max_display_length()));
|
(new_field->pack_length == pack_length()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6922,6 +6922,13 @@ view_err:
|
|||||||
&candidate_key_count))
|
&candidate_key_count))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("alter_table_only_metadata_change", {
|
||||||
|
if (need_copy_table_res != ALTER_TABLE_METADATA_ONLY)
|
||||||
|
goto err; });
|
||||||
|
DBUG_EXECUTE_IF("alter_table_only_index_change", {
|
||||||
|
if (need_copy_table_res != ALTER_TABLE_INDEX_CHANGED)
|
||||||
|
goto err; });
|
||||||
|
|
||||||
if (need_copy_table == ALTER_TABLE_METADATA_ONLY)
|
if (need_copy_table == ALTER_TABLE_METADATA_ONLY)
|
||||||
need_copy_table= need_copy_table_res;
|
need_copy_table= need_copy_table_res;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user