Merge 10.2 into 10.3

This commit is contained in:
Marko Mäkelä 2020-11-02 15:48:47 +02:00
commit c7f322c91f
32 changed files with 1636 additions and 97 deletions

View file

@ -205,7 +205,8 @@ Bucket *find_longest_match(HashTable *ht, char *str, uint length,
void completion_hash_clean(HashTable *ht)
{
free_root(&ht->mem_root,MYF(0));
bzero((char*) ht->arBuckets,ht->nTableSize*sizeof(Bucket *));
if (size_t s= ht->nTableSize)
bzero((char*) ht->arBuckets, s * sizeof(Bucket *));
}

View file

@ -39,7 +39,8 @@
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
*/
#define DUMP_VERSION "10.18"
/* on merge conflict, bump to a higher version again */
#define DUMP_VERSION "10.19"
#include <my_global.h>
#include <my_sys.h>
@ -117,6 +118,21 @@ 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_drop_trigger= 0 ;
#define OPT_SYSTEM_ALL 1
#define OPT_SYSTEM_USERS 2
#define OPT_SYSTEM_PLUGINS 4
#define OPT_SYSTEM_UDFS 8
#define OPT_SYSTEM_SERVERS 16
#define OPT_SYSTEM_STATS 32
#define OPT_SYSTEM_TIMEZONES 64
static const char *opt_system_type_values[]=
{"all", "users", "plugins", "udfs", "servers", "stats", "timezones"};
static TYPELIB opt_system_types=
{
array_elements(opt_system_type_values), "system dump options",
opt_system_type_values, NULL
};
static ulonglong opt_system= 0ULL;
static my_bool insert_pat_inited= 0, debug_info_flag= 0, debug_check_flag= 0,
select_field_names_inited= 0;
static ulong opt_max_allowed_packet, opt_net_buffer_length;
@ -534,6 +550,8 @@ static struct my_option my_long_options[] =
&opt_mysql_unix_port, &opt_mysql_unix_port, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#include <sslopt-longopts.h>
{"system", 256, "Dump system tables as portable SQL",
&opt_system, &opt_system, &opt_system_types, GET_SET, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"tab",'T',
"Create tab-separated textfile for each table to given path. (Create .sql "
"and .txt files.) NOTE: This only works if mysqldump is run on the same "
@ -576,7 +594,7 @@ static const char *load_default_groups[]=
static void maybe_exit(int error);
static void die(int error, const char* reason, ...);
static void maybe_die(int error, const char* reason, ...);
static void write_header(FILE *sql_file, char *db_name);
static void write_header(FILE *sql_file, const char *db_name);
static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row,
const char *prefix,const char *name,
int string_value);
@ -587,6 +605,12 @@ static int init_dumping_tables(char *);
static int init_dumping(char *, int init_func(char*));
static int dump_databases(char **);
static int dump_all_databases();
static int dump_all_users_roles_and_grants();
static int dump_all_plugins();
static int dump_all_udfs();
static int dump_all_servers();
static int dump_all_stats();
static int dump_all_timezones();
static char *quote_name(const char *name, char *buff, my_bool force);
char check_if_ignore_table(const char *table_name, char *table_type);
static char *primary_key_fields(const char *table_name);
@ -648,9 +672,10 @@ static void print_version(void)
static void short_usage_sub(FILE *f)
{
fprintf(f, "Usage: %s [OPTIONS] database [tables]\n", my_progname_short);
fprintf(f, "OR %s [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]\n",
fprintf(f, "OR %s [OPTIONS] --databases DB1 [DB2 DB3...]\n",
my_progname_short);
fprintf(f, "OR %s [OPTIONS] --all-databases [OPTIONS]\n", my_progname_short);
fprintf(f, "OR %s [OPTIONS] --all-databases\n", my_progname_short);
fprintf(f, "OR %s [OPTIONS] --system=[SYSTEMOPTIONS]]\n", my_progname_short);
}
@ -698,7 +723,7 @@ static const char *fix_for_comment(const char *ident)
}
static void write_header(FILE *sql_file, char *db_name)
static void write_header(FILE *sql_file, const char *db_name)
{
if (opt_xml)
{
@ -1045,6 +1070,76 @@ static int get_options(int *argc, char ***argv)
if ((ho_error= handle_options(argc, argv, my_long_options, get_one_option)))
return(ho_error);
if (opt_system & OPT_SYSTEM_ALL)
opt_system|= ~0;
if (opt_system & OPT_SYSTEM_USERS &&
(my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.db", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.global_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.tables_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.columns_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.procs_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.user", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.host", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.proxies_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.roles_mapping", MYF(MY_WME))) ||
/* and MySQL-8.0 role tables (role_edges and default_roles) as well */
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.role_edges", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.default_roles", MYF(MY_WME)))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_PLUGINS &&
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.plugin", MYF(MY_WME))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_UDFS &&
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.func", MYF(MY_WME))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_SERVERS &&
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.servers", MYF(MY_WME))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_STATS &&
(my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.column_stats", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.index_stats", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.table_stats", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.innodb_table_stats", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.innodb_index_stats", MYF(MY_WME)))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_TIMEZONES &&
(my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.time_zone", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.time_zone_leap_second", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.time_zone_name", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.time_zone_transition", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup("mysql.time_zone_transition_type", MYF(MY_WME)))))
return(EX_EOM);
*mysql_params->p_max_allowed_packet= opt_max_allowed_packet;
*mysql_params->p_net_buffer_length= opt_net_buffer_length;
if (debug_info_flag)
@ -1109,7 +1204,7 @@ static int get_options(int *argc, char ***argv)
!(charset_info= get_charset_by_csname(default_charset,
MY_CS_PRIMARY, MYF(MY_WME))))
exit(1);
if ((*argc < 1 && !opt_alldbs) || (*argc > 0 && opt_alldbs))
if ((*argc < 1 && (!opt_alldbs && !opt_system)) || (*argc > 0 && opt_alldbs))
{
short_usage(stderr);
return EX_USAGE;
@ -1233,7 +1328,6 @@ static int fetch_db_collation(const char *db_name,
my_bool err_status= FALSE;
MYSQL_RES *db_cl_res;
MYSQL_ROW db_cl_row;
if (mysql_select_db(mysql, db_name))
{
DB_error(mysql, "when selecting the database");
@ -2816,7 +2910,7 @@ static void get_sequence_structure(const char *seq, const char *db)
number of fields in table, 0 if error
*/
static uint get_table_structure(char *table, char *db, char *table_type,
static uint get_table_structure(const char *table, const char *db, char *table_type,
char *ignore_flag)
{
my_bool init=0, delayed, write_data, complete_insert;
@ -3765,7 +3859,7 @@ static char *alloc_query_str(size_t size)
*/
static void dump_table(char *table, char *db, const uchar *hash_key, size_t len)
static void dump_table(const char *table, const char *db, const uchar *hash_key, size_t len)
{
char ignore_flag;
char buf[200], table_buff[NAME_LEN+3];
@ -4297,6 +4391,442 @@ static char *getTableName(int reset)
} /* getTableName */
/*
dump user/role grants
ARGS
user_role: is either a user, or a role
*/
static int dump_grants(const char *user_role)
{
DYNAMIC_STRING sqlbuf;
MYSQL_ROW row;
MYSQL_RES *tableres;
init_dynamic_string_checked(&sqlbuf, "SHOW GRANTS FOR ", 256, 1024);
dynstr_append_checked(&sqlbuf, user_role);
if (mysql_query_with_error_report(mysql, &tableres, sqlbuf.str))
{
dynstr_free(&sqlbuf);
return 1;
}
while ((row= mysql_fetch_row(tableres)))
{
if (strncmp(row[0], "SET DEFAULT ROLE", sizeof("SET DEFAULT ROLE") - 1) == 0)
continue;
fprintf(md_result_file, "%s;\n", row[0]);
}
mysql_free_result(tableres);
dynstr_free(&sqlbuf);
return 0;
}
/*
dump create user
*/
static int dump_create_user(const char *user)
{
DYNAMIC_STRING sqlbuf;
MYSQL_ROW row;
MYSQL_RES *tableres;
init_dynamic_string_checked(&sqlbuf, "SHOW CREATE USER ", 256, 1024);
dynstr_append_checked(&sqlbuf, user);
if (mysql_query_with_error_report(mysql, &tableres, sqlbuf.str))
{
dynstr_free(&sqlbuf);
return 1;
}
while ((row= mysql_fetch_row(tableres)))
{
fprintf(md_result_file, "CREATE %sUSER %s%s;\n", opt_replace_into ? "/*M!100103 OR REPLACE */ ": "",
opt_ignore ? "IF NOT EXISTS " : "",
row[0] + sizeof("CREATE USER"));
}
mysql_free_result(tableres);
dynstr_free(&sqlbuf);
return 0;
}
/*
dump all users, roles and their grants
*/
static int dump_all_users_roles_and_grants()
{
MYSQL_ROW row;
MYSQL_RES *tableres;
int result= 0;
/* Roles added in MariaDB-10.0.5 or MySQL-8.0 */
my_bool maria_roles_exist= (mysql_get_server_version(mysql) >= 100005);
my_bool mysql_roles_exist= (mysql_get_server_version(mysql) >= 80001) && !maria_roles_exist;
if (mysql_query_with_error_report(mysql, &tableres,
"SELECT CONCAT(QUOTE(u.user), '@', QUOTE(u.Host)) AS u "
"FROM mysql.user u "
" /*!80001 LEFT JOIN mysql.role_edges e "
" ON u.user=e.from_user "
" AND u.host=e.from_host "
" WHERE e.from_user IS NULL */"
" /*M!100005 WHERE is_role='N' */"))
return 1;
while ((row= mysql_fetch_row(tableres)))
{
if (opt_replace_into)
/* Protection against removing the current import user */
/* MySQL-8.0 export capability */
fprintf(md_result_file,
"DELIMITER |\n"
"/*M!100101 IF current_user()=\"%s\" THEN\n"
" SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=30001,"
" MESSAGE_TEXT=\"Don't remove current user %s'\";\n"
"END IF */|\n"
"DELIMITER ;\n"
"/*!50701 DROP USER IF EXISTS %s */;\n", row[0], row[0], row[0]);
if (dump_create_user(row[0]))
result= 1;
/* if roles exist, defer dumping grants until after roles created */
if (maria_roles_exist || mysql_roles_exist)
continue;
if (dump_grants(row[0]))
result= 1;
}
mysql_free_result(tableres);
if (!(maria_roles_exist || mysql_roles_exist))
goto exit;
/*
Preserve current role active role, in case this dump is imported
in the same connection that assumes the active role at the beginning
is the same as at the end of the connection. This is so:
#!/bin/sh
(
echo "set role special_role; ";
cat mysqldump.sql;
echo "$dosomethingspecial"
) | mysql -h $host
doesn't end up with a suprise that the $dosomethingspecial cannot
be done because `special_role` isn't active.
We create a new role for importing that becomes the default admin for new
roles. This is because without being a admin on new roles we don't
have the necessary privileges to grant users to a created role or to
create new admins for the created role.
At the end of the import the mariadb_dump_import_role is be dropped,
which implictly drops all its admin aspects of the dropped role.
This is significiantly easlier than revoking the ADMIN of each role
from the current user.
*/
fputs("SELECT COALESCE(CURRENT_ROLE(),'NONE') into @current_role;\n"
"CREATE ROLE IF NOT EXISTS mariadb_dump_import_role;\n"
"GRANT mariadb_dump_import_role TO CURRENT_USER();\n"
"SET ROLE mariadb_dump_import_role;\n"
, md_result_file);
/* No show create role yet, MDEV-22311 */
/* Roles, with user admins first, then roles they administer, and recurse on that */
if (maria_roles_exist && mysql_query_with_error_report(mysql, &tableres,
"WITH RECURSIVE create_role_order AS"
" (SELECT 1 as n, roles_mapping.*"
" FROM mysql.roles_mapping"
" JOIN mysql.user USING (user,host)"
" WHERE is_role='N'"
" AND Admin_option='Y'"
" UNION SELECT c.n+1, r.*"
" FROM create_role_order c"
" JOIN mysql.roles_mapping r ON c.role=r.user"
" AND r.host=''"
" AND r.Admin_option='Y') "
"SELECT QUOTE(ROLE) AS r,"
" CONCAT(QUOTE(user),"
" IF(HOST='', '', CONCAT('@', QUOTE(HOST)))) AS c,"
" Admin_option "
"FROM create_role_order ORDER BY n, r, user"))
return 1;
/*
TODO Mysql - misses roles that have no admin or role members.
MySQL roles don't require an admin.
*/
if (mysql_roles_exist && mysql_query_with_error_report(mysql, &tableres,
"WITH RECURSIVE create_role_order AS"
" (SELECT 1 AS n,"
" re.*"
" FROM mysql.role_edges re"
" JOIN mysql.user u ON re.TO_HOST=u.HOST"
" AND re.TO_USER = u.USER"
" LEFT JOIN mysql.role_edges re2 ON re.TO_USER=re2.FROM_USER"
" AND re2.TO_HOST=re2.FROM_HOST"
" WHERE re2.FROM_USER IS NULL"
" UNION SELECT c.n+1,"
" re.*"
" FROM create_role_order c"
" JOIN mysql.role_edges re ON c.FROM_USER=re.TO_USER"
" AND c.FROM_HOST=re.TO_HOST) "
"SELECT CONCAT(QUOTE(FROM_USER), '/*!80001 @', QUOTE(FROM_HOST), '*/') AS r,"
" CONCAT(QUOTE(TO_USER), IF(n=1, CONCAT('@', QUOTE(TO_HOST)),"
" CONCAT('/*!80001 @', QUOTE(TO_HOST), ' */'))) AS u,"
" WITH_ADMIN_OPTION "
"FROM create_role_order "
"ORDER BY n,"
" FROM_USER,"
" FROM_HOST,"
" TO_USER,"
" TO_HOST,"
" WITH_ADMIN_OPTION"))
return 1;
while ((row= mysql_fetch_row(tableres)))
{
/* MySQL-8.0 export capability */
if (opt_replace_into)
fprintf(md_result_file,
"/*!80001 DROP ROLE IF EXISTS %s */;\n", row[0]);
fprintf(md_result_file,
"/*!80001 CREATE ROLE %s%s */;\n", opt_ignore ? "IF NOT EXISTS " : "", row[0]);
/* By default created with current role */
fprintf(md_result_file,
"%sROLE %s%s WITH ADMIN mariadb_dump_import_role */;\n",
opt_replace_into ? "/*M!100103 CREATE OR REPLACE ": "/*M!100005 CREATE ",
opt_ignore ? "IF NOT EXISTS " : "", row[0]);
fprintf(md_result_file, "/*M!100005 GRANT %s TO %s%s*/;\n",
row[0], row[1], (row[2][0] == 'Y') ? " WITH ADMIN OPTION " : "");
}
mysql_free_result(tableres);
/* users and their default role */
if (maria_roles_exist && mysql_query_with_error_report(mysql, &tableres,
"select IF(default_role='', 'NONE', QUOTE(default_role)) as r,"
"concat(QUOTE(User), '@', QUOTE(Host)) as u FROM mysql.user "
"/*M!100005 WHERE is_role='N' */"))
return 1;
if (mysql_roles_exist && mysql_query_with_error_report(mysql, &tableres,
"SELECT IF(DEFAULT_ROLE_HOST IS NULL, 'NONE', CONCAT(QUOTE(DEFAULT_ROLE_USER),"
" '@', QUOTE(DEFAULT_ROLE_HOST))) as r,"
" CONCAT(QUOTE(mu.USER),'@',QUOTE(mu.HOST)) as u "
"FROM mysql.user mu LEFT JOIN mysql.default_roles using (USER, HOST)"))
return 1;
while ((row= mysql_fetch_row(tableres)))
{
if (dump_grants(row[1]))
result= 1;
fprintf(md_result_file, "/*M!100005 SET DEFAULT ROLE %s FOR %s */;\n", row[0], row[1]);
fprintf(md_result_file, "/*!80001 ALTER USER %s DEFAULT ROLE %s */;\n", row[1], row[0]);
}
mysql_free_result(tableres);
if (maria_roles_exist && mysql_query_with_error_report(mysql, &tableres,
"SELECT DISTINCT QUOTE(m.role) AS r "
" FROM mysql.roles_mapping m"
" JOIN mysql.user u ON u.user = m.role"
" WHERE is_role='Y'"
" AND Admin_option='Y'"
" ORDER BY m.role"))
return 1;
if (mysql_roles_exist && mysql_query_with_error_report(mysql, &tableres,
"SELECT DISTINCT CONCAT(QUOTE(FROM_USER),'@', QUOTE(FROM_HOST)) AS r "
"FROM mysql.role_edges"))
return 1;
while ((row= mysql_fetch_row(tableres)))
{
if (dump_grants(row[0]))
result= 1;
}
mysql_free_result(tableres);
/* switch back */
fputs("SET ROLE NONE;\n"
"DROP ROLE mariadb_dump_import_role;\n"
"/*M!100203 EXECUTE IMMEDIATE CONCAT('SET ROLE ', @current_role) */;\n",
md_result_file);
exit:
return result;
}
/*
dump all plugins
*/
static int dump_all_plugins()
{
MYSQL_ROW row;
MYSQL_RES *tableres;
if (mysql_query_with_error_report(mysql, &tableres, "SHOW PLUGINS"))
return 1;
/* Name, Status, Type, Library, License */
while ((row= mysql_fetch_row(tableres)))
{
if (strcmp("ACTIVE", row[1]) != 0)
continue;
/* Should we be skipping builtins? */
if (row[3] == NULL)
continue;
if (opt_replace_into)
{
fprintf(md_result_file, "/*M!100401 UNINSTALL PLUGIN IF EXIST %s */;\n",
row[0]);
}
fprintf(md_result_file,
"INSTALL PLUGIN %s %s SONAME '%s';\n", row[0],
opt_ignore ? "/*M!100401 IF NOT EXISTS */" : "", row[3]);
}
mysql_free_result(tableres);
return 0;
}
/*
dump all udfs
*/
static int dump_all_udfs()
{
/* we don't support all these types yet, but get prepared if we do */
static const char *udf_types[] = {"STRING", "REAL", "INT", "ROW", "DECIMAL", "TIME" };
MYSQL_ROW row;
MYSQL_RES *tableres;
int retresult, result= 0;
if (mysql_query_with_error_report(mysql, &tableres, "SELECT * FROM mysql.func"))
return 1;
/* Name, ret, dl, type*/
while ((row= mysql_fetch_row(tableres)))
{
retresult= atoi(row[1]);
if (retresult < 0 || array_elements(udf_types) <= (size_t) retresult)
{
fprintf(stderr, "%s: Error: invalid return type on udf function '%s'\n",
my_progname_short, row[0]);
result= 1;
continue;
}
if (opt_replace_into)
{
fprintf(md_result_file, "/*!50701 DROP FUNCTION IF EXISTS %s */;\n",
row[0]);
}
fprintf(md_result_file,
"CREATE %s%sFUNCTION %s%s RETURNS %s SONAME '%s';\n",
opt_replace_into ? "/*M!100103 OR REPLACE */ ": "",
(strcmp("AGGREGATE", row[2])==0 ? "AGGREGATE " : ""),
opt_ignore ? "IF NOT EXISTS " : "", row[0], udf_types[retresult], row[2]);
}
mysql_free_result(tableres);
return result;
}
/*
dump all servers
*/
static int dump_all_servers()
{
/* No create server yet - MDEV-15696 */
MYSQL_ROW row;
MYSQL_RES *tableres;
MYSQL_FIELD *f;
unsigned int num_fields, i;
my_bool comma_prepend= 0;
const char *qstring;
if (mysql_query_with_error_report(mysql, &tableres, "SELECT * FROM mysql.servers"))
return 1;
num_fields= mysql_num_fields(tableres);
while ((row= mysql_fetch_row(tableres)))
{
fprintf(md_result_file,"CREATE %sSERVER %s%s FOREIGN DATA WRAPPER %s OPTIONS (",
opt_replace_into ? "/*M!100103 OR REPLACE */ ": "",
opt_ignore ? "/*M!100103 IF NOT EXISTS */ " : "", row[0], row[7]);
for (i= 1; i < num_fields; i++)
{
if (i == 7 || row[i][0] == '\0') /* Wrapper or empty string */
continue;
f= &tableres->fields[i];
qstring= (f->type == MYSQL_TYPE_STRING || f->type == MYSQL_TYPE_VAR_STRING) ? "'" : "";
fprintf(md_result_file, "%s%s %s%s%s",
(comma_prepend ? ", " : ""), f->name, qstring, row[i], qstring);
comma_prepend= 1;
}
fputs(");\n", md_result_file);
}
mysql_free_result(tableres);
return 0;
}
/*
dump all system statistical tables
*/
static int dump_all_stats()
{
my_bool prev_no_create_info;
if (mysql_select_db(mysql, "mysql"))
{
DB_error(mysql, "when selecting the database");
return 1; /* If --force */
}
fprintf(md_result_file,"\nUSE mysql;\n");
prev_no_create_info= opt_no_create_info;
opt_no_create_info= 1; /* don't overwrite recreate tables */
/* EITS added in 10.0.1 */
if (mysql_get_server_version(mysql) >= 100001)
{
dump_table("column_stats", "mysql", NULL, 0);
dump_table("index_stats", "mysql", NULL, 0);
dump_table("table_stats", "mysql", NULL, 0);
}
/* Innodb may be disabled */
if (!mysql_query(mysql, "show fields from innodb_index_stats"))
{
MYSQL_RES *tableres= mysql_store_result(mysql);
mysql_free_result(tableres);
dump_table("innodb_index_stats", "mysql", NULL, 0);
dump_table("innodb_table_stats", "mysql", NULL, 0);
}
opt_no_create_info= prev_no_create_info;
return 0;
}
/*
dump all system timezones
*/
static int dump_all_timezones()
{
my_bool opt_prev_no_create_info;
if (mysql_select_db(mysql, "mysql"))
{
DB_error(mysql, "when selecting the database");
return 1; /* If --force */
}
opt_prev_no_create_info= opt_no_create_info;
opt_no_create_info= 1;
fprintf(md_result_file,"\nUSE mysql;\n");
dump_table("time_zone", "mysql", NULL, 0);
dump_table("time_zone_name", "mysql", NULL, 0);
dump_table("time_zone_leap_second", "mysql", NULL, 0);
dump_table("time_zone_transition", "mysql", NULL, 0);
dump_table("time_zone_transition_type", "mysql", NULL, 0);
opt_no_create_info= opt_prev_no_create_info;
return 0;
}
/*
dump all logfile groups and tablespaces
*/
@ -6329,7 +6859,7 @@ int main(int argc, char **argv)
dump_tablespaces_for_tables(*argv, (argv + 1), (argc - 1));
dump_selected_tables(*argv, (argv + 1), (argc - 1));
}
else
else if (argc > 0)
{
/* One or more databases, all tables */
if (!opt_alltspcs && !opt_notspcs)
@ -6338,6 +6868,25 @@ int main(int argc, char **argv)
}
}
if (opt_system & OPT_SYSTEM_PLUGINS)
dump_all_plugins();
if (opt_system & OPT_SYSTEM_USERS)
dump_all_users_roles_and_grants();
if (opt_system & OPT_SYSTEM_UDFS)
dump_all_udfs();
if (opt_system & OPT_SYSTEM_SERVERS)
dump_all_servers();
/* These must be last as they explictly change the current database to mysql */
if (opt_system & OPT_SYSTEM_STATS)
dump_all_stats();
if (opt_system & OPT_SYSTEM_TIMEZONES)
dump_all_timezones();
/* add 'START SLAVE' to end of dump */
if (opt_slave_apply && add_slave_statements())
goto err;

View file

@ -26,26 +26,28 @@ set_from_component(VENDOR)
# the scriptlet, if present, is appended (together with the %posttrans tag)
# to the pre-uninstall scriptlet
#
set(base_time "PRE")
set(base_type "UNINSTALL")
set(base_var CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_${base_time}_${base_type}_SCRIPT_FILE)
set(acc)
if(CMAKE_VERSION VERSION_LESS 3.18)
set(base_time "PRE")
set(base_type "UNINSTALL")
set(base_var CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_${base_time}_${base_type}_SCRIPT_FILE)
set(acc)
macro(read_one_file time_ type_ tag_)
set(var CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_${time_}_${type_}_SCRIPT_FILE)
if (${var})
file(READ ${${var}} content)
set(acc "${tag_}\n${content}\n\n${acc}")
macro(read_one_file time_ type_ tag_)
set(var CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_${time_}_${type_}_SCRIPT_FILE)
if (${var})
file(READ ${${var}} content)
set(acc "${tag_}\n${content}\n\n${acc}")
endif()
endmacro()
read_one_file("POST" "TRANS" "%posttrans")
if (acc)
set(orig_${base_var} ${${base_var}})
read_one_file(${base_time} ${base_type} "")
set(${base_var} ${CPACK_TOPLEVEL_DIRECTORY}/SPECS/${CPACK_RPM_PACKAGE_COMPONENT}_${base_time}_${base_type}.scriptlet)
file(WRITE ${${base_var}} "${acc}")
endif()
endmacro()
read_one_file("POST" "TRANS" "%posttrans")
if (acc)
set(orig_${base_var} ${${base_var}})
read_one_file(${base_time} ${base_type} "")
set(${base_var} ${CPACK_TOPLEVEL_DIRECTORY}/SPECS/${CPACK_RPM_PACKAGE_COMPONENT}_${base_time}_${base_type}.scriptlet)
file(WRITE ${${base_var}} "${acc}")
endif()
endif(CMAKE_VERSION VERSION_LESS 3.18)
# load the original CPackRPM.cmake
set(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})
@ -59,7 +61,9 @@ set(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH})
restore(LICENSE)
restore(VENDOR)
set(${base_var} ${orig_${base_var}})
if(${orig_${base_var}})
set(${base_var} ${orig_${base_var}})
endif()
# per-component cleanup
foreach(_RPM_SPEC_HEADER URL REQUIRES SUGGESTS PROVIDES OBSOLETES PREFIX CONFLICTS AUTOPROV AUTOREQ AUTOREQPROV)

View file

@ -539,8 +539,11 @@ static inline int my_b_write(IO_CACHE *info, const uchar *Buffer, size_t Count)
MEM_CHECK_DEFINED(Buffer, Count);
if (info->write_pos + Count <= info->write_end)
{
memcpy(info->write_pos, Buffer, Count);
info->write_pos+= Count;
if (Count)
{
memcpy(info->write_pos, Buffer, Count);
info->write_pos+= Count;
}
return 0;
}
return _my_b_write(info, Buffer, Count);

@ -1 +1 @@
Subproject commit 62427520a5ba20e42fe51f5045062a7a9cadb466
Subproject commit e38244220646a7e95c9be22576460aa7a4eb715f

View file

@ -1,6 +1,6 @@
'\" t
.\"
.TH "\FBMYSQLDUMP\FR" "1" "9 May 2017" "MariaDB 10\&.3" "MariaDB Database System"
.TH "\FBMYSQLDUMP\FR" "1" "24 October 2020" "MariaDB 10\&.3" "MariaDB Database System"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
@ -36,7 +36,7 @@ tables, consider using the
instead because it can accomplish faster backups and faster restores\&. See
\fBmysqlhotcopy\fR(1)\&.
.PP
There are three general ways to invoke
There are four general ways to invoke
\fBmysqldump\fR:
.sp
.if n \{\
@ -46,6 +46,7 @@ There are three general ways to invoke
shell> \fBmysqldump [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIdb_name\fR\fR\fB [\fR\fB\fItbl_name\fR\fR\fB \&.\&.\&.]\fR
shell> \fBmysqldump [\fR\fB\fIoptions\fR\fR\fB] \-\-databases \fR\fB\fIdb_name\fR\fR\fB \&.\&.\&.\fR
shell> \fBmysqldump [\fR\fB\fIoptions\fR\fR\fB] \-\-all\-databases\fR
shell> \fBmysqldump [\fR\fB\fIoptions\fR\fR\fB] \-\-system={options}\fR
.fi
.if n \{\
.RE
@ -2192,6 +2193,110 @@ Verify server's "Common Name" in its cert against hostname used when connecting.
.sp -1
.IP \(bu 2.3
.\}
.\" mysqladmin: Dump system tables option
.\" Dump system tables option: mysqladmin
\fB\-\-system=\fR\fB\fI{all, users, plugins, udfs, servers, stats, timezones}\fR\fR
.sp
Dump the system tables in the mysql database in a logical form\&. This option is an empty set by default\&.
.sp
One or more options can be listed in comma separated list\&.
.sp
The options here are:
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
all \- an alias to enabling all of the below options\&.
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
users \- the users, roles and their grants outputed as \fBCREATE USER\fB, \fBCREATE ROLE\fR, \fBGRANT\fR, and \fBSET DEFAULT ROLE\fR (\fBALTER USER\fR for MySQL-8.0+)\&.
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
plugins \- active plugins of the server outputed as \fBINSTALL PLUGIN\fR\&.
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
udfs \- user define functions outputed as \fBCREATE FUNCTION\fR\&.
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
servers \- remote (federated) servers as \fBCREATE SERVER\fR\&.
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
stats \- statistics tables, InnoDB and Engine Independent Table Statistics (EITS), are dumped as \fBINSERT\fR/\fBREPLACE INFO\fR statements without (re)creating tables\&.
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
timezones \- timezone related system tables dumped as \fBINSERT\fR/\fBREPLACE INTO\fR statements without (re)creating tables\&.
.RE
.sp
The format of the output is affected by \fB\-\-replace\fR and \fB\-\-insert\-into\fR\&. The \fB\-\-replace\fR option will output \fBCREATE OR REPLACE\fR
forms of SQL, and also \fBDROP IF EXISTS\fR prior to \fBCREATE\fR, if a \fBCREATE OR REPLACE\fR option isn't available.
.sp
With \fB\-\-system=user\fR (or \fBall\fR), and \fB\-\-replace\fR, SQL is generated to generate an error if attempting to import the dump with a connection user that is being replaced within the dump\&.
.sp
The \fB\-\-insert\-into\fR option will cause \fBCREATE IF NOT EXIST\fR forms of SQL to generated if available.
.sp
For stats, and timezones, \fB\-\-replace\fR and \fB\-\-insert\-info\fR have the usual effects.
.sp
Enabling specific options here will cause the relevant tables in the mysql database to be ignored when dumping the mysql database or \fB\-\-all\-databases\fR\&.
.sp
Experimentally this option is designed to be able to dump system information from MySQL-5\&.7 and 8\&.0 servers\&. SQL generated is also
experimentally compatible with MySQL-5\&.7/8\&.0\&. Mappings of implemenation specific grants/plugins isn't always one-to-one however\&.
.sp
.RE
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.\" mysqldump: tab option
.\" tab option: mysqldump
\fB\-\-tab=\fR\fB\fIpath\fR\fR,
@ -2673,7 +2778,7 @@ If you encounter problems backing up views, please read the section that covers
.SH "COPYRIGHT"
.br
.PP
Copyright 2007-2008 MySQL AB, 2008-2010 Sun Microsystems, Inc., 2010-2015 MariaDB Foundation
Copyright 2007-2008 MySQL AB, 2008-2010 Sun Microsystems, Inc., 2010-2020 MariaDB Foundation
.PP
This documentation is free software; you can redistribute it and/or modify it only under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License.
.PP
@ -2681,12 +2786,6 @@ This documentation is distributed in the hope that it will be useful, but WITHOU
.PP
You should have received a copy of the GNU General Public License along with the program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA or see http://www.gnu.org/licenses/.
.sp
.SH "NOTES"
.IP " 1." 4
Bug#30123
.RS 4
\%http://bugs.mysql.com/bug.php?id=30123
.RE
.SH "SEE ALSO"
For more information, please refer to the MariaDB Knowledge Base, available online at https://mariadb.com/kb/
.SH AUTHOR

View file

@ -0,0 +1,118 @@
--- mysqldump-system.result
+++ mysqldump-system,win.result
@@ -7,8 +7,6 @@
delete from mysql.user where host not in ('localhost');
flush privileges;
create user USER;
-install plugin /*M!100401 IF NOT EXISTS */ unix_socket soname 'auth_socket.so';;
-alter user USER identified via unix_socket;
CREATE ROLE role_1;
CREATE ROLE role_2 WITH ADMIN role_1;
GRANT SHOW DATABASES ON *.* TO role_1;
@@ -48,9 +46,8 @@
/*!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' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-INSTALL PLUGIN unix_socket SONAME 'auth_socket.so';
CREATE USER `root`@`localhost`;
-CREATE USER `USER`@`%` IDENTIFIED VIA unix_socket;
+CREATE USER `USER`@`%`;
SELECT COALESCE(CURRENT_ROLE(),'NONE') into @current_role;
CREATE ROLE IF NOT EXISTS mariadb_dump_import_role;
GRANT mariadb_dump_import_role TO CURRENT_USER();
@@ -68,7 +65,7 @@
/*!80001 ALTER USER 'root'@'localhost' DEFAULT ROLE NONE */;
GRANT `role_1` TO `USER`@`%`;
GRANT `role_2` TO `USER`@`%`;
-GRANT USAGE ON *.* TO `USER`@`%` IDENTIFIED VIA unix_socket;
+GRANT USAGE ON *.* TO `USER`@`%`;
/*M!100005 SET DEFAULT ROLE 'role_2' FOR 'USER'@'%' */;
/*!80001 ALTER USER 'USER'@'%' DEFAULT ROLE 'role_2' */;
GRANT `role_2` TO `role_1` WITH ADMIN OPTION;
@@ -168,8 +165,6 @@
/*!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' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-/*M!100401 UNINSTALL PLUGIN IF EXIST unix_socket */;
-INSTALL PLUGIN unix_socket SONAME 'auth_socket.so';
DELIMITER |
/*M!100101 IF current_user()="'root'@'localhost'" THEN
SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=30001, MESSAGE_TEXT="Don't remove current user 'root'@'localhost''";
@@ -183,7 +178,7 @@
END IF */|
DELIMITER ;
/*!50701 DROP USER IF EXISTS 'USER'@'%' */;
-CREATE /*M!100103 OR REPLACE */ USER `USER`@`%` IDENTIFIED VIA unix_socket;
+CREATE /*M!100103 OR REPLACE */ USER `USER`@`%`;
SELECT COALESCE(CURRENT_ROLE(),'NONE') into @current_role;
CREATE ROLE IF NOT EXISTS mariadb_dump_import_role;
GRANT mariadb_dump_import_role TO CURRENT_USER();
@@ -203,7 +198,7 @@
/*!80001 ALTER USER 'root'@'localhost' DEFAULT ROLE NONE */;
GRANT `role_1` TO `USER`@`%`;
GRANT `role_2` TO `USER`@`%`;
-GRANT USAGE ON *.* TO `USER`@`%` IDENTIFIED VIA unix_socket;
+GRANT USAGE ON *.* TO `USER`@`%`;
/*M!100005 SET DEFAULT ROLE 'role_2' FOR 'USER'@'%' */;
/*!80001 ALTER USER 'USER'@'%' DEFAULT ROLE 'role_2' */;
GRANT `role_2` TO `role_1` WITH ADMIN OPTION;
@@ -304,9 +299,8 @@
/*!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' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-INSTALL PLUGIN unix_socket /*M!100401 IF NOT EXISTS */ SONAME 'auth_socket.so';
CREATE USER IF NOT EXISTS `root`@`localhost`;
-CREATE USER IF NOT EXISTS `USER`@`%` IDENTIFIED VIA unix_socket;
+CREATE USER IF NOT EXISTS `USER`@`%`;
SELECT COALESCE(CURRENT_ROLE(),'NONE') into @current_role;
CREATE ROLE IF NOT EXISTS mariadb_dump_import_role;
GRANT mariadb_dump_import_role TO CURRENT_USER();
@@ -324,7 +318,7 @@
/*!80001 ALTER USER 'root'@'localhost' DEFAULT ROLE NONE */;
GRANT `role_1` TO `USER`@`%`;
GRANT `role_2` TO `USER`@`%`;
-GRANT USAGE ON *.* TO `USER`@`%` IDENTIFIED VIA unix_socket;
+GRANT USAGE ON *.* TO `USER`@`%`;
/*M!100005 SET DEFAULT ROLE 'role_2' FOR 'USER'@'%' */;
/*!80001 ALTER USER 'USER'@'%' DEFAULT ROLE 'role_2' */;
GRANT `role_2` TO `role_1` WITH ADMIN OPTION;
@@ -413,12 +407,12 @@
CHECKSUM TABLE mysql.user, mysql.roles_mapping, mysql.time_zone_transition, mysql.plugin,
mysql.servers, mysql.func, mysql.innodb_table_stats, mysql.table_stats;
Table Checksum
-mysql.user 3159177919
+mysql.user 3007943331
mysql.roles_mapping 3150178430
mysql.time_zone_transition 3895294076
-mysql.plugin 1520695737
+mysql.plugin 0
mysql.servers 2783974349
-mysql.func 3241572444
+mysql.func 310494789
mysql.innodb_table_stats 347867921
mysql.table_stats 664320059
# Opps....
@@ -442,12 +436,12 @@
CHECKSUM TABLE mysql.user, mysql.roles_mapping, mysql.time_zone_transition, mysql.plugin,
mysql.servers, mysql.func, mysql.innodb_table_stats, mysql.table_stats;
Table Checksum
-mysql.user 3159177919
+mysql.user 3007943331
mysql.roles_mapping 3150178430
mysql.time_zone_transition 3895294076
-mysql.plugin 1520695737
+mysql.plugin 0
mysql.servers 2783974349
-mysql.func 3241572444
+mysql.func 310494789
mysql.innodb_table_stats 347867921
mysql.table_stats 664320059
DROP FUNCTION IF EXISTS metaphon;
@@ -461,7 +455,6 @@
DROP ROLE role_2;
DROP ROLE role_1;
drop user USER;
-uninstall plugin unix_socket;
insert into mysql.user select * from backup_users;
flush privileges;
drop table backup_users;

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,152 @@
--source include/not_embedded.inc
--source include/have_innodb.inc
--source include/have_udf.inc
--source include/platform.inc
--echo #
--echo # MDEV-23630: mysqldump to logically dump system tables
--echo #
--echo #
# might need fixing in 10.4 to different mechanism
create table backup_users like mysql.user;
insert into backup_users select * from mysql.user where host not in ('localhost');
delete from mysql.user where host not in ('localhost');
flush privileges;
create user USER;
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`)
{
--eval install plugin /*M!100401 IF NOT EXISTS */ unix_socket soname '$AUTH_SOCKET_SO';
alter user USER identified via unix_socket;
}
# time zone data already loaded
CREATE ROLE role_1;
CREATE ROLE role_2 WITH ADMIN role_1;
GRANT SHOW DATABASES ON *.* TO role_1;
GRANT role_1 TO USER;
GRANT role_2 TO USER;
SET DEFAULT ROLE role_2 FOR USER;
ALTER TABLE mysql.roles_mapping ORDER BY Host, User, Role;
# innodb and EITS tables statistics
#
set @save_innodb_stats_persistent= @@innodb_stats_persistent;
create table mysql.tz like mysql.time_zone_transition;
alter table mysql.tz engine=innodb;
insert into mysql.tz select * from mysql.time_zone_transition;
set global innodb_stats_persistent=1;
ANALYZE TABLE mysql.tz PERSISTENT FOR ALL;
# for predictable output in tests
delete from mysql.index_stats where prefix_arity!=1;
delete from mysql.column_stats where column_name!='Time_zone_id';
set time_zone="+03:00";
update mysql.innodb_index_stats set last_update="2020-01-01" where database_name="mysql" and table_name="tz";
update mysql.innodb_table_stats set last_update="2020-01-01" where database_name="mysql" and table_name="tz";
set global innodb_stats_persistent= @save_innodb_stats_persistent;
alter table mysql.time_zone_name ORDER BY Name;
CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(Host 'localhost');
--replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB
eval CREATE FUNCTION metaphon RETURNS STRING SONAME "$UDF_EXAMPLE_SO";
#
# Lets actually do some tests.
#
--echo #
--echo # mysqldump of system tables with --system=all
--echo #
--replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB
--exec $MYSQL_DUMP --skip-comments --system=all
--echo #
--echo # mysqldump of system tables with --system=all --replace
--echo #
--replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB
--exec $MYSQL_DUMP --skip-comments --system=all --replace
# save this for restore
--exec $MYSQL_DUMP --system=users,servers,stats,timezones,udfs --replace > $MYSQLTEST_VARDIR/tmp/dump1.sql
--echo #
--echo # mysqldump of system tables with --system=all --insert-ignore
--echo #
--replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB
--exec $MYSQL_DUMP --skip-comments --system=all --insert-ignore
CHECKSUM TABLE mysql.user, mysql.roles_mapping, mysql.time_zone_transition, mysql.plugin,
mysql.servers, mysql.func, mysql.innodb_table_stats, mysql.table_stats;
--echo # Opps....
CREATE USER mariadb_test_restore IDENTIFIED BY 'getitback';
GRANT ALL ON *.* TO mariadb_test_restore WITH GRANT OPTION;
GRANT PROXY ON ''@'%' TO mariadb_test_restore WITH GRANT OPTION;
GRANT SUPER, CREATE USER /*M!100502 ,FEDERATED ADMIN */ ON *.* TO mariadb_test_restore WITH GRANT OPTION;
drop user USER;
delete from mysql.table_stats;
delete from mysql.innodb_table_stats;
delete from mysql.time_zone_transition;
delete from mysql.time_zone_transition_type;
delete from mysql.time_zone;
delete from mysql.time_zone_name;
delete from mysql.time_zone_leap_second;
DROP FUNCTION IF EXISTS metaphon;
DROP SERVER s1;
set time_zone= @@global.time_zone;
--echo # Restore from mysqldump
--exec $MYSQL --user mariadb_test_restore --password=getitback --show-warnings < $MYSQLTEST_VARDIR/tmp/dump1.sql
#--remove_file $MYSQLTEST_VARDIR/tmp/dump1.sql;
DROP USER mariadb_test_restore;
# successful restore?
CHECKSUM TABLE mysql.user, mysql.roles_mapping, mysql.time_zone_transition, mysql.plugin,
mysql.servers, mysql.func, mysql.innodb_table_stats, mysql.table_stats;
#
# Cleanup
#
DROP FUNCTION IF EXISTS metaphon;
DROP SERVER s1;
# EITS && innodb stats
DELETE FROM mysql.column_stats WHERE db_name='mysql' and table_name in ('tz', 'gtid_slave_pos');
DELETE FROM mysql.index_stats WHERE db_name='mysql' and table_name in ('tz', 'gtid_slave_pos');
DELETE FROM mysql.table_stats WHERE db_name='mysql' and table_name in ('tz', 'gtid_slave_pos');
DELETE FROM mysql.innodb_index_stats WHERE database_name='mysql' and table_name in ('tz','gtid_slave_pos');
DELETE FROM mysql.innodb_table_stats WHERE database_name='mysql' and table_name in ('tz','gtid_slave_pos');
drop table mysql.tz;
DROP ROLE role_2;
DROP ROLE role_1;
drop user USER;
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`)
{
uninstall plugin unix_socket;
}
insert into mysql.user select * from backup_users;
flush privileges;
drop table backup_users;

View file

@ -5420,8 +5420,9 @@ proc
one
DROP DATABASE bug25717383;
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
OR mysqldump [OPTIONS] --databases DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases
OR mysqldump [OPTIONS] --system=[SYSTEMOPTIONS]]
For more options, use mysqldump --help
#
# MDEV-9001 - [PATCH] Fix DB name quoting in mysqldump --routine

View file

@ -138,8 +138,9 @@ void *alloc_dynamic(DYNAMIC_ARRAY *array)
array->size_of_element,
MYF(array->malloc_flags | MY_WME))))
DBUG_RETURN(0);
memcpy(new_ptr, array->buffer,
array->elements * array->size_of_element);
if (array->elements)
memcpy(new_ptr, array->buffer,
array->elements * array->size_of_element);
array->malloc_flags&= ~MY_INIT_BUFFER_USED;
}
else if (!(new_ptr=(char*)

View file

@ -491,7 +491,7 @@ char *strmake_root(MEM_ROOT *root, const char *str, size_t len)
void *memdup_root(MEM_ROOT *root, const void *str, size_t len)
{
char *pos;
if ((pos=alloc_root(root,len)))
if ((pos=alloc_root(root,len)) && len)
memcpy(pos,str,len);
return pos;
}

View file

@ -708,6 +708,8 @@ static char *coll_search(struct user_coll *c, const char *n, size_t len)
{
struct user_name un;
struct user_name *found;
if (!c->n_users)
return 0;
un.name_len= len;
un.name= (char *) n;
found= (struct user_name*) bsearch(&un, c->users, c->n_users,
@ -738,7 +740,8 @@ static int coll_insert(struct user_coll *c, char *n, size_t len)
static void coll_sort(struct user_coll *c)
{
qsort(c->users, c->n_users, sizeof(c->users[0]), cmp_users);
if (c->n_users)
qsort(c->users, c->n_users, sizeof(c->users[0]), cmp_users);
}
@ -969,7 +972,8 @@ static void get_str_n(char *dest, int *dest_len, size_t dest_size,
if (src_len >= dest_size)
src_len= dest_size - 1;
memcpy(dest, src, src_len);
if (src_len)
memcpy(dest, src, src_len);
dest[src_len]= 0;
*dest_len= (int)src_len;
}

View file

@ -8560,7 +8560,10 @@ int Field_blob::cmp_binary(const uchar *a_ptr, const uchar *b_ptr,
b_length=get_length(b_ptr);
if (b_length > max_length)
b_length=max_length;
diff=memcmp(a,b,MY_MIN(a_length,b_length));
if (uint32 len= MY_MIN(a_length,b_length))
diff= memcmp(a,b,len);
else
diff= 0;
return diff ? diff : (int) (a_length - b_length);
}
@ -8617,7 +8620,8 @@ uint Field_blob::get_key_image(uchar *buff,uint length, imagetype type_arg)
length=(uint) blob_length;
}
int2store(buff,length);
memcpy(buff+HA_KEY_BLOB_LENGTH, blob, length);
if (length)
memcpy(buff+HA_KEY_BLOB_LENGTH, blob, length);
return HA_KEY_BLOB_LENGTH+length;
}

View file

@ -812,8 +812,10 @@ struct xid_t {
void set(long f, const char *g, long gl, const char *b, long bl)
{
formatID= f;
memcpy(data, g, gtrid_length= gl);
memcpy(data+gl, b, bqual_length= bl);
if ((gtrid_length= gl))
memcpy(data, g, gl);
if ((bqual_length= bl))
memcpy(data+gl, b, bl);
}
void set(ulonglong xid)
{

View file

@ -4725,7 +4725,8 @@ update_hash(user_var_entry *entry, bool set_null, void *ptr, size_t length,
length--; // Fix length change above
entry->value[length]= 0; // Store end \0
}
memmove(entry->value, ptr, length);
if (length)
memmove(entry->value, ptr, length);
if (type == DECIMAL_RESULT)
((my_decimal*)entry->value)->fix_buffer_pointer();
entry->length= length;

View file

@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
Copyright (c) 2008, 2015, MariaDB
Copyright (c) 2008, 2020, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -472,7 +472,8 @@ Item_sum::Item_sum(THD *thd, Item_sum *item):
if (!(orig_args= (Item**) thd->alloc(sizeof(Item*)*arg_count)))
return;
}
memcpy(orig_args, item->orig_args, sizeof(Item*)*arg_count);
if (arg_count)
memcpy(orig_args, item->orig_args, sizeof(Item*)*arg_count);
init_aggregator();
with_distinct= item->with_distinct;
if (item->aggr)
@ -1132,7 +1133,8 @@ Item_sum_num::fix_fields(THD *thd, Item **ref)
check_sum_func(thd, ref))
return TRUE;
memcpy (orig_args, args, sizeof (Item *) * arg_count);
if (arg_count)
memcpy (orig_args, args, sizeof (Item *) * arg_count);
fixed= 1;
return FALSE;
}
@ -1362,7 +1364,8 @@ Item_sum_sp::fix_fields(THD *thd, Item **ref)
if (check_sum_func(thd, ref))
return TRUE;
memcpy(orig_args, args, sizeof(Item *) * arg_count);
if (arg_count)
memcpy(orig_args, args, sizeof(Item *) * arg_count);
fixed= 1;
return FALSE;
}
@ -3770,7 +3773,8 @@ Item_func_group_concat(THD *thd, Name_resolution_context *context_arg,
/* orig_args is only used for print() */
orig_args= (Item**) (order + arg_count_order);
memcpy(orig_args, args, sizeof(Item*) * arg_count);
if (arg_count)
memcpy(orig_args, args, sizeof(Item*) * arg_count);
if (limit_clause)
{
row_limit= row_limit_arg;

View file

@ -34,8 +34,8 @@ static inline bool lex_string_cmp(CHARSET_INFO *charset, const LEX_CSTRING *a,
static inline bool cmp(const LEX_CSTRING *a, const LEX_CSTRING *b)
{
return (a->length != b->length ||
memcmp(a->str, b->str, a->length));
return a->length != b->length ||
(a->length && memcmp(a->str, b->str, a->length));
}
/*

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2015, MariaDB
Copyright (c) 2015, 2020, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -85,7 +85,6 @@ static int my_b_encr_read(IO_CACHE *info, uchar *Buffer, size_t Count)
do
{
size_t copied;
uint elength, wlength, length;
uchar iv[MY_AES_BLOCK_SIZE]= {0};
@ -116,11 +115,13 @@ static int my_b_encr_read(IO_CACHE *info, uchar *Buffer, size_t Count)
DBUG_ASSERT(length <= info->buffer_length);
copied= MY_MIN(Count, (size_t)(length - pos_offset));
memcpy(Buffer, info->buffer + pos_offset, copied);
Count-= copied;
Buffer+= copied;
size_t copied= MY_MIN(Count, (size_t)(length - pos_offset));
if (copied)
{
memcpy(Buffer, info->buffer + pos_offset, copied);
Count-= copied;
Buffer+= copied;
}
info->read_pos= info->buffer + pos_offset + copied;
info->read_end= info->buffer + length;

View file

@ -14822,6 +14822,113 @@ static void print_ror_scans_arr(TABLE *table, const char *msg,
DBUG_VOID_RETURN;
}
static String dbug_print_sel_arg_buf;
static void
print_sel_arg_key(Field *field, const uchar *key, String *out)
{
TABLE *table= field->table;
my_bitmap_map *old_sets[2];
dbug_tmp_use_all_columns(table, old_sets, table->read_set, table->write_set);
if (field->real_maybe_null())
{
if (*key)
{
out->append("NULL");
goto end;
}
key++; // Skip null byte
}
field->set_key_image(key, field->pack_length());
if (field->type() == MYSQL_TYPE_BIT)
(void) field->val_int_as_str(out, 1);
else
field->val_str(out);
end:
dbug_tmp_restore_column_maps(table->read_set, table->write_set, old_sets);
}
/*
@brief
Produce a string representation of an individual SEL_ARG and return pointer
to it
@detail
Intended usage:
(gdb) p dbug_print_sel_arg(ptr)
*/
const char *dbug_print_sel_arg(SEL_ARG *sel_arg)
{
StringBuffer<64> buf;
String &out= dbug_print_sel_arg_buf;
out.length(0);
if (!sel_arg)
{
out.append("NULL");
goto end;
}
out.append("SEL_ARG(");
const char *stype;
switch(sel_arg->type) {
case SEL_ARG::IMPOSSIBLE:
stype="IMPOSSIBLE";
break;
case SEL_ARG::MAYBE:
stype="MAYBE";
break;
case SEL_ARG::MAYBE_KEY:
stype="MAYBE_KEY";
break;
case SEL_ARG::KEY_RANGE:
default:
stype=nullptr;
}
if (stype)
{
out.append("type=");
out.append(stype);
goto end;
}
if (sel_arg->min_flag & NO_MIN_RANGE)
out.append("-inf");
else
{
print_sel_arg_key(sel_arg->field, sel_arg->min_value, &buf);
out.append(buf);
}
out.append((sel_arg->min_flag & NEAR_MIN)? "<" : "<=");
out.append(sel_arg->field->field_name);
out.append((sel_arg->max_flag & NEAR_MAX)? "<" : "<=");
if (sel_arg->max_flag & NO_MAX_RANGE)
out.append("+inf");
else
{
print_sel_arg_key(sel_arg->field, sel_arg->max_value, &buf);
out.append(buf);
}
out.append(")");
end:
return dbug_print_sel_arg_buf.c_ptr_safe();
}
/*****************************************************************************
** Print a quick range for debugging

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2017 MariaDB
Copyright (c) 2017, 2020, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -751,13 +751,13 @@ void JOIN::add_keyuses_for_splitting()
added_keyuse_count))
goto err;
memcpy(keyuse.buffer,
save_qep->keyuse.buffer,
(size_t) save_qep->keyuse.elements * keyuse.size_of_element);
keyuse.elements= save_qep->keyuse.elements;
idx= keyuse.elements= save_qep->keyuse.elements;
if (keyuse.elements)
memcpy(keyuse.buffer,
save_qep->keyuse.buffer,
(size_t) keyuse.elements * keyuse.size_of_element);
keyuse_ext= &ext_keyuses_for_splitting->at(0);
idx= save_qep->keyuse.elements;
for (i=0; i < added_keyuse_count; i++, keyuse_ext++, idx++)
{
set_dynamic(&keyuse, (KEYUSE *) keyuse_ext, idx);

View file

@ -4802,7 +4802,8 @@ extern "C" size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen)
if (!mysql_mutex_trylock(&thd->LOCK_thd_data))
{
len= MY_MIN(buflen - 1, thd->query_length());
memcpy(buf, thd->query(), len);
if (len)
memcpy(buf, thd->query(), len);
mysql_mutex_unlock(&thd->LOCK_thd_data);
}
buf[len]= '\0';

View file

@ -1396,7 +1396,8 @@ uint JOIN_CACHE::write_record_data(uchar * link, bool *is_full)
blob_field->get_image(cp, copy->length,
blob_field->charset());
DBUG_ASSERT(cp + copy->length + copy->blob_length <= buff + buff_size);
memcpy(cp+copy->length, copy->str, copy->blob_length);
if (copy->blob_length)
memcpy(cp+copy->length, copy->str, copy->blob_length);
cp+= copy->length+copy->blob_length;
}
break;

View file

@ -27011,10 +27011,10 @@ JOIN::reoptimize(Item *added_where, table_map join_tables,
if (save_to)
{
DBUG_ASSERT(!keyuse.elements);
memcpy(keyuse.buffer,
save_to->keyuse.buffer,
(size_t) save_to->keyuse.elements * keyuse.size_of_element);
keyuse.elements= save_to->keyuse.elements;
if (size_t e= keyuse.elements)
memcpy(keyuse.buffer,
save_to->keyuse.buffer, e * keyuse.size_of_element);
}
/* Add the new access methods to the keyuse array. */

View file

@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
Copyright (c) 2016, MariaDB
Copyright (c) 2016, 2020, MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -229,8 +229,8 @@ bool String::copy(const String &str)
{
if (alloc(str.str_length))
return TRUE;
str_length=str.str_length;
bmove(Ptr,str.Ptr,str_length); // May be overlapping
if ((str_length=str.str_length))
bmove(Ptr,str.Ptr,str_length); // May be overlapping
Ptr[str_length]=0;
str_charset=str.str_charset;
return FALSE;
@ -593,8 +593,11 @@ bool String::append_ulonglong(ulonglong val)
bool String::append(const char *s, size_t arg_length, CHARSET_INFO *cs)
{
if (!arg_length)
return false;
uint32 offset;
if (needs_conversion((uint32)arg_length, cs, str_charset, &offset))
{
size_t add_length;

View file

@ -3137,7 +3137,8 @@ inline void mark_as_null_row(TABLE *table)
{
table->null_row=1;
table->status|=STATUS_NULL_ROW;
bfill(table->null_flags,table->s->null_bytes,255);
if (table->s->null_bytes)
bfill(table->null_flags,table->s->null_bytes,255);
}
bool is_simple_order(ORDER *order);

View file

@ -1009,8 +1009,11 @@ static bool pack_fields(uchar **buff_arg, List<Create_field> &create_fields,
it.rewind();
while ((field=it++))
{
memcpy(buff, field->comment.str, field->comment.length);
buff+= field->comment.length;
if (size_t l= field->comment.length)
{
memcpy(buff, field->comment.str, l);
buff+= l;
}
}
}
*buff_arg= buff;

View file

@ -81,7 +81,8 @@
#define cmp_record(A,B) memcmp((A)->record[0],(A)->B,(size_t) (A)->s->reclength)
#define empty_record(A) { \
restore_record((A),s->default_values); \
bfill((A)->null_flags,(A)->s->null_bytes,255);\
if ((A)->s->null_bytes) \
bfill((A)->null_flags,(A)->s->null_bytes,255); \
}
/* Defines for use with openfrm, openprt and openfrd */

View file

@ -144,8 +144,11 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
set_if_smaller(length,tmp_length);
FIX_LENGTH(cs, pos, length, char_length);
store_key_length_inc(key,char_length);
memcpy(key, pos, char_length);
key+= char_length;
if (char_length)
{
memcpy(key, pos, char_length);
key+= char_length;
}
continue;
}
else if (keyseg->flag & HA_SWAP_KEY)

View file

@ -144,12 +144,18 @@ static void set_setup_object_key(PFS_setup_object_key *key,
char *ptr= &key->m_hash_key[0];
ptr[0]= (char) object_type;
ptr++;
memcpy(ptr, schema, schema_length);
ptr+= schema_length;
if (schema_length)
{
memcpy(ptr, schema, schema_length);
ptr+= schema_length;
}
ptr[0]= 0;
ptr++;
memcpy(ptr, object, object_length);
ptr+= object_length;
if (object_length)
{
memcpy(ptr, object, object_length);
ptr+= object_length;
}
ptr[0]= 0;
ptr++;
key->m_key_length= (uint)(ptr - &key->m_hash_key[0]);

View file

@ -1,6 +1,6 @@
/* Copyright (c) 2002-2007 MySQL AB & tommy@valley.ne.jp
Copyright (c) 2002, 2014, Oracle and/or its affiliates.
Copyright (c) 2009, 2014, SkySQL Ab.
Copyright (c) 2009, 2020, MariaDB Corporation.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@ -399,7 +399,7 @@ my_strnxfrm_8bit_bin(CHARSET_INFO *cs,
{
set_if_smaller(srclen, dstlen);
set_if_smaller(srclen, nweights);
if (dst != src)
if (srclen && dst != src)
memcpy(dst, src, srclen);
return my_strxfrm_pad_desc_and_reverse(cs, dst, dst + srclen, dst + dstlen,
(uint)(nweights - srclen), flags, 0);

View file

@ -553,9 +553,11 @@ int my_strnncollsp_tis620(CHARSET_INFO * cs __attribute__((unused)),
alloced= a= (uchar*) my_malloc(a_length+b_length+2, MYF(MY_FAE));
b= a + a_length+1;
memcpy((char*) a, (char*) a0, a_length);
if (a_length)
memcpy((char*) a, (char*) a0, a_length);
a[a_length]= 0; /* if length(a0)> len1, need to put 'end of string' */
memcpy((char *)b, (char *)b0, b_length);
if (b_length)
memcpy((char *)b, (char *)b0, b_length);
b[b_length]= 0; /* put end of string */
a_length= thai2sortable(a, a_length);
b_length= thai2sortable(b, b_length);