From 1579af9578b3578ffd7329d6cabc1eb9d73042cb Mon Sep 17 00:00:00 2001 From: "bar@mysql.com" <> Date: Wed, 24 May 2006 16:10:25 +0500 Subject: [PATCH] bug#10979 USE does not refresh db privilege changes if the same db is used in command. The problem happened because "mysql" didn't send mysql_select_db() if the current active database was specified in USE. Now it always send mysql_select_db(). Rebuilding of completion hash is skipped in the same db is used (for performance purposes). --- client/mysql.cc | 65 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/client/mysql.cc b/client/mysql.cc index 900df825b25..d0f54f7bf0c 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -2969,6 +2969,7 @@ static int com_use(String *buffer __attribute__((unused)), char *line) { char *tmp, buff[FN_REFLEN + 1]; + int select_db; bzero(buff, sizeof(buff)); strmov(buff, line); @@ -2988,34 +2989,52 @@ com_use(String *buffer __attribute__((unused)), char *line) if (!current_db || cmp_database(charset_info, current_db,tmp)) { if (one_database) - skip_updates= 1; - else { - /* - reconnect once if connection is down or if connection was found to - be down during query - */ - if (!connected && reconnect()) - return opt_reconnect ? -1 : 1; // Fatal error - if (mysql_select_db(&mysql,tmp)) - { - if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR) - return put_error(&mysql); - - if (reconnect()) - return opt_reconnect ? -1 : 1; // Fatal error - if (mysql_select_db(&mysql,tmp)) - return put_error(&mysql); - } - my_free(current_db,MYF(MY_ALLOW_ZERO_PTR)); - current_db=my_strdup(tmp,MYF(MY_WME)); -#ifdef HAVE_READLINE - build_completion_hash(rehash, 1); -#endif + skip_updates= 1; + select_db= 0; // don't do mysql_select_db() } + else + select_db= 2; // do mysql_select_db() and build_completion_hash() } else + { + /* + USE to the current db specified. + We do need to send mysql_select_db() to make server + update database level privileges, which might + change since last USE (see bug#10979). + For performance purposes, we'll skip rebuilding of completion hash. + */ skip_updates= 0; + select_db= 1; // do only mysql_select_db(), without completion + } + + if (select_db) + { + /* + reconnect once if connection is down or if connection was found to + be down during query + */ + if (!connected && reconnect()) + return opt_reconnect ? -1 : 1; // Fatal error + if (mysql_select_db(&mysql,tmp)) + { + if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR) + return put_error(&mysql); + + if (reconnect()) + return opt_reconnect ? -1 : 1; // Fatal error + if (mysql_select_db(&mysql,tmp)) + return put_error(&mysql); + } + my_free(current_db,MYF(MY_ALLOW_ZERO_PTR)); + current_db=my_strdup(tmp,MYF(MY_WME)); +#ifdef HAVE_READLINE + if (select_db > 1) + build_completion_hash(rehash, 1); +#endif + } + put_info("Database changed",INFO_INFO); return 0; }