List:Commits« Previous MessageNext Message »
From:Chuck Bell Date:May 21 2009 6:13pm
Subject:bzr push into mysql-6.0-backup branch (charles.bell:2705 to 2706)
Bug#38814
View as plain text  
 2706 Chuck Bell	2009-05-21
      BUG#38814 : Backup: character_set_database change
      
      The backup system changes the character_set_database value on
      restore.
      
      This patch corrects the behavior by saving the value prior to
      backup or restore and then resets it after the operation is 
      complete.
      modified:
        mysql-test/suite/backup/r/backup_charsets.result
        mysql-test/suite/backup/t/backup_charsets.test
        sql/si_objects.cc

 2705 Rafal Somla	2009-05-18
      Bug #44423  - Default backup driver crashes server if error encountered.
      
      The problem happend if rnd_next() method called by default backup driver 
      signalled error. In that case driver did not call ha_rnd_end() which 
      should match ha_rnd_init() called at the beginning of a table scan.
      
      Note: To see the crash, comment out the call to end_tbl_read(), compile 
      and run backup_default_debug test.
      modified:
        mysql-test/suite/backup/r/backup_default_debug.result
        mysql-test/suite/backup/t/backup_default_debug.test
        sql/backup/be_default.cc

=== modified file 'mysql-test/suite/backup/r/backup_charsets.result'
--- a/mysql-test/suite/backup/r/backup_charsets.result	2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_charsets.result	2009-05-21 18:12:42 +0000
@@ -14,13 +14,37 @@ アアア	CREATE TABLE `アアア` (
   `キキキ` char(5) DEFAULT NULL
 ) ENGINE=MEMORY DEFAULT CHARSET=utf8
 INSERT INTO `アアア` VALUES ("アアア");
+#
+# Get database character set prior to operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+latin1
 BACKUP DATABASE backup_cs TO "backup_cs.bak";
 backup_id
 #
+#
+# Get database character set after operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+latin1
 DROP DATABASE backup_cs;
+#
+# Get database character set prior to operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+latin1
 RESTORE FROM "backup_cs.bak";
 backup_id
 #
+#
+# Get database character set after operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+latin1
 USE backup_cs;
 SHOW CREATE TABLE `アアア`;
 Table	Create Table
@@ -32,9 +56,21 @@ ∩╜╖∩╜╖∩latin2;
 DROP DATABASE backup_cs;
+#
+# Get database character set prior to operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+latin1
 RESTORE FROM "backup_cs.bak";
 backup_id
 #
+#
+# Get database character set after operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+latin1
 SHOW TABLES IN backup_cs;
 Tables_in_backup_cs
 ???
@@ -47,4 +83,42 @@ latin2
 SELECT @@character_set_connection;
 @@character_set_connection
 latin2
+#
+# Now test that backup doesn't change database character set.
+#
+SET @@character_set_database=swe7;
+#
+# Get database character set prior to operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+swe7
+BACKUP DATABASE backup_cs TO "backup_cs1.bak";
+backup_id
+#
+#
+# Get database character set after operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+swe7
+#
+# Now test that restore doesn't change database character set.
+#
+SET @@character_set_database=swe7;
+#
+# Get database character set prior to operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+swe7
+RESTORE FROM "backup_cs1.bak" OVERWRITE;
+backup_id
+#
+#
+# Get database character set after operation.
+#
+SELECT @@character_set_database;
+@@character_set_database
+swe7
 DROP DATABASE backup_cs;

=== modified file 'mysql-test/suite/backup/t/backup_charsets.test'
--- a/mysql-test/suite/backup/t/backup_charsets.test	2009-02-24 20:57:21 +0000
+++ b/mysql-test/suite/backup/t/backup_charsets.test	2009-05-21 18:12:42 +0000
@@ -10,6 +10,8 @@
 # 2) Test that above holds also when user changes the default character sets
 #    using SET NAMES command or if these settings are different during backup
 #    and restore time.
+# 3) Ensure the database character set (character_set_database) is not 
+#    changed after a backup or restore.
 #
 # TODO:
 #
@@ -50,13 +52,34 @@ INSERT INTO `∩╜▒∩╜▒∩╜▒` VALUES ("∩╜▒∩╜▒∩
 
 # Backup and restore database with the table.
 
+--echo #
+--echo # Get database character set prior to operation.
+--echo #
+SELECT @@character_set_database;
+
 replace_column 1 #;
 BACKUP DATABASE backup_cs TO "backup_cs.bak";
 
+--echo #
+--echo # Get database character set after operation.
+--echo #
+SELECT @@character_set_database;
+
 DROP DATABASE backup_cs;
+
+--echo #
+--echo # Get database character set prior to operation.
+--echo #
+SELECT @@character_set_database;
+
 replace_column 1 #;
 RESTORE FROM "backup_cs.bak";
 
+--echo #
+--echo # Get database character set after operation.
+--echo #
+SELECT @@character_set_database;
+
 USE backup_cs;
 SHOW CREATE TABLE `アアア`;
 SELECT * FROM `アアア`;
@@ -66,9 +89,20 @@ SELECT * FROM `アアア`;
 SET NAMES latin2;
 
 DROP DATABASE backup_cs;
+
+--echo #
+--echo # Get database character set prior to operation.
+--echo #
+SELECT @@character_set_database;
+
 replace_column 1 #;
 RESTORE FROM "backup_cs.bak";
 
+--echo #
+--echo # Get database character set after operation.
+--echo #
+SELECT @@character_set_database;
+
 SHOW TABLES IN backup_cs;
 
 # Check that RESTORE haven't changed the current character set settings.
@@ -77,6 +111,45 @@ SELECT @@character_set_client;
 SELECT @@character_set_results;
 SELECT @@character_set_connection;
 
+--echo #
+--echo # Now test that backup doesn't change database character set.
+--echo #
+
+SET @@character_set_database=swe7;
+
+--echo #
+--echo # Get database character set prior to operation.
+--echo #
+SELECT @@character_set_database;
+
+replace_column 1 #;
+BACKUP DATABASE backup_cs TO "backup_cs1.bak";
+
+--echo #
+--echo # Get database character set after operation.
+--echo #
+SELECT @@character_set_database;
+
+
+--echo #
+--echo # Now test that restore doesn't change database character set.
+--echo #
+
+SET @@character_set_database=swe7;
+
+--echo #
+--echo # Get database character set prior to operation.
+--echo #
+SELECT @@character_set_database;
+
+replace_column 1 #;
+RESTORE FROM "backup_cs1.bak" OVERWRITE;
+
+--echo #
+--echo # Get database character set after operation.
+--echo #
+SELECT @@character_set_database;
+
 # Final cleanup.
 
 DROP DATABASE backup_cs;

=== modified file 'sql/si_objects.cc'
--- a/sql/si_objects.cc	2009-05-05 17:42:58 +0000
+++ b/sql/si_objects.cc	2009-05-21 18:12:42 +0000
@@ -71,6 +71,7 @@ private:
   CHARSET_INFO *m_client_cs_saved;
   CHARSET_INFO *m_results_cs_saved;
   CHARSET_INFO *m_connection_cl_saved;
+  CHARSET_INFO *m_old_db_collation;
   Time_zone *m_tz_saved;
   TABLE *m_tmp_tables_saved;
   bool m_engage_general_log;  
@@ -102,7 +103,7 @@ void Si_session_context::save_si_ctx(THD
   m_connection_cl_saved= thd->variables.collation_connection;
   m_tz_saved= thd->variables.time_zone;
   m_tmp_tables_saved= thd->temporary_tables;
-
+  m_old_db_collation= thd->variables.collation_database;
   DBUG_VOID_RETURN;
 }
 
@@ -163,6 +164,7 @@ void Si_session_context::restore_si_ctx(
   thd->update_charset();
 
   thd->temporary_tables= m_tmp_tables_saved;
+  thd->variables.collation_database= m_old_db_collation;
 
   /*
     Turn on general log.

Thread
bzr push into mysql-6.0-backup branch (charles.bell:2705 to 2706)Bug#38814Chuck Bell21 May