List:Commits« Previous MessageNext Message »
From:Satya B Date:February 3 2009 9:58am
Subject:bzr commit into mysql-6.0-bugteam branch (satya.bn:3007)
View as plain text  
#At file:///home/satya/WORK/mysql-6.0-bugteam-36573-push/

 3007 Satya B	2009-02-03 [merge]
      merge to latest 6.0-bugteam tree
modified:
  mysql-test/r/myisampack.result
  mysql-test/t/myisampack.test
  storage/myisam/myisampack.c

=== modified file 'mysql-test/r/myisampack.result'
--- a/mysql-test/r/myisampack.result	2009-01-22 05:55:26 +0000
+++ b/mysql-test/r/myisampack.result	2009-02-03 09:51:32 +0000
@@ -1,3 +1,4 @@
+DROP TABLE IF EXISTS t1,t2,t3;
 CREATE TABLE t1(c1 DOUBLE, c2 DOUBLE, c3 DOUBLE, c4 DOUBLE, c5 DOUBLE,
 c6 DOUBLE, c7 DOUBLE, c8 DOUBLE, c9 DOUBLE, a INT PRIMARY KEY);
 INSERT INTO t1 VALUES
@@ -54,3 +55,33 @@ test.t1	repair	error	Table 'test.t1' is 
 Warnings:
 Error	1036	Table 't1' is read only
 drop table t1;
+# ===== myisampack.1 =====
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES(20);
+CREATE TABLE t2(a INT);
+INSERT INTO t2 VALUES(40);
+#If the myisampack --join operation is successful, we have table t3(.frm)
+#so we should be able to query about the table from server.
+SELECT COUNT(a) FROM t3;
+COUNT(a)
+1024
+# ===== myisampack.2 =====
+#Tests the myisampack join operation with an existing destination .frm file, 
+#the command should return correct exit status(0) and
+#we should be able to query the table.
+SELECT COUNT(a) FROM t3;
+COUNT(a)
+1024
+# ===== myisampack.3 =====
+DROP TABLE t3;
+#Tests the myisampack join operation without frm file for the first and second table
+#No frm file is generated in this and we shouldn't  be able to access the newly 
+#created table
+SELECT COUNT(a) FROM t3;
+ERROR 42S02: Table 'test.t3' doesn't exist
+# ===== myisampack.4 =====
+#Tests the myisampack join operation with an existing destination .frm,.MYI,.MDI 
+#the command should fail with exit status 2
+myisampack: Can't create/write to file (Errcode: 17)
+Aborted: file is not compressed
+DROP TABLE t1,t2,t3;

=== modified file 'mysql-test/t/myisampack.test'
--- a/mysql-test/t/myisampack.test	2009-01-31 15:53:35 +0000
+++ b/mysql-test/t/myisampack.test	2009-02-03 09:51:32 +0000
@@ -1,3 +1,6 @@
+-- disable_warnings
+DROP TABLE IF EXISTS t1,t2,t3;
+-- enable_warnings
 #
 # BUG#31277 - myisamchk --unpack corrupts a table
 #
@@ -61,3 +64,111 @@ flush tables;
 optimize table t1;
 repair table t1;
 drop table t1;
+#
+# Bug#36573 myisampack --join does not create destination table .frm file
+#
+#############################################################################
+# Testcase myisampack.1: Positive test for myisampack --join
+# To test myisampack --join operation creates .frm file
+# If it creates .frm file, we will be able to access from mysql
+# server
+#############################################################################
+--echo # ===== myisampack.1 =====
+CREATE TABLE t1(a INT);
+INSERT INTO t1 VALUES(20);
+
+let $i=9;
+--disable_query_log
+while ($i)
+{
+ INSERT INTO t1 SELECT  ROUND(a * RAND() * 10) from t1;
+ dec $i;
+}
+--enable_query_log
+
+CREATE TABLE t2(a INT);
+INSERT INTO t2 VALUES(40);
+
+let $i=9;
+--disable_query_log
+while ($i)
+{
+ INSERT INTO t2 SELECT  ROUND(a * RAND() * 10) from t2;
+ dec $i;
+}
+--enable_query_log
+
+--exec $MYISAMPACK --join=$MYSQLD_DATADIR/test/t3 $MYSQLD_DATADIR/test/t1 $MYSQLD_DATADIR/test/t2 2>&1
+
+--echo #If the myisampack --join operation is successful, we have table t3(.frm)
+--echo #so we should be able to query about the table from server.
+SELECT COUNT(a) FROM t3;
+
+#############################################################################
+# Testcase myisampack.2: 2nd Positive test for myisampack --join
+# Test myisampack join operation  with an existing destination frm file.
+# It should finish the join operation successfully
+#############################################################################
+--echo # ===== myisampack.2 =====
+--remove_file $MYSQLD_DATADIR/test/t3.MYI
+--remove_file $MYSQLD_DATADIR/test/t3.MYD
+--exec $MYISAMPACK --join=$MYSQLD_DATADIR/test/t3 $MYSQLD_DATADIR/test/t1 $MYSQLD_DATADIR/test/t2 2>&1
+--echo #Tests the myisampack join operation with an existing destination .frm file, 
+--echo #the command should return correct exit status(0) and
+--echo #we should be able to query the table.
+
+SELECT COUNT(a) FROM t3;
+
+#############################################################################
+# Testcase myisampack.3: 3rd Positive test for myisampack --join
+# Test myisampack join operation  without frm file for first table and second
+# table. It should finish the join operation successfully
+#############################################################################
+--echo # ===== myisampack.3 =====
+--copy_file $MYSQLD_DATADIR/test/t1.frm  $MYSQLTEST_VARDIR/tmp/bug36573.t1.frm
+--copy_file $MYSQLD_DATADIR/test/t2.frm  $MYSQLTEST_VARDIR/tmp/bug36573.t2.frm
+--remove_file $MYSQLD_DATADIR/test/t1.frm
+--remove_file $MYSQLD_DATADIR/test/t2.frm
+
+DROP TABLE t3;
+--exec $MYISAMPACK --join=$MYSQLD_DATADIR/test/t3 $MYSQLD_DATADIR/test/t1 $MYSQLD_DATADIR/test/t2 2>&1
+--echo #Tests the myisampack join operation without frm file for the first and second table
+--echo #No frm file is generated in this and we shouldn't  be able to access the newly 
+--echo #created table
+
+--error ER_NO_SUCH_TABLE
+SELECT COUNT(a) FROM t3;
+
+--copy_file $MYSQLTEST_VARDIR/tmp/bug36573.t1.frm  $MYSQLD_DATADIR/test/t1.frm
+--copy_file $MYSQLTEST_VARDIR/tmp/bug36573.t2.frm  $MYSQLD_DATADIR/test/t2.frm
+--copy_file $MYSQLTEST_VARDIR/tmp/bug36573.t1.frm  $MYSQLD_DATADIR/test/t3.frm
+--remove_file $MYSQLTEST_VARDIR/tmp/bug36573.t1.frm
+--remove_file $MYSQLTEST_VARDIR/tmp/bug36573.t2.frm
+
+#############################################################################
+# Testcase myisampack.4: Negative test for myisampack --join
+# Test myisampack join operation  with an existing .MYI,.MDI,.frm files
+# the test should fail
+#############################################################################
+--echo # ===== myisampack.4 =====
+--echo #Tests the myisampack join operation with an existing destination .frm,.MYI,.MDI 
+--echo #the command should fail with exit status 2
+#
+# Note: Use of regular expressions in this file is for output printed in result file
+#       The main purpose of this regular expression is to supress the filenames for
+#       error messages produced so that we can create a generic result file
+#
+#1.    /.*myisampack(\.exe)?: Can't create\/write to file .*\(/myisampack: Can't create\/write to file (/
+#      Replace everything before "myisampack" or "myisampack.exe" and followed by
+#      ": Can't create\/write to file " until the first open paranthesis , with
+#      "myisampack:  Can't create\/write to file ("
+#
+#2.    /Aborted: .*is/Aborted: file is/
+#      Replace everything after starting with "Aborted: " until ending with "is" with
+#      "Aborted: file is/
+#
+--replace_regex /.*myisampack(\.exe)?: Can't create\/write to file .*\(/myisampack: Can't create\/write to file (/ /Aborted: .*is/Aborted: file is/
+--error 2
+--exec $MYISAMPACK --join=$MYSQLD_DATADIR/test/t3 $MYSQLD_DATADIR/test/t1 $MYSQLD_DATADIR/test/t2 2>&1
+
+DROP TABLE t1,t2,t3;

=== modified file 'storage/myisam/myisampack.c'
--- a/storage/myisam/myisampack.c	2009-01-08 19:06:44 +0000
+++ b/storage/myisam/myisampack.c	2009-02-03 09:51:32 +0000
@@ -44,6 +44,7 @@
 
 #define DATA_TMP_EXT		".TMD"
 #define OLD_EXT			".OLD"
+#define FRM_EXT                 ".frm"
 #define WRITE_COUNT		MY_HOW_OFTEN_TO_WRITE
 
 struct st_file_buffer {
@@ -125,6 +126,7 @@ static void get_options(int *argc,char *
 static MI_INFO *open_isam_file(char *name,int mode);
 static my_bool open_isam_files(PACK_MRG_INFO *mrg,char **names,uint count);
 static int compress(PACK_MRG_INFO *file,char *join_name);
+static int create_dest_frm(char *source_table, char *dest_table);
 static HUFF_COUNTS *init_huff_count(MI_INFO *info,my_off_t records);
 static void free_counts_and_tree_and_queue(HUFF_TREE *huff_trees,
 					   uint trees,
@@ -214,9 +216,13 @@ int main(int argc, char **argv)
 
   error=ok=isamchk_neaded=0;
   if (join_table)
-  {						/* Join files into one */
+  {
+    /*
+      Join files into one and create FRM file for the compressed table only if
+      the compression succeeds
+    */
     if (open_isam_files(&merge,argv,(uint) argc) ||
-	compress(&merge,join_table))
+	compress(&merge, join_table) || create_dest_frm(argv[0], join_table))
       error=1;
   }
   else while (argc--)
@@ -762,6 +768,45 @@ static int compress(PACK_MRG_INFO *mrg,c
   DBUG_RETURN(-1);
 }
 
+
+/** 
+  Create FRM for the destination table for --join operation
+  Copy the first table FRM as the destination table FRM file. Doing so
+  will help the mysql server to recognize the newly created table.
+  See Bug#36573.
+  
+  @param    source_table    Name of the source table 
+  @param    dest_table      Name of the destination table
+  @retval   0               Successful copy operation
+  
+  @note  We always return 0 because we don't want myisampack to report error
+  even if the copy operation fails.
+*/
+
+static int create_dest_frm(char *source_table, char *dest_table)
+{
+  char source_name[FN_REFLEN], dest_name[FN_REFLEN];
+  int error;
+  
+  DBUG_ENTER("create_dest_frm");
+  
+  (void) fn_format(source_name, source_table,
+                   "", FRM_EXT, MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS);
+  (void) fn_format(dest_name, dest_table,
+                   "", FRM_EXT, MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS);
+  /*
+    Error messages produced by my_copy() are suppressed as this
+    is not vital for --join operation. User shouldn't see any error messages 
+    like "source file frm not found" and "unable to create destination frm
+    file. So we don't pass the flag MY_WME -Write Message on Error to
+    my_copy()
+  */
+  (void) my_copy(source_name, dest_name, MYF(MY_DONT_OVERWRITE_FILE));
+  
+  return 0;
+}
+
+
 	/* Init a huff_count-struct for each field and init it */
 
 static HUFF_COUNTS *init_huff_count(MI_INFO *info,my_off_t records)

Thread
bzr commit into mysql-6.0-bugteam branch (satya.bn:3007)Satya B3 Feb