From 529b799c83ad1cfbe859aeeab80b480351e00fe9 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Mon, 12 May 2025 14:17:40 +0400 Subject: [PATCH] MDEV-21376 mysqldump should support wildcards. Now --wildcards (-L) option is supported by mysqldump. So user can specify patterns for database names or table names to dump. --- client/mysqldump.cc | 137 ++++++- mysql-test/main/mysqldump.result | 595 +++++++++++++++++++++++++++++++ mysql-test/main/mysqldump.test | 93 +++++ 3 files changed, 813 insertions(+), 12 deletions(-) diff --git a/client/mysqldump.cc b/client/mysqldump.cc index f806639f47f..dfed0a0f0ae 100644 --- a/client/mysqldump.cc +++ b/client/mysqldump.cc @@ -133,7 +133,7 @@ static my_bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0, opt_no_data_m opt_events= 0, opt_comments_used= 0, opt_alltspcs=0, opt_notspcs= 0, opt_logging, opt_header=0, opt_update_history= 0, - opt_drop_trigger= 0, opt_dump_history= 0; + opt_drop_trigger= 0, opt_dump_history= 0, opt_wildcards= 0; #define OPT_SYSTEM_ALL 1 #define OPT_SYSTEM_USERS 2 #define OPT_SYSTEM_PLUGINS 4 @@ -327,8 +327,14 @@ static struct my_option my_long_options[] = "Include all MariaDB specific create options.", &create_options, &create_options, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"databases", 'B', - "Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. 'USE db_name;' will be included in the output.", + "Dump several databases. Note the difference in usage; in this case no " + "tables are given. All name arguments are regarded as database names. " + "'USE db_name;' will be included in the output.", &opt_databases, &opt_databases, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"wildcards", 'L', "Usage of wildcards in the table/database name. Without " + "option \"databases\" wildcards can be used only in tables names, " + "with option - in databases names.", + &opt_wildcards, &opt_wildcards, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, #ifdef DBUG_OFF {"debug", '#', "This is a non-debug version. Catch this and exit.", 0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0}, @@ -7334,6 +7340,96 @@ static void do_print_set_gtid_slave_pos(const char *set_gtid_pos, fprintf(md_result_file, "%s", set_gtid_pos); } +void dump_tables_for_database_wild(const char *db, const char *pattern) +{ + int num= 1; + int number_of_tables= 0; + MYSQL_ROW row; + char buff[2*NAME_LEN+30]; + MYSQL_RES *dbinfo; + char **tables_to_dump; + /* dbcopy - unquoted db; */ + char dbcopy[2 * NAME_LEN + 30]; + + DBUG_ENTER("dump_tables_for_database_wild"); + + if (*db == '`') + { + size_t len = strlen(db); + memcpy(dbcopy, db + 1, len - 2); + dbcopy[len - 2] = 0; + } + else + { + strncpy(dbcopy, db, NAME_LEN + 1); + } + my_snprintf(buff, sizeof(buff), "SHOW TABLES IN `%s` LIKE '%s'", + dbcopy, pattern); + if(mysql_query_with_error_report(mysql, &dbinfo, buff)) + { + fprintf(stderr, + "%s: Error: '%s' when trying to find tables satisfying pattern\n", + my_progname_short, mysql_error(mysql)); + DBUG_VOID_RETURN; + } + number_of_tables= dbinfo->row_count; + if (!(tables_to_dump= (char **) my_malloc( + PSI_NOT_INSTRUMENTED, + (number_of_tables + (int) 2) * sizeof(char *), MYF(MY_WME)))) + die(EX_MYSQLERR, "Couldn't allocate memory"); + tables_to_dump[0]= dbcopy; + while ((row= mysql_fetch_row(dbinfo))) + { + tables_to_dump[num++]= row[0]; + } + tables_to_dump[num]= NULL; + if (number_of_tables > 0) + { + if (!opt_alltspcs && !opt_notspcs) + dump_tablespaces_for_tables(*tables_to_dump, (tables_to_dump + 1), + number_of_tables); + dump_selected_tables(*tables_to_dump, (tables_to_dump + 1), + number_of_tables); + } + my_free(tables_to_dump); + DBUG_VOID_RETURN; +} + + +/* pattern should be unquoted */ +void dump_databases_wild(const char *db_pattern) +{ + MYSQL_RES *dbinfo; + char buff[NAME_LEN+30]; + MYSQL_ROW row; + int i= 0; + char **databases_to_dump; + DBUG_ENTER("dump_databases_wild"); + my_snprintf(buff, sizeof(buff), "SHOW DATABASES LIKE '%s'", db_pattern); + if (mysql_query_with_error_report(mysql, &dbinfo, buff)) + { + fprintf(stderr, + "%s: Error: '%s' when trying to find databases satisfying pattern\n", + my_progname_short, mysql_error(mysql)); + DBUG_VOID_RETURN; + } + if (!(databases_to_dump= (char **) my_malloc( + PSI_NOT_INSTRUMENTED, + (dbinfo->row_count + (int) 1) * sizeof(char *), MYF(MY_WME)))) + die(EX_MYSQLERR, "Couldn't allocate memory"); + while ((row= mysql_fetch_row(dbinfo))) + { + databases_to_dump[i++]= row[0]; + } + databases_to_dump[i]= NULL; + if (!opt_alltspcs && !opt_notspcs) + dump_tablespaces_for_databases(databases_to_dump); + dump_databases(databases_to_dump); + my_free(databases_to_dump); + DBUG_VOID_RETURN; +} + + int main(int argc, char **argv) { char bin_log_name[FN_REFLEN]; @@ -7498,19 +7594,36 @@ int main(int argc, char **argv) } } - if (argc > 1 && !opt_databases) + if (opt_wildcards) { - /* Only one database and selected table(s) */ - if (!opt_alltspcs && !opt_notspcs) - dump_tablespaces_for_tables(*argv, (argv + 1), (argc - 1)); - dump_selected_tables(*argv, (argv + 1), (argc - 1)); + if (argc > 1 && !opt_databases) + /* One database, tables matching the wildcard. */ + for (int i= 1; i < argc; i++) + dump_tables_for_database_wild(argv[0], argv[i]); + else if (argc > 0) + /* Databases matching the wildcard. */ + for (int i= 0; i < argc; i++) + dump_databases_wild(argv[i]); + else + die(EX_CONSCHECK, + "Incorrect usage of patterns \n"); } - else if (argc > 0) + else { - /* One or more databases, all tables */ - if (!opt_alltspcs && !opt_notspcs) - dump_tablespaces_for_databases(argv); - dump_databases(argv); + if (argc > 1 && !opt_databases) + { + /* Only one database and selected table(s) */ + if (!opt_alltspcs && !opt_notspcs) + dump_tablespaces_for_tables(*argv, (argv + 1), (argc - 1)); + dump_selected_tables(*argv, (argv + 1), (argc - 1)); + } + else if (argc > 0) + { + /* One or more databases, all tables */ + if (!opt_alltspcs && !opt_notspcs) + dump_tablespaces_for_databases(argv); + dump_databases(argv); + } } } diff --git a/mysql-test/main/mysqldump.result b/mysql-test/main/mysqldump.result index cb1bbfb4a5c..1b4afb15a24 100644 --- a/mysql-test/main/mysqldump.result +++ b/mysql-test/main/mysqldump.result @@ -7017,3 +7017,598 @@ mariadb-dump: Error: path 'MYSQLTEST_VARDIR/tmp/mysql' exists, but it is not a d mariadb-dump: Path 'MYSQLTEST_VARDIR/tmp/dump' specified by option '--dir' is not a directory mariadb-dump: Path 'MYSQLTEST_VARDIR/does_not_exist' specified by option '--dir' does not exist ALTER DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci; +# MDEV-21376 mysqldump should support wildcards. +CREATE DATABASE test1; +USE test1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +CREATE TABLE t2(a int); +INSERT INTO t2 VALUES (21),(52),(131); +/*M!999999\- enable the sandbox mode */ + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; +DROP TABLE IF EXISTS `t1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t1` WRITE; +/*!40000 ALTER TABLE `t1` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `t1` VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE `t1` ENABLE KEYS */; +UNLOCK TABLES; +commit; +DROP TABLE IF EXISTS `t2`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t2` WRITE; +/*!40000 ALTER TABLE `t2` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `t2` VALUES +(21), +(52), +(131); +/*!40000 ALTER TABLE `t2` ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +/*M!999999\- enable the sandbox mode */ + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +DROP DATABASE test1; +# +CREATE DATABASE test1; +USE test1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +CREATE TABLE t2(a int); +INSERT INTO t2 VALUES (21),(52),(131); +/*M!999999\- enable the sandbox mode */ + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; +DROP TABLE IF EXISTS `t1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t1` WRITE; +/*!40000 ALTER TABLE `t1` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `t1` VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE `t1` ENABLE KEYS */; +UNLOCK TABLES; +commit; +DROP TABLE IF EXISTS `t2`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t2` WRITE; +/*!40000 ALTER TABLE `t2` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `t2` VALUES +(21), +(52), +(131); +/*!40000 ALTER TABLE `t2` ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +DROP DATABASE test1; +# +CREATE DATABASE test1; +USE test1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +CREATE DATABASE test2; +USE test2; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +/*M!999999\- enable the sandbox mode */ + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test1` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; + +USE `test1`; +DROP TABLE IF EXISTS `t1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t1` WRITE; +/*!40000 ALTER TABLE `t1` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `t1` VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE `t1` ENABLE KEYS */; +UNLOCK TABLES; +commit; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test2` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; + +USE `test2`; +DROP TABLE IF EXISTS `t1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t1` WRITE; +/*!40000 ALTER TABLE `t1` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `t1` VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE `t1` ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +DROP DATABASE test1; +DROP DATABASE test2; +# +CREATE DATABASE test1; +USE test1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +CREATE TABLE tt(a int); +INSERT INTO tt VALUES (2),(5),(11); +CREATE DATABASE test2; +USE test2; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +/*M!999999\- enable the sandbox mode */ + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci */; + +USE `test`; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test1` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; + +USE `test1`; +DROP TABLE IF EXISTS `t1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t1` WRITE; +/*!40000 ALTER TABLE `t1` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `t1` VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE `t1` ENABLE KEYS */; +UNLOCK TABLES; +commit; +DROP TABLE IF EXISTS `tt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `tt` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `tt` WRITE; +/*!40000 ALTER TABLE `tt` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `tt` VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE `tt` ENABLE KEYS */; +UNLOCK TABLES; +commit; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test2` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; + +USE `test2`; +DROP TABLE IF EXISTS `t1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `t1` WRITE; +/*!40000 ALTER TABLE `t1` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `t1` VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE `t1` ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +DROP DATABASE test1; +DROP DATABASE test2; +# +CREATE DATABASE test1; +USE test1; +CREATE TABLE table1(a int); +INSERT INTO table1 VALUES (2),(5),(11); +CREATE TABLE tt(a int); +INSERT INTO tt VALUES (2),(5),(11); +/*M!999999\- enable the sandbox mode */ +DROP TABLE IF EXISTS `table1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `table1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +LOCK TABLES `table1` WRITE; +/*!40000 ALTER TABLE `table1` DISABLE KEYS */; +set autocommit=0; +INSERT INTO `table1` VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE `table1` ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*M!999999\- enable the sandbox mode */ +DROP DATABASE test1; +# +# +# strange names +# +CREATE DATABASE `t?1`; +USE `t?1`; +CREATE TABLE `t?1`(a int); +INSERT INTO `t?1` VALUES (2),(5),(11); +CREATE TABLE `t%t`(a int); +INSERT INTO `t%t` VALUES (2),(5),(11); +/*M!999999\- enable the sandbox mode */ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; +DROP TABLE IF EXISTS "t?1"; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE "t?1" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES "t?1" WRITE; +/*!40000 ALTER TABLE "t?1" DISABLE KEYS */; +set autocommit=0; +INSERT INTO "t?1" VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE "t?1" ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +CREATE DATABASE `t%*!`; +USE `t%*!`; +CREATE TABLE `t???1`(a int); +INSERT INTO `t???1` VALUES (2),(5),(11); +CREATE TABLE `t___t`(a int); +INSERT INTO `t___t` VALUES (2),(5),(11); +/*M!999999\- enable the sandbox mode */ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; +DROP TABLE IF EXISTS "t???1"; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE "t???1" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES "t???1" WRITE; +/*!40000 ALTER TABLE "t???1" DISABLE KEYS */; +set autocommit=0; +INSERT INTO "t???1" VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE "t???1" ENABLE KEYS */; +UNLOCK TABLES; +commit; +DROP TABLE IF EXISTS "t___t"; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE "t___t" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES "t___t" WRITE; +/*!40000 ALTER TABLE "t___t" DISABLE KEYS */; +set autocommit=0; +INSERT INTO "t___t" VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE "t___t" ENABLE KEYS */; +UNLOCK TABLES; +commit; +DROP TABLE IF EXISTS "t%t"; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE "t%t" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES "t%t" WRITE; +/*!40000 ALTER TABLE "t%t" DISABLE KEYS */; +set autocommit=0; +INSERT INTO "t%t" VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE "t%t" ENABLE KEYS */; +UNLOCK TABLES; +commit; +DROP TABLE IF EXISTS "t?1"; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE "t?1" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES "t?1" WRITE; +/*!40000 ALTER TABLE "t?1" DISABLE KEYS */; +set autocommit=0; +INSERT INTO "t?1" VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE "t?1" ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +/*M!999999\- enable the sandbox mode */ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +/*M!999999\- enable the sandbox mode */ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; +DROP TABLE IF EXISTS "t___t"; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE "t___t" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES "t___t" WRITE; +/*!40000 ALTER TABLE "t___t" DISABLE KEYS */; +set autocommit=0; +INSERT INTO "t___t" VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE "t___t" ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +/*M!999999\- enable the sandbox mode */ +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */; +/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ "t?1" /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; + +USE "t?1"; +DROP TABLE IF EXISTS "t%t"; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE "t%t" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES "t%t" WRITE; +/*!40000 ALTER TABLE "t%t" DISABLE KEYS */; +set autocommit=0; +INSERT INTO "t%t" VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE "t%t" ENABLE KEYS */; +UNLOCK TABLES; +commit; +DROP TABLE IF EXISTS "t?1"; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE "t?1" ( + "a" int(11) DEFAULT NULL +); +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES "t?1" WRITE; +/*!40000 ALTER TABLE "t?1" DISABLE KEYS */; +set autocommit=0; +INSERT INTO "t?1" VALUES +(2), +(5), +(11); +/*!40000 ALTER TABLE "t?1" ENABLE KEYS */; +UNLOCK TABLES; +commit; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */; + +DROP DATABASE `t?1`; +DROP DATABASE `t%*!`; diff --git a/mysql-test/main/mysqldump.test b/mysql-test/main/mysqldump.test index 78d16057413..b582deb65ed 100644 --- a/mysql-test/main/mysqldump.test +++ b/mysql-test/main/mysqldump.test @@ -3146,3 +3146,96 @@ EOF --exec $MYSQL_DUMP --dir=$MYSQLTEST_VARDIR/does_not_exist mysql 2>&1 --source include/test_db_charset_restore.inc + +--echo # MDEV-21376 mysqldump should support wildcards. + +CREATE DATABASE test1; +USE test1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +CREATE TABLE t2(a int); +INSERT INTO t2 VALUES (21),(52),(131); +--exec $MYSQL_DUMP --skip-comments --wildcards=ON test1 t_ +--exec $MYSQL_DUMP --skip-comments --wildcards=ON test1 t? tx +DROP DATABASE test1; + +--echo # + +CREATE DATABASE test1; +USE test1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +CREATE TABLE t2(a int); +INSERT INTO t2 VALUES (21),(52),(131); +--exec $MYSQL_DUMP --skip-comments --wildcards=ON test1 t% +DROP DATABASE test1; + +--echo # + +CREATE DATABASE test1; +USE test1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +CREATE DATABASE test2; +USE test2; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +--exec $MYSQL_DUMP --skip-comments --databases --wildcards=ON test_ +DROP DATABASE test1; +DROP DATABASE test2; + +--echo # + +CREATE DATABASE test1; +USE test1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +CREATE TABLE tt(a int); +INSERT INTO tt VALUES (2),(5),(11); +CREATE DATABASE test2; +USE test2; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (2),(5),(11); +--exec $MYSQL_DUMP --skip-comments --databases --wildcards=ON t% +DROP DATABASE test1; +DROP DATABASE test2; + +--echo # + +CREATE DATABASE test1; +USE test1; +CREATE TABLE table1(a int); +INSERT INTO table1 VALUES (2),(5),(11); +CREATE TABLE tt(a int); +INSERT INTO tt VALUES (2),(5),(11); +--exec $MYSQL_DUMP --default-character-set=utf8mb4 --compact --opt -L test1 table1 +--exec $MYSQL_DUMP --default-character-set=utf8mb4 --compact --opt -L test1 tab?e1 +DROP DATABASE test1; + +--echo # + + +--echo # +--echo # strange names +--echo # + +CREATE DATABASE `t?1`; +USE `t?1`; +CREATE TABLE `t?1`(a int); +INSERT INTO `t?1` VALUES (2),(5),(11); +CREATE TABLE `t%t`(a int); +INSERT INTO `t%t` VALUES (2),(5),(11); +--exec $MYSQL_DUMP --default-character-set=utf8mb4 --compatible=ansi --skip-comments -L '`t?1`' 't%1' +CREATE DATABASE `t%*!`; +USE `t%*!`; +CREATE TABLE `t???1`(a int); +INSERT INTO `t???1` VALUES (2),(5),(11); +CREATE TABLE `t___t`(a int); +INSERT INTO `t___t` VALUES (2),(5),(11); +--exec $MYSQL_DUMP --default-character-set=utf8mb4 --compatible=ansi --skip-comments -L 't%' +--exec $MYSQL_DUMP --default-character-set=utf8mb4 --compatible=ansi --skip-comments -L '`t%*!`' 't?%1 ' +--exec $MYSQL_DUMP --default-character-set=utf8mb4 --compatible=ansi --skip-comments -L '`t%*!`' 't?t' 't%t' +--exec $MYSQL_DUMP --default-character-set=utf8mb4 --compatible=ansi --skip-comments --databases -L 't%1' +DROP DATABASE `t?1`; +DROP DATABASE `t%*!`; +