List:Commits« Previous MessageNext Message »
From:Dmitry Lenev Date:June 9 2011 12:54pm
Subject:bzr commit into mysql-5.5 branch (Dmitry.Lenev:3434) Bug#11759990
View as plain text  
#At file:///home/dlenev/src/bzr/mysql-5.5-11759990/ based on revid:marko.makela@stripped

 3434 Dmitry Lenev	2011-06-09
      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.

    modified:
      mysql-test/r/symlink.result
      mysql-test/t/symlink.test
      sql/sql_table.cc
=== modified file 'mysql-test/r/symlink.result'
--- a/mysql-test/r/symlink.result	2011-01-31 09:34:39 +0000
+++ b/mysql-test/r/symlink.result	2011-06-09 12:54:12 +0000
@@ -188,3 +188,28 @@ DROP TABLE user;
 FLUSH TABLE mysql.user;
 SELECT * FROM mysql.user;
 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;

=== modified file 'mysql-test/t/symlink.test'
--- a/mysql-test/t/symlink.test	2011-01-31 09:34:39 +0000
+++ b/mysql-test/t/symlink.test	2011-06-09 12:54:12 +0000
@@ -277,3 +277,24 @@ SELECT * FROM mysql.user;
 --remove_file $MYSQL_TMP_DIR/mysql
 
 --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;

=== modified file 'sql/sql_table.cc'
--- a/sql/sql_table.cc	2011-06-01 08:06:55 +0000
+++ b/sql/sql_table.cc	2011-06-09 12:54:12 +0000
@@ -4582,6 +4582,11 @@ bool mysql_create_like_table(THD* thd, T
   local_create_info.options|= create_info->options & HA_LEX_CREATE_TMP_TABLE;
   /* Reset auto-increment counter for the new table. */
   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,
                                        &local_create_info, &local_alter_info,


Attachment: [text/bzr-bundle] bzr/dmitry.lenev@oracle.com-20110609125412-nqsmjkj7r87zqm6z.bundle
Thread
bzr commit into mysql-5.5 branch (Dmitry.Lenev:3434) Bug#11759990Dmitry Lenev9 Jun