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#38814 | Chuck Bell | 21 May |