Merge 10.4 into 10.5

This commit is contained in:
Marko Mäkelä 2020-11-03 16:24:47 +02:00
commit 133b4b46fe
44 changed files with 1706 additions and 237 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>
@ -119,6 +120,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;
@ -533,6 +549,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)
{
@ -1048,6 +1073,100 @@ 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(PSI_NOT_INSTRUMENTED,
"mysql.db", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.global_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.tables_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.columns_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.procs_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.user", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.host", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.proxies_priv", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"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(PSI_NOT_INSTRUMENTED,
"mysql.role_edges", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.default_roles", MYF(MY_WME)))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_PLUGINS &&
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.plugin", MYF(MY_WME))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_UDFS &&
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.func", MYF(MY_WME))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_SERVERS &&
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.servers", MYF(MY_WME))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_STATS &&
(my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.column_stats", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.index_stats", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.table_stats", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.innodb_table_stats", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.innodb_index_stats", MYF(MY_WME)))))
return(EX_EOM);
if (opt_system & OPT_SYSTEM_TIMEZONES &&
(my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.time_zone", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.time_zone_leap_second", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.time_zone_name", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"mysql.time_zone_transition", MYF(MY_WME))) ||
my_hash_insert(&ignore_table,
(uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
"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)
@ -1112,7 +1231,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;
@ -1236,7 +1355,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");
@ -2821,7 +2939,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;
@ -3790,7 +3908,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];
@ -4339,6 +4457,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
*/
@ -6375,7 +6929,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)
@ -6384,6 +6938,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

@ -31,26 +31,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)
#
# Support for the Recommends: tag.
@ -78,7 +80,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

@ -511,8 +511,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" "27 June 2019" "MariaDB 10\&.5" "MariaDB Database System"
.TH "\FBMYSQLDUMP\FR" "1" "24 October 2020" "MariaDB 10\&.5" "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
@ -2208,6 +2209,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,
@ -2689,7 +2794,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-2019 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
@ -2697,12 +2802,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

@ -67,6 +67,10 @@ alter user foo identified by password '*88C89BE093D4ECF72D039F62EBB7477EA1FD4D63
select * from mysql.user where user = 'foo';
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv Create_tablespace_priv Delete_history_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections plugin authentication_string password_expired is_role default_role max_statement_time
% foo *88C89BE093D4ECF72D039F62EBB7477EA1FD4D63 N N N N N N N N N N N N N N N N N N N N N N N N N Y N N N N 0 0 0 0 mysql_native_password *88C89BE093D4ECF72D039F62EBB7477EA1FD4D63 N N 0.000000
alter user foo identified by password 'invalid';
select * from mysql.user where user = 'foo';
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv Create_tablespace_priv Delete_history_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections plugin authentication_string password_expired is_role default_role max_statement_time
% foo invalid N N N N N N N N N N N N N N N N N N N N N N N N N Y N N N N 0 0 0 0 mysql_native_password invalid N N 0.000000
alter user foo identified with 'somecoolplugin';
ERROR HY000: Operation ALTER USER failed for 'foo'@'%'
show warnings;

View file

@ -66,6 +66,9 @@ select * from mysql.user where user = 'foo';
alter user foo identified by password '*88C89BE093D4ECF72D039F62EBB7477EA1FD4D63';
select * from mysql.user where user = 'foo';
alter user foo identified by password 'invalid';
select * from mysql.user where user = 'foo';
--error ER_CANNOT_USER
alter user foo identified with 'somecoolplugin';
show warnings;

View file

@ -0,0 +1,21 @@
--- mysqldump-system.result
+++ mysqldump-system,win.result
@@ -442,7 +442,7 @@
mysql.time_zone_transition 3895294076
mysql.plugin 0
mysql.servers 2783974349
-mysql.func 3241572444
+mysql.func 310494789
mysql.innodb_table_stats 347867921
mysql.table_stats 664320059
# Opps....
@@ -477,7 +477,7 @@
mysql.time_zone_transition 3895294076
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;

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,155 @@
--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 #
create table backup_users like mysql.global_priv;
create table tables_priv like mysql.tables_priv;
insert into backup_users select * from mysql.global_priv;
insert into tables_priv select * from mysql.tables_priv;
delete from mysql.global_priv where host not in ('localhost');
flush privileges;
# mariadb.sys because of MDEV-24098
alter user 'mariadb.sys'@'localhost' ACCOUNT UNLOCK;
create user USER;
# 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
# global_priv checksum not restored because:
# mariadb.sys - different Priv on restore
# password_last_changed date isn't saved/restored
# root user's Priv $.access lower number on restore
--replace_regex /"password_last_changed":[0-9]+/"password_last_changed":NOW/ /"version_id":[0-9]+/"version_id":VERSION/
SELECT * FROM mysql.global_priv ORDER BY User,Host;
CHECKSUM TABLE 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
DROP USER mariadb_test_restore;
# successful restore?
--replace_regex /"password_last_changed":[0-9]+/"password_last_changed":NOW/ /"version_id":[0-9]+/"version_id":VERSION/
SELECT * FROM mysql.global_priv ORDER BY User,Host;
CHECKSUM TABLE 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;
replace into mysql.global_priv select * from backup_users;
replace into mysql.tables_priv select * from tables_priv;
flush privileges;
drop table backup_users, tables_priv;

View file

@ -5421,8 +5421,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

@ -1,14 +1,21 @@
set global secure_auth=0;
create user natauth@localhost identified via 'mysql_native_password' using '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user invalidauth@localhost identified via 'mysql_native_password' using 'invalid';
create user newpass@localhost identified by password '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user invalidpass@localhost identified by password 'invalid';
create user newpassnat@localhost identified via 'mysql_native_password';
set password for newpassnat@localhost = '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user invalidpassnat@localhost identified by password 'invalid';
set password for invalidpassnat@localhost = 'invalid';
create user oldauth@localhost identified with 'mysql_old_password' using '378b243e220ca493';
create user oldpass@localhost identified by password '378b243e220ca493';
create user oldpassold@localhost identified with 'mysql_old_password';
set password for oldpassold@localhost = '378b243e220ca493';
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
User Host Password plugin authentication_string
invalidauth localhost invalid mysql_native_password invalid
invalidpass localhost invalid mysql_native_password invalid
invalidpassnat localhost invalid mysql_native_password invalid
mariadb.sys localhost mysql_native_password
natauth localhost *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 mysql_native_password *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
newpass localhost *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 mysql_native_password *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
@ -87,6 +94,9 @@ set password for oldpass@localhost = PASSWORD('test2');
set password for oldpassold@localhost = PASSWORD('test2');
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
User Host Password plugin authentication_string
invalidauth localhost invalid mysql_native_password invalid
invalidpass localhost invalid mysql_native_password invalid
invalidpassnat localhost invalid mysql_native_password invalid
mariadb.sys localhost mysql_native_password
natauth localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E mysql_native_password *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
newpass localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E mysql_native_password *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
@ -141,6 +151,15 @@ select current_user();
current_user()
newpassnat@localhost
disconnect con;
connect(localhost,invalidauth,invalid,test,MASTER_PORT,MASTER_SOCKET);
connect con,localhost,invalidauth,invalid,;
ERROR 28000: Access denied for user 'invalidauth'@'localhost' (using password: YES)
connect(localhost,invalidpass,invalid,test,MASTER_PORT,MASTER_SOCKET);
connect con,localhost,invalidpass,invalid,;
ERROR 28000: Access denied for user 'invalidpass'@'localhost' (using password: YES)
connect(localhost,invalidpassnat,invalid,test,MASTER_PORT,MASTER_SOCKET);
connect con,localhost,invalidpassnat,invalid,;
ERROR 28000: Access denied for user 'invalidpassnat'@'localhost' (using password: YES)
connect con,localhost,oldauth,test2,;
select current_user();
current_user()
@ -158,6 +177,7 @@ oldpassold@localhost
disconnect con;
connection default;
drop user natauth@localhost, newpass@localhost, newpassnat@localhost;
drop user invalidauth@localhost, invalidpass@localhost, invalidpassnat@localhost;
drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost;
set global secure_auth=default;
# switching from mysql.global_priv to mysql.user

View file

@ -12,11 +12,18 @@ set global secure_auth=0;
# The hash (old and new) is for 'test'
create user natauth@localhost identified via 'mysql_native_password' using '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user invalidauth@localhost identified via 'mysql_native_password' using 'invalid';
create user newpass@localhost identified by password '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user invalidpass@localhost identified by password 'invalid';
create user newpassnat@localhost identified via 'mysql_native_password';
set password for newpassnat@localhost = '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user invalidpassnat@localhost identified by password 'invalid';
set password for invalidpassnat@localhost = 'invalid';
create user oldauth@localhost identified with 'mysql_old_password' using '378b243e220ca493';
create user oldpass@localhost identified by password '378b243e220ca493';
@ -114,6 +121,17 @@ select current_user();
--connect(con,localhost,newpassnat,test2,)
select current_user();
--disconnect con
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
--error ER_ACCESS_DENIED_ERROR
--connect(con,localhost,invalidauth,invalid,)
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
--error ER_ACCESS_DENIED_ERROR
--connect(con,localhost,invalidpass,invalid,)
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
--error ER_ACCESS_DENIED_ERROR
--connect(con,localhost,invalidpassnat,invalid,)
--connect(con,localhost,oldauth,test2,)
select current_user();
--disconnect con
@ -126,6 +144,7 @@ select current_user();
--connection default
drop user natauth@localhost, newpass@localhost, newpassnat@localhost;
drop user invalidauth@localhost, invalidpass@localhost, invalidpassnat@localhost;
drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost;
set global secure_auth=default;

View file

@ -439,4 +439,16 @@ check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
#
# MDEV-24072 Assertion 'ib_table.n_v_cols' failed
# in instant_alter_column_possible()
#
CREATE TABLE t (a BLOB) ENGINE=InnoDB;
INSERT INTO t VALUES ('a');
ALTER TABLE t ADD c INT GENERATED ALWAYS AS (a+1) VIRTUAL, ADD KEY(c);
ERROR 22007: Truncated incorrect DOUBLE value: 'a'
ALTER TABLE t ADD d INT;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
DROP TABLE t;
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;

View file

@ -454,4 +454,17 @@ select * from t1;
check table t1;
drop table t1;
--echo #
--echo # MDEV-24072 Assertion 'ib_table.n_v_cols' failed
--echo # in instant_alter_column_possible()
--echo #
CREATE TABLE t (a BLOB) ENGINE=InnoDB;
INSERT INTO t VALUES ('a');
--error ER_TRUNCATED_WRONG_VALUE
ALTER TABLE t ADD c INT GENERATED ALWAYS AS (a+1) VIRTUAL, ADD KEY(c);
--enable_info
ALTER TABLE t ADD d INT;
--disable_info
DROP TABLE t;
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;

View file

@ -20,131 +20,6 @@ SET GLOBAL wsrep_provider=none;
# variables when using "_"
#
CALL mtr.add_suppression("WSREP: Could not open saved state file for reading.*");
SHOW GLOBAL STATUS LIKE 'wsrep%';
Variable_name Value
wsrep_local_state_uuid #
wsrep_protocol_version #
wsrep_last_committed #
wsrep_replicated #
wsrep_replicated_bytes #
wsrep_repl_keys #
wsrep_repl_keys_bytes #
wsrep_repl_data_bytes #
wsrep_repl_other_bytes #
wsrep_received #
wsrep_received_bytes #
wsrep_local_commits #
wsrep_local_cert_failures #
wsrep_local_replays #
wsrep_local_send_queue #
wsrep_local_send_queue_max #
wsrep_local_send_queue_min #
wsrep_local_send_queue_avg #
wsrep_local_recv_queue #
wsrep_local_recv_queue_max #
wsrep_local_recv_queue_min #
wsrep_local_recv_queue_avg #
wsrep_local_cached_downto #
wsrep_flow_control_paused_ns #
wsrep_flow_control_paused #
wsrep_flow_control_sent #
wsrep_flow_control_recv #
wsrep_flow_control_active #
wsrep_flow_control_requested #
wsrep_cert_deps_distance #
wsrep_apply_oooe #
wsrep_apply_oool #
wsrep_apply_window #
wsrep_commit_oooe #
wsrep_commit_oool #
wsrep_commit_window #
wsrep_local_state #
wsrep_local_state_comment #
wsrep_cert_index_size #
wsrep_causal_reads #
wsrep_cert_interval #
wsrep_open_transactions #
wsrep_open_connections #
wsrep_incoming_addresses #
wsrep_applier_thread_count #
wsrep_cluster_capabilities #
wsrep_cluster_conf_id #
wsrep_cluster_size #
wsrep_cluster_state_uuid #
wsrep_cluster_status #
wsrep_connected #
wsrep_local_bf_aborts #
wsrep_local_index #
wsrep_provider_capabilities #
wsrep_provider_name #
wsrep_provider_vendor #
wsrep_provider_version #
wsrep_ready #
wsrep_rollbacker_thread_count #
wsrep_thread_count #
SHOW GLOBAL STATUS LIKE 'wsrep_%';
Variable_name Value
wsrep_local_state_uuid #
wsrep_protocol_version #
wsrep_last_committed #
wsrep_replicated #
wsrep_replicated_bytes #
wsrep_repl_keys #
wsrep_repl_keys_bytes #
wsrep_repl_data_bytes #
wsrep_repl_other_bytes #
wsrep_received #
wsrep_received_bytes #
wsrep_local_commits #
wsrep_local_cert_failures #
wsrep_local_replays #
wsrep_local_send_queue #
wsrep_local_send_queue_max #
wsrep_local_send_queue_min #
wsrep_local_send_queue_avg #
wsrep_local_recv_queue #
wsrep_local_recv_queue_max #
wsrep_local_recv_queue_min #
wsrep_local_recv_queue_avg #
wsrep_local_cached_downto #
wsrep_flow_control_paused_ns #
wsrep_flow_control_paused #
wsrep_flow_control_sent #
wsrep_flow_control_recv #
wsrep_flow_control_active #
wsrep_flow_control_requested #
wsrep_cert_deps_distance #
wsrep_apply_oooe #
wsrep_apply_oool #
wsrep_apply_window #
wsrep_commit_oooe #
wsrep_commit_oool #
wsrep_commit_window #
wsrep_local_state #
wsrep_local_state_comment #
wsrep_cert_index_size #
wsrep_causal_reads #
wsrep_cert_interval #
wsrep_open_transactions #
wsrep_open_connections #
wsrep_incoming_addresses #
wsrep_applier_thread_count #
wsrep_cluster_capabilities #
wsrep_cluster_conf_id #
wsrep_cluster_size #
wsrep_cluster_state_uuid #
wsrep_cluster_status #
wsrep_connected #
wsrep_local_bf_aborts #
wsrep_local_index #
wsrep_provider_capabilities #
wsrep_provider_name #
wsrep_provider_vendor #
wsrep_provider_version #
wsrep_ready #
wsrep_rollbacker_thread_count #
wsrep_thread_count #
SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';
Variable_name Value
wsrep_local_state_comment #

View file

@ -1,7 +1,6 @@
--source include/have_wsrep.inc
--source include/force_restart.inc
--source include/have_innodb.inc
--source include/galera_have_debug_sync.inc
call mtr.add_suppression("WSREP: Initial position was provided by configuration or SST, avoiding override");
@ -36,13 +35,6 @@ CALL mtr.add_suppression("WSREP: Could not open saved state file for reading.*")
eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
--enable_query_log
--replace_column 2 #
SHOW GLOBAL STATUS LIKE 'wsrep%';
--echo
--replace_column 2 #
SHOW GLOBAL STATUS LIKE 'wsrep_%';
--replace_column 2 #
SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';
@ -78,7 +70,7 @@ call mtr.add_suppression("WSREP: Failed to get provider options");
eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
--enable_query_log
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/
--replace_regex /.*libgalera.*smm.*/libgalera_smm.so/
SELECT @@global.wsrep_provider;
SELECT @@global.wsrep_slave_threads;
SELECT @@global.wsrep_cluster_address;
@ -91,7 +83,7 @@ SHOW STATUS LIKE 'wsrep_thread_count';
eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
--enable_query_log
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/
--replace_regex /.*libgalera.*smm.*/libgalera_smm.so/
SELECT @@global.wsrep_provider;
SELECT @@global.wsrep_cluster_address;
SELECT @@global.wsrep_on;
@ -114,7 +106,7 @@ SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VA
SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_rollbacker_thread_count';
SELECT VARIABLE_VALUE AS EXPECT_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_thread_count';
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/
--replace_regex /.*libgalera.*smm.*/libgalera_smm.so/
SELECT @@global.wsrep_provider;
SELECT @@global.wsrep_cluster_address;
SELECT @@global.wsrep_on;

View file

@ -140,8 +140,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

@ -477,7 +477,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

@ -709,6 +709,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,
@ -739,7 +741,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);
}
@ -970,7 +973,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

@ -8724,7 +8724,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);
}
@ -8751,7 +8754,8 @@ uint Field_blob::get_key_image_itRAW(const uchar *ptr_arg, uchar *buff,
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

@ -866,8 +866,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

@ -4894,7 +4894,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
@ -473,7 +473,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;
}
@ -1365,7 +1367,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;
}
@ -3928,7 +3931,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

@ -76,12 +76,12 @@ 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));
}
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

@ -15643,6 +15643,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= NULL;
}
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
@ -749,13 +749,13 @@ void JOIN::add_keyuses_for_splitting()
if (allocate_dynamic(&keyuse, save_qep->keyuse.elements + 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

@ -14536,7 +14536,7 @@ static int native_password_authenticate(MYSQL_PLUGIN_VIO *vio,
info->password_used= PASSWORD_USED_YES;
if (pkt_len == SCRAMBLE_LENGTH)
{
if (!info->auth_string_length)
if (info->auth_string_length != SCRAMBLE_LENGTH)
DBUG_RETURN(CR_AUTH_USER_CREDENTIALS);
if (check_scramble(pkt, thd->scramble, (uchar*)info->auth_string))
@ -14563,9 +14563,13 @@ static int native_password_make_scramble(const char *password,
return 0;
}
/* As this contains is a string of not a valid SCRAMBLE_LENGTH */
static const char invalid_password[] = "*THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE";
static int native_password_get_salt(const char *hash, size_t hash_length,
unsigned char *out, size_t *out_length)
{
DBUG_ASSERT(sizeof(invalid_password) > SCRAMBLE_LENGTH);
DBUG_ASSERT(*out_length >= SCRAMBLE_LENGTH);
if (hash_length == 0)
{
@ -14575,6 +14579,12 @@ static int native_password_get_salt(const char *hash, size_t hash_length,
if (hash_length != SCRAMBLED_PASSWORD_CHAR_LENGTH)
{
if (hash_length == 7 && strcmp(hash, "invalid") == 0)
{
memcpy(out, invalid_password, SCRAMBLED_PASSWORD_CHAR_LENGTH);
*out_length= SCRAMBLED_PASSWORD_CHAR_LENGTH;
return 0;
}
my_error(ER_PASSWD_LENGTH, MYF(0), SCRAMBLED_PASSWORD_CHAR_LENGTH);
return 1;
}

View file

@ -4982,7 +4982,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

@ -1397,7 +1397,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

@ -10209,7 +10209,8 @@ bool LEX::new_sp_instr_stmt(THD *thd,
qbuff.length= prefix.length + suffix.length;
if (!(qbuff.str= (char*) alloc_root(thd->mem_root, qbuff.length + 1)))
return true;
memcpy(qbuff.str, prefix.str, prefix.length);
if (prefix.length)
memcpy(qbuff.str, prefix.str, prefix.length);
strmake(qbuff.str + prefix.length, suffix.str, suffix.length);
i->m_query= qbuff;
return sphead->add_instr(i);

View file

@ -1,5 +1,5 @@
/* Copyright (c) 2002, 2015, Oracle and/or its affiliates.
Copyright (c) 2008, 2019, 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
@ -122,7 +122,10 @@ When one supplies long data for a placeholder:
#include "sql_handler.h"
#include "transaction.h" // trans_rollback_implicit
#include "mysql/psi/mysql_ps.h" // MYSQL_EXECUTE_PS
#ifdef WITH_WSREP
#include "wsrep_mysqld.h"
#include "wsrep_trans_observer.h"
#endif /* WITH_WSREP */
/* Constants defining bits in parameter type flags. Flags are read from high byte of short value */
static const uint PARAMETER_FLAG_UNSIGNED = 128U << 8;
@ -4607,6 +4610,23 @@ reexecute:
thd->m_reprepare_observer= NULL;
#ifdef WITH_WSREP
if (!(sql_command_flags[lex->sql_command] & CF_PS_ARRAY_BINDING_OPTIMIZED) &&
WSREP(thd))
{
if (wsrep_after_statement(thd))
{
/*
Re-execution success is unlikely after an error from
wsrep_after_statement(), so retrun error immediately.
*/
thd->get_stmt_da()->reset_diagnostics_area();
wsrep_override_error(thd, thd->wsrep_cs().current_error(),
thd->wsrep_cs().current_error_status());
}
}
else
#endif /* WITH_WSREP */
if (unlikely(error) &&
(sql_command_flags[lex->sql_command] & CF_REEXECUTION_FRAGILE) &&
!thd->is_fatal_error && !thd->killed &&

View file

@ -27984,10 +27984,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

@ -237,8 +237,8 @@ bool Binary_string::copy(const Binary_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;
return FALSE;
}
@ -574,8 +574,11 @@ bool Binary_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, charset(), &offset))
{
size_t add_length;

View file

@ -3194,7 +3194,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

@ -1104,8 +1104,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

@ -76,7 +76,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

@ -1467,7 +1467,8 @@ instant_alter_column_possible(
for (const dict_index_t* index = ib_table.indexes.start;
index; index = index->indexes.next) {
if (index->has_virtual()) {
ut_ad(ib_table.n_v_cols);
ut_ad(ib_table.n_v_cols
|| index->is_corrupted());
return false;
}
}

View file

@ -147,8 +147,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

@ -126,12 +126,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
@ -401,7 +401,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

@ -555,9 +555,11 @@ int my_strnncollsp_tis620(CHARSET_INFO * cs __attribute__((unused)),
alloced= a= (uchar*) my_malloc(PSI_INSTRUMENT_ME, 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);