From 952c56ce5b9acfe2f9c0c9fa6b84aadb9c8b41cd Mon Sep 17 00:00:00 2001
From: unknown <gluh@eagle.intranet.mysql.r18.ru>
Date: Thu, 1 Dec 2005 13:04:19 +0400
Subject: [PATCH] Fix for bug#9785 SELECT privilege for the whole database     
             is needed to do SHOW CREATE DATABASE   To allow SHOW CREATE
 DATABASE when the user can use the database

mysql-test/r/show_check.result:
  Fix for bug#9785 SELECT privilege for the whole database
                   is needed to do SHOW CREATE DATABASE
    test result
mysql-test/t/show_check.test:
  Fix for bug#9785 SELECT privilege for the whole database
                   is needed to do SHOW CREATE DATABASE
    test case
sql/sql_show.cc:
  Fix for bug#9785 SELECT privilege for the whole database
                   is needed to do SHOW CREATE DATABASE
    removed unnecessary code
---
 mysql-test/r/show_check.result | 18 +++++++++++++++++-
 mysql-test/t/show_check.test   | 19 ++++++++++++++++++-
 sql/sql_parse.cc               |  2 --
 sql/sql_show.cc                |  6 ------
 4 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result
index de24636112..ce710eebbd 100644
--- a/mysql-test/r/show_check.result
+++ b/mysql-test/r/show_check.result
@@ -397,7 +397,8 @@ ERROR 42000: Access denied for user 'mysqltest_2'@'localhost' to database 'mysql
 select * from mysqltest.t1;
 ERROR 42000: SELECT command denied to user 'mysqltest_3'@'localhost' for table 't1'
 show create database mysqltest;
-ERROR 42000: Access denied for user 'mysqltest_3'@'localhost' to database 'mysqltest'
+Database	Create Database
+mysqltest	CREATE DATABASE `mysqltest` /*!40100 DEFAULT CHARACTER SET latin1 */
 drop table mysqltest.t1;
 drop database mysqltest;
 set names binary;
@@ -565,4 +566,19 @@ DROP TABLE urkunde;
 SHOW TABLES FROM non_existing_database;
 ERROR 42000: Unknown database 'non_existing_database'
 SHOW AUTHORS;
+create database mysqltest;
+show create database mysqltest;
+Database	Create Database
+mysqltest	CREATE DATABASE `mysqltest` /*!40100 DEFAULT CHARACTER SET latin1 */
+create table mysqltest.t1(a int);
+insert into mysqltest.t1 values(1);
+grant select on `mysqltest`.`t1` to mysqltest_4@localhost;
+show create database mysqltest;
+Database	Create Database
+mysqltest	CREATE DATABASE `mysqltest` /*!40100 DEFAULT CHARACTER SET latin1 */
+delete from mysql.user where user='mysqltest_4';
+delete from mysql.db where user='mysqltest_4';
+delete from mysql.tables_priv where user='mysqltest_4';
+flush privileges;
+drop database mysqltest;
 End of 5.1 tests
diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test
index 796b855b1d..b0d2b43204 100644
--- a/mysql-test/t/show_check.test
+++ b/mysql-test/t/show_check.test
@@ -312,7 +312,6 @@ connect (con3,localhost,mysqltest_3,,test);
 connection con3;
 --error 1142
 select * from mysqltest.t1;
---error 1044
 show create database mysqltest;
 drop table mysqltest.t1;
 drop database mysqltest;
@@ -431,4 +430,22 @@ SHOW TABLES FROM non_existing_database;
 SHOW AUTHORS;
 --enable_result_log
 
+#
+# Test for bug #9785 SELECT privilege for the whole database is needed to do SHOW CREATE DATABASE
+#
+create database mysqltest;
+show create database mysqltest;
+create table mysqltest.t1(a int);
+insert into mysqltest.t1 values(1);
+grant select on `mysqltest`.`t1` to mysqltest_4@localhost;
+connect (con4,localhost,mysqltest_4,,mysqltest);
+connection con4;
+show create database mysqltest;
+connection default;
+delete from mysql.user where user='mysqltest_4';
+delete from mysql.db where user='mysqltest_4';
+delete from mysql.tables_priv where user='mysqltest_4';
+flush privileges;
+drop database mysqltest;
+
 --echo End of 5.1 tests
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 2e2a6f4d1b..f6e94c118a 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -3664,8 +3664,6 @@ end_with_restore_list:
       my_error(ER_WRONG_DB_NAME, MYF(0), lex->name);
       break;
     }
-    if (check_access(thd,SELECT_ACL,lex->name,0,1,0,is_schema_db(lex->name)))
-      break;
     res=mysqld_show_create_db(thd,lex->name,&lex->create_info);
     break;
   }
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 025c344b86..badc15f2ab 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -482,12 +482,6 @@ bool mysqld_show_create_db(THD *thd, char *dbname,
   Protocol *protocol=thd->protocol;
   DBUG_ENTER("mysql_show_create_db");
 
-  if (check_db_name(dbname))
-  {
-    my_error(ER_WRONG_DB_NAME, MYF(0), dbname);
-    DBUG_RETURN(TRUE);
-  }
-
 #ifndef NO_EMBEDDED_ACCESS_CHECKS
   if (test_all_bits(sctx->master_access, DB_ACLS))
     db_access=DB_ACLS;
-- 
2.30.9