diff --git a/client/client_priv.h b/client/client_priv.h index 2763dabb027..a80701ba6c9 100644 --- a/client/client_priv.h +++ b/client/client_priv.h @@ -59,5 +59,6 @@ enum options_client OPT_MYSQL_PRESERVE_SCHEMA, OPT_IGNORE_TABLE,OPT_INSERT_IGNORE,OPT_SHOW_WARNINGS,OPT_DROP_DATABASE, OPT_TZ_UTC, OPT_AUTO_CLOSE, OPT_CREATE_SLAP_SCHEMA, - OPT_MYSQL_REPLACE_INTO, OPT_BASE64_OUTPUT, OPT_SERVER_ID + OPT_MYSQL_REPLACE_INTO, OPT_BASE64_OUTPUT, OPT_SERVER_ID, + OPT_FIX_TABLE_NAMES, OPT_FIX_DB_NAMES }; diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 7ddfbbd7211..acc3c1c1a07 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -34,7 +34,8 @@ static my_bool opt_alldbs = 0, opt_check_only_changed = 0, opt_extended = 0, opt_compress = 0, opt_databases = 0, opt_fast = 0, opt_medium_check = 0, opt_quick = 0, opt_all_in_1 = 0, opt_silent = 0, opt_auto_repair = 0, ignore_errors = 0, - tty_password = 0, opt_frm = 0, opt_upgrade= 0; + tty_password = 0, opt_frm = 0, + opt_fix_table_names= 0, opt_fix_db_names= 0, opt_upgrade= 0; static uint verbose = 0, opt_mysql_port=0; static my_string opt_mysql_unix_port = 0; static char *opt_password = 0, *current_user = 0, @@ -48,7 +49,7 @@ static char *shared_memory_base_name=0; static uint opt_protocol=0; static CHARSET_INFO *charset_info= &my_charset_latin1; -enum operations {DO_CHECK, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE}; +enum operations { DO_CHECK, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE }; static struct my_option my_long_options[] = { @@ -101,6 +102,12 @@ static struct my_option my_long_options[] = {"fast",'F', "Check only tables that haven't been closed properly.", (gptr*) &opt_fast, (gptr*) &opt_fast, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"fix-db-names", OPT_FIX_DB_NAMES, "Fix database names.", + (gptr*) &opt_fix_db_names, (gptr*) &opt_fix_db_names, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"fix-table-names", OPT_FIX_TABLE_NAMES, "Fix table names.", + (gptr*) &opt_fix_table_names, (gptr*) &opt_fix_table_names, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"force", 'f', "Continue even if we get an sql-error.", (gptr*) &ignore_errors, (gptr*) &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -174,6 +181,7 @@ static int process_all_databases(); static int process_databases(char **db_names); static int process_selected_tables(char *db, char **table_names, int tables); static int process_all_tables_in_db(char *database); +static int process_one_db(char *database); static int use_db(char *database); static int handle_request_for_tables(char *tables, uint length); static int dbConnect(char *host, char *user,char *passwd); @@ -254,6 +262,15 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), case 'o': what_to_do = DO_OPTIMIZE; break; + case OPT_FIX_DB_NAMES: + what_to_do= DO_UPGRADE; + default_charset= (char*) "utf8"; + opt_databases= 1; + break; + case OPT_FIX_TABLE_NAMES: + what_to_do= DO_UPGRADE; + default_charset= (char*) "utf8"; + break; case 'p': if (argument) { @@ -376,7 +393,7 @@ static int process_all_databases() } while ((row = mysql_fetch_row(tableres))) { - if (process_all_tables_in_db(row[0])) + if (process_one_db(row[0])) result = 1; } return result; @@ -389,7 +406,7 @@ static int process_databases(char **db_names) int result = 0; for ( ; *db_names ; db_names++) { - if (process_all_tables_in_db(*db_names)) + if (process_one_db(*db_names)) result = 1; } return result; @@ -502,6 +519,43 @@ static int process_all_tables_in_db(char *database) } /* process_all_tables_in_db */ + +static int fix_object_name(const char *obj, const char *name) +{ + char qbuf[100 + NAME_LEN*4]; + int rc= 0; + if (strncmp(name, "#mysql50#", 9)) + return 1; + sprintf(qbuf, "RENAME %s `%s` TO `%s`", obj, name, name + 9); + if (mysql_query(sock, qbuf)) + { + fprintf(stderr, "Failed to %s\n", qbuf); + fprintf(stderr, "Error: %s\n", mysql_error(sock)); + rc= 1; + } + if (verbose) + printf("%-50s %s\n", name, rc ? "FAILED" : "OK"); + return rc; +} + + +static int process_one_db(char *database) +{ + if (what_to_do == DO_UPGRADE) + { + int rc= 0; + if (opt_fix_db_names && !strncmp(database,"#mysql50#", 9)) + { + rc= fix_object_name("DATABASE", database); + database+= 9; + } + if (rc || !opt_fix_table_names) + return rc; + } + return process_all_tables_in_db(database); +} + + static int use_db(char *database) { if (mysql_get_server_version(sock) >= 50003 && @@ -546,6 +600,8 @@ static int handle_request_for_tables(char *tables, uint length) case DO_OPTIMIZE: op = "OPTIMIZE"; break; + case DO_UPGRADE: + return fix_object_name("TABLE", tables); } if (!(query =(char *) my_malloc((sizeof(char)*(length+110)), MYF(MY_WME)))) diff --git a/mysql-test/r/upgrade.result b/mysql-test/r/upgrade.result new file mode 100644 index 00000000000..f7c8e8cdfa0 --- /dev/null +++ b/mysql-test/r/upgrade.result @@ -0,0 +1,43 @@ +drop database if exists `testdb1`; +drop database if exists `testdb-1`; +drop database if exists `#mysql50#testdb-1`; +create database `testdb1`; +create database `#mysql50#testdb-1`; +create table `testdb1`.`t1` (a int); +create table `testdb1`.`#mysql50#t-1` (a int); +create table `#mysql50#testdb-1`.`t1` (a int); +create table `#mysql50#testdb-1`.`#mysql50#t-1` (a int); +show create database `testdb1`; +Database Create Database +testdb1 CREATE DATABASE `testdb1` /*!40100 DEFAULT CHARACTER SET latin1 */ +show create database `testdb-1`; +ERROR 42000: Unknown database 'testdb-1' +show create database `#mysql50#testdb-1`; +Database Create Database +#mysql50#testdb-1 CREATE DATABASE `#mysql50#testdb-1` /*!40100 DEFAULT CHARACTER SET latin1 */ +show tables in `testdb1`; +Tables_in_testdb1 +#mysql50#t-1 +t1 +show tables in `#mysql50#testdb-1`; +Tables_in_#mysql50#testdb-1 +#mysql50#t-1 +t1 +show create database `testdb1`; +Database Create Database +testdb1 CREATE DATABASE `testdb1` /*!40100 DEFAULT CHARACTER SET latin1 */ +show create database `testdb-1`; +Database Create Database +testdb-1 CREATE DATABASE `testdb-1` /*!40100 DEFAULT CHARACTER SET latin1 */ +show create database `#mysql50#testdb-1`; +ERROR 42000: Unknown database '#mysql50#testdb-1' +show tables in `testdb1`; +Tables_in_testdb1 +t1 +t-1 +show tables in `testdb-1`; +Tables_in_testdb-1 +t1 +t-1 +drop database `testdb1`; +drop database `testdb-1`; diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index 0c078d19988..b9f1e36349c 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -43,3 +43,6 @@ rpl_sp : Bug#16456 rpl_until : Unstable test case, bug#15886 sp-goto : GOTO is currently is disabled - will be fixed in the future subselect : Bug#15706 (ps mode) [PATCH PENDING] +rpl_ndb_blob : Bug #17505 +rpl_ndb_blob2 : Bug #17505 +rpl_ndb_log : results are not deterministic diff --git a/mysql-test/t/upgrade.test b/mysql-test/t/upgrade.test new file mode 100644 index 00000000000..826f486e4c0 --- /dev/null +++ b/mysql-test/t/upgrade.test @@ -0,0 +1,28 @@ +--disable_warnings +drop database if exists `testdb1`; +drop database if exists `testdb-1`; +drop database if exists `#mysql50#testdb-1`; +--enable_warnings +create database `testdb1`; +create database `#mysql50#testdb-1`; +create table `testdb1`.`t1` (a int); +create table `testdb1`.`#mysql50#t-1` (a int); +create table `#mysql50#testdb-1`.`t1` (a int); +create table `#mysql50#testdb-1`.`#mysql50#t-1` (a int); +show create database `testdb1`; +--error 1049 +show create database `testdb-1`; +show create database `#mysql50#testdb-1`; +show tables in `testdb1`; +show tables in `#mysql50#testdb-1`; + +--exec $MYSQL_CHECK --all-databases --fix-db-names --fix-table-names + +show create database `testdb1`; +show create database `testdb-1`; +--error 1049 +show create database `#mysql50#testdb-1`; +show tables in `testdb1`; +show tables in `testdb-1`; +drop database `testdb1`; +drop database `testdb-1`;