List:Commits« Previous MessageNext Message »
From:Rafal Somla Date:October 9 2009 9:55am
Subject:bzr commit into mysql-6.0-backup branch (Rafal.Somla:2879) Bug#47386
View as plain text  
#At file:///ext/mysql/bzr/backup/bug47386/ based on revid:thavamuni.alagu@stripped

 2879 Rafal Somla	2009-10-09
      Bug #47386 - Backup fails to backup objects with case sensitive names on case 
                   sensitive OS
      
      Before: BACKUP failed if there were 2 databases whose names differ in case 
      only and when one database contains an object which is missing in the other 
      one.
      
      After: BACKUP correctly determines what objects are in which database even 
      when database names differ in case only.
     @ mysql-test/suite/backup/t/backup_dbname_case.test
        Test script with the scenario from the bug.
     @ sql/si_objects.cc
        Add explicit "COLLATE utf8_bin" phrases to the SELECT queries. This is
        not done for table/view iterators because they already correctly distinguish
        case.

    added:
      mysql-test/suite/backup/r/backup_dbname_case.result
      mysql-test/suite/backup/t/backup_dbname_case.test
    modified:
      sql/si_objects.cc
=== added file 'mysql-test/suite/backup/r/backup_dbname_case.result'
--- a/mysql-test/suite/backup/r/backup_dbname_case.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/backup/r/backup_dbname_case.result	2009-10-09 09:55:50 +0000
@@ -0,0 +1,63 @@
+#
+# Creating databases and user.
+# 
+CREATE DATABASE db1;
+CREATE DATABASE DB1;
+CREATE USER joe;
+#
+# Creating objects.
+# 
+USE db1;
+CREATE TABLE t1 (a int);
+CREATE VIEW v1 AS SELECT * FROM t1;
+CREATE PROCEDURE p1() SET @foo=1;
+CREATE FUNCTION f1() RETURNS int RETURN 1;
+CREATE TRIGGER r1 AFTER INSERT ON t1 FOR EACH ROW SET @foo=1;
+CREATE EVENT e1 ON SCHEDULE EVERY 1 YEAR DO SET @foo=1;
+GRANT  INSERT ON t1 TO joe;
+#
+# Backing-up and restoring databases.
+#
+BACKUP DATABASE db1, DB1 TO 'databases.bkp';
+backup_id
+#
+RESTORE FROM 'databases.bkp' OVERWRITE;
+backup_id
+#
+USE information_schema;
+#
+# Only db1 should contain any objects.
+#
+SELECT table_schema, table_name, table_type  
+FROM tables WHERE table_schema LIKE 'DB%';
+table_schema	table_name	table_type
+db1	t1	BASE TABLE
+db1	v1	VIEW
+--
+SELECT routine_schema, routine_name, routine_type  
+FROM routines WHERE routine_schema LIKE 'DB%';
+routine_schema	routine_name	routine_type
+db1	f1	FUNCTION
+db1	p1	PROCEDURE
+--
+SELECT trigger_schema, trigger_name
+FROM triggers WHERE trigger_schema LIKE 'DB%';
+trigger_schema	trigger_name
+db1	r1
+--
+SELECT event_schema, event_name
+FROM events WHERE event_schema LIKE 'DB%';
+event_schema	event_name
+db1	e1
+--
+SHOW GRANTS FOR joe;
+Grants for joe@%
+GRANT USAGE ON *.* TO 'joe'@'%'
+GRANT INSERT ON `db1`.`t1` TO 'joe'@'%'
+--
+#
+# Cleanup.
+#
+DROP DATABASE DB1;
+DROP DATABASE db1;
+DROP USER joe;

=== added file 'mysql-test/suite/backup/t/backup_dbname_case.test'
--- a/mysql-test/suite/backup/t/backup_dbname_case.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/backup/t/backup_dbname_case.test	2009-10-09 09:55:50 +0000
@@ -0,0 +1,71 @@
+#
+# Test scenario for BUG#47386. Check that objects which exist
+# in database db1 are not wrongly treated as objects of database DB1
+# as well.
+#
+# Note: This test can be run only on case-sensitive system because
+# it creates databases db1 and DB1.
+#
+--source include/not_embedded.inc
+--source include/have_case_sensitive_file_system.inc
+
+let $BDIR=`select @@backupdir`;
+
+--echo #
+--echo # Creating databases and user.
+--echo # 
+CREATE DATABASE db1;
+CREATE DATABASE DB1;
+CREATE USER joe;
+
+--echo #
+--echo # Creating objects.
+--echo # 
+USE db1;
+
+CREATE TABLE t1 (a int);
+CREATE VIEW v1 AS SELECT * FROM t1;
+CREATE PROCEDURE p1() SET @foo=1;
+CREATE FUNCTION f1() RETURNS int RETURN 1;
+CREATE TRIGGER r1 AFTER INSERT ON t1 FOR EACH ROW SET @foo=1;
+CREATE EVENT e1 ON SCHEDULE EVERY 1 YEAR DO SET @foo=1;
+GRANT  INSERT ON t1 TO joe;
+
+# Note that database DB1 is empty
+
+--echo #
+--echo # Backing-up and restoring databases.
+--echo #
+
+--replace_column 1 #
+BACKUP DATABASE db1, DB1 TO 'databases.bkp';
+--replace_column 1 #
+RESTORE FROM 'databases.bkp' OVERWRITE;
+
+USE information_schema;
+
+--echo #
+--echo # Only db1 should contain any objects.
+--echo #
+SELECT table_schema, table_name, table_type  
+  FROM tables WHERE table_schema LIKE 'DB%';
+--echo --
+SELECT routine_schema, routine_name, routine_type  
+  FROM routines WHERE routine_schema LIKE 'DB%';
+--echo --
+SELECT trigger_schema, trigger_name
+  FROM triggers WHERE trigger_schema LIKE 'DB%';
+--echo --
+SELECT event_schema, event_name
+  FROM events WHERE event_schema LIKE 'DB%';
+--echo --
+SHOW GRANTS FOR joe;
+--echo --
+--echo #
+--echo # Cleanup.
+--echo #
+
+DROP DATABASE DB1;
+DROP DATABASE db1;
+DROP USER joe;
+--remove_file $BDIR/databases.bkp

=== modified file 'sql/si_objects.cc'
--- a/sql/si_objects.cc	2009-09-28 09:13:54 +0000
+++ b/sql/si_objects.cc	2009-10-09 09:55:50 +0000
@@ -2573,16 +2573,16 @@ uint get_num_objects(THD *thd, const Str
   s_stream <<
     "SELECT TABLE_NAME "
     "FROM INFORMATION_SCHEMA.TABLES "
-    "WHERE table_schema = '" << db_name << "' UNION " 
+    "WHERE table_schema COLLATE utf8_bin = '" << db_name << "' UNION " 
     "SELECT TRIGGER_NAME "
     "FROM INFORMATION_SCHEMA.TRIGGERS "
-    "WHERE trigger_schema = '" << db_name << "' UNION " 
+    "WHERE trigger_schema COLLATE utf8_bin = '" << db_name << "' UNION " 
     "SELECT ROUTINE_NAME "
     "FROM INFORMATION_SCHEMA.ROUTINES "
-    "WHERE routine_schema = '" << db_name << "' UNION " 
+    "WHERE routine_schema COLLATE utf8_bin = '" << db_name << "' UNION " 
     "SELECT EVENT_NAME "
     "FROM INFORMATION_SCHEMA.EVENTS "
-    "WHERE event_schema = '" << db_name << "'";
+    "WHERE event_schema COLLATE utf8_bin = '" << db_name << "'";
 
   if (run_service_interface_sql(thd, &ed_connection, s_stream.lex_string()))
     /* Query failed with an error */
@@ -2674,7 +2674,7 @@ Obj_iterator *get_db_triggers(THD *thd, 
   s_stream <<
     "SELECT '" << db_name << "', trigger_name "
     "FROM INFORMATION_SCHEMA.TRIGGERS "
-    "WHERE trigger_schema = '" << db_name << "'";
+    "WHERE trigger_schema COLLATE utf8_bin = '" << db_name << "'";
 
   return create_row_set_iterator<Db_trigger_iterator>(thd, s_stream.lex_string());
 }
@@ -2687,7 +2687,7 @@ Obj_iterator *get_db_stored_procedures(T
   s_stream <<
     "SELECT '" << db_name << "', routine_name "
     "FROM INFORMATION_SCHEMA.ROUTINES "
-    "WHERE routine_schema = '" << db_name << "' AND "
+    "WHERE routine_schema COLLATE utf8_bin = '" << db_name << "' AND "
     "routine_type = 'PROCEDURE'";
 
   return create_row_set_iterator<Db_stored_proc_iterator>(thd, s_stream.lex_string());
@@ -2701,7 +2701,7 @@ Obj_iterator *get_db_stored_functions(TH
   s_stream <<
     "SELECT '" << db_name << "', routine_name "
     "FROM INFORMATION_SCHEMA.ROUTINES "
-    "WHERE routine_schema = '" << db_name <<"' AND "
+    "WHERE routine_schema COLLATE utf8_bin = '" << db_name <<"' AND "
     "routine_type = 'FUNCTION'";
 
   return create_row_set_iterator<Db_stored_func_iterator>(thd, s_stream.lex_string());
@@ -2716,7 +2716,7 @@ Obj_iterator *get_db_events(THD *thd, co
   s_stream <<
     "SELECT '" << db_name << "', event_name "
     "FROM INFORMATION_SCHEMA.EVENTS "
-    "WHERE event_schema = '" << db_name <<"'";
+    "WHERE event_schema COLLATE utf8_bin = '" << db_name <<"'";
 
   return create_row_set_iterator<Db_event_iterator>(thd, s_stream.lex_string());
 #else


Attachment: [text/bzr-bundle] bzr/rafal.somla@sun.com-20091009095550-bb525yyjxr4u891s.bundle
Thread
bzr commit into mysql-6.0-backup branch (Rafal.Somla:2879) Bug#47386Rafal Somla9 Oct