Commit 70fe41d2 authored by unknown's avatar unknown
Browse files

A fix (bug #4802 prompt in mysql client shows wrong database after dropping default db).


client/mysql.cc:
  A fix (bug #4802 prompt in mysql client shows wrong database after dropping default db).
  Introduced new get_current_db() function which is called from the com_use()
  and the com_go() if we get SERVER_STATUS_DB_DROPPED.
include/mysql_com.h:
  A fix (bug #4802 prompt in mysql client shows wrong database after dropping default db).
  SERVER_STATUS_DB_DROPPED flag added.
    Note: it is set to 256 to don't conflict with 5.0 ver.
sql/sql_db.cc:
  A fix (bug #4802 prompt in mysql client shows wrong database after dropping default db).
  SERVER_STATUS_DB_DROPPED flag is set/unset.
parent ffd77c46
Loading
Loading
Loading
Loading
+20 −18
Original line number Diff line number Diff line
@@ -1574,6 +1574,22 @@ static int reconnect(void)
  return 0;
}

static void get_current_db()
{
  MYSQL_RES *res;

  my_free(current_db, MYF(MY_ALLOW_ZERO_PTR));
  current_db= NULL;
  /* In case of error below current_db will be NULL */
  if (!mysql_query(&mysql, "SELECT DATABASE()") &&
      (res= mysql_use_result(&mysql)))
  {
    MYSQL_ROW row= mysql_fetch_row(res);
    if (row[0])
      current_db= my_strdup(row[0], MYF(MY_WME));
    mysql_free_result(res);
  }
}

/***************************************************************************
 The different commands
@@ -1899,6 +1915,9 @@ com_go(String *buffer,char *line __attribute__((unused)))
  if (err >= 1)
    error= put_error(&mysql);

  if (!status.batch && (mysql.server_status & SERVER_STATUS_DB_DROPPED))
    get_current_db();

  return error;				/* New command follows */
}

@@ -2614,24 +2633,7 @@ com_use(String *buffer __attribute__((unused)), char *line)
    under our feet, for example if DROP DATABASE or RENAME DATABASE
    (latter one not yet available by the time the comment was written)
  */
  /*  Let's reset current_db, assume it's gone */
  my_free(current_db, MYF(MY_ALLOW_ZERO_PTR));
  current_db= 0;
  /*
    We don't care about in case of an error below because current_db
    was just set to 0.
  */
  if (!mysql_query(&mysql, "SELECT DATABASE()") &&
      (res= mysql_use_result(&mysql)))
  {
    row= mysql_fetch_row(res);
    if (row[0])
    {
      current_db= my_strdup(row[0], MYF(MY_WME));
    }
    (void) mysql_fetch_row(res);               // Read eof
    mysql_free_result(res);
  }
  get_current_db();

  if (!current_db || cmp_database(charset_info, current_db,tmp))
  {
+1 −0
Original line number Diff line number Diff line
@@ -127,6 +127,7 @@ enum enum_server_command
#define SERVER_MORE_RESULTS_EXISTS 8    /* Multi query - next query exists */
#define SERVER_QUERY_NO_GOOD_INDEX_USED 16
#define SERVER_QUERY_NO_INDEX_USED      32
#define SERVER_STATUS_DB_DROPPED        256 /* A database was dropped */

#define MYSQL_ERRMSG_SIZE	512
#define NET_READ_TIMEOUT	30		/* Timeout on read */
+2 −0
Original line number Diff line number Diff line
@@ -634,7 +634,9 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
      thd->clear_error();
      mysql_bin_log.write(&qinfo);
    }
    thd->server_status|= SERVER_STATUS_DB_DROPPED;
    send_ok(thd, (ulong) deleted);
    thd->server_status&= !SERVER_STATUS_DB_DROPPED;
  }

exit: