summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorunknown <bar@mysql.com>2006-05-24 16:10:25 +0500
committerunknown <bar@mysql.com>2006-05-24 16:10:25 +0500
commita084e1fdd6a304b2416d38b8c3696f053b811415 (patch)
tree43d13cca46c96fe42c7f36b1fbf514b635b274a0 /client
parentf04b9f247314dfca21cb8bb058537535d5b8c9b0 (diff)
downloadmariadb-git-a084e1fdd6a304b2416d38b8c3696f053b811415.tar.gz
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).
Diffstat (limited to 'client')
-rw-r--r--client/mysql.cc57
1 files changed, 38 insertions, 19 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;
+ select_db= 0; // don't do mysql_select_db()
+ }
else
- {
- /*
- reconnect once if connection is down or if connection was found to
- be down during query
- */
- if (!connected && reconnect())
+ 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 (mysql_select_db(&mysql,tmp))
+ {
+ if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR)
+ return put_error(&mysql);
- if (reconnect())
+ 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));
+ 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
- }
}
- else
- skip_updates= 0;
+
put_info("Database changed",INFO_INFO);
return 0;
}