Commit 600647c7 authored by Dmitry Lenev's avatar Dmitry Lenev

Fix for bug #11759990 - "52354: 'CREATE TABLE .. LIKE ... '

STATEMENTS FAIL".

Attempt to execute CREATE TABLE LIKE statement on a MyISAM
table with INDEX or DATA DIRECTORY options specified as a
source resulted in "MyISAM table '...' is in use..." error.
According to our documentation such a statement should create
a copy of source table with DATA/INDEX DIRECTORY options
omitted.

The problem was that new implementation of CREATE TABLE LIKE
statement in 5.5 tried to copy value of INDEX and DATA DIRECTORY
parameters from the source table. Since in description of source
table this parameters also included name of this table, attempt
to create target table with these parameter led to file name
conflict and error.

This fix addresses the problem by preserving documented and
backward-compatible behavior. I.e. by ensuring that contents
of DATA/INDEX DIRECTORY clauses for the source table is
ignored when target table is created.

mysql-test/r/symlink.result:
  Added test for bug #11759990 - "52354: 'CREATE TABLE ..
  LIKE ... ' STATEMENTS FAIL".
mysql-test/t/symlink.test:
  Added test for bug #11759990 - "52354: 'CREATE TABLE ..
  LIKE ... ' STATEMENTS FAIL".
sql/sql_table.cc:
  Changed CREATE TABLE LIKE implementation to ignore contents
  of DATA/INDEX DIRECTORY clauses for source table when target
  table is created. This is documented and backward-compatible
  behavior.
parent 34baff77
...@@ -188,3 +188,28 @@ DROP TABLE user; ...@@ -188,3 +188,28 @@ DROP TABLE user;
FLUSH TABLE mysql.user; FLUSH TABLE mysql.user;
SELECT * FROM mysql.user; SELECT * FROM mysql.user;
End of 5.1 tests End of 5.1 tests
#
# Test for bug #11759990 - "52354: 'CREATE TABLE .. LIKE ... '
# STATEMENTS FAIL".
#
drop table if exists t1, t2;
create table t1 (a int primary key) engine=myisam
data directory="MYSQLTEST_VARDIR/tmp"
index directory="MYSQLTEST_VARDIR/run";
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/' INDEX DIRECTORY='MYSQLTEST_VARDIR/run/'
# CREATE TABLE LIKE statement on table with INDEX/DATA DIRECTORY
# options should not fail. Per documentation newly created table
# should not inherit value of these options from the original table.
create table t2 like t1;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop tables t1, t2;
...@@ -277,3 +277,24 @@ SELECT * FROM mysql.user; ...@@ -277,3 +277,24 @@ SELECT * FROM mysql.user;
--remove_file $MYSQL_TMP_DIR/mysql --remove_file $MYSQL_TMP_DIR/mysql
--echo End of 5.1 tests --echo End of 5.1 tests
--echo #
--echo # Test for bug #11759990 - "52354: 'CREATE TABLE .. LIKE ... '
--echo # STATEMENTS FAIL".
--echo #
--disable_warnings
drop table if exists t1, t2;
--enable_warnings
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
eval create table t1 (a int primary key) engine=myisam
data directory="$MYSQLTEST_VARDIR/tmp"
index directory="$MYSQLTEST_VARDIR/run";
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
show create table t1;
--echo # CREATE TABLE LIKE statement on table with INDEX/DATA DIRECTORY
--echo # options should not fail. Per documentation newly created table
--echo # should not inherit value of these options from the original table.
create table t2 like t1;
show create table t2;
drop tables t1, t2;
...@@ -4582,6 +4582,11 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table, ...@@ -4582,6 +4582,11 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
local_create_info.options|= create_info->options & HA_LEX_CREATE_TMP_TABLE; local_create_info.options|= create_info->options & HA_LEX_CREATE_TMP_TABLE;
/* Reset auto-increment counter for the new table. */ /* Reset auto-increment counter for the new table. */
local_create_info.auto_increment_value= 0; local_create_info.auto_increment_value= 0;
/*
Do not inherit values of DATA and INDEX DIRECTORY options from
the original table. This is documented behavior.
*/
local_create_info.data_file_name= local_create_info.index_file_name= NULL;
if ((res= mysql_create_table_no_lock(thd, table->db, table->table_name, if ((res= mysql_create_table_no_lock(thd, table->db, table->table_name,
&local_create_info, &local_alter_info, &local_create_info, &local_alter_info,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment