Merge 10.5 into 10.6
This commit is contained in:
commit
c498250888
@ -14,7 +14,7 @@ configuration: RelWithDebInfo
|
|||||||
platform: x64
|
platform: x64
|
||||||
|
|
||||||
test_script:
|
test_script:
|
||||||
- set PATH=%PATH%;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
|
- set PATH=C:\Strawberry\perl\bin;%PATH%;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
|
||||||
- cd %APPVEYOR_BUILD_FOLDER%\win_build\mysql-test
|
- cd %APPVEYOR_BUILD_FOLDER%\win_build\mysql-test
|
||||||
- perl mysql-test-run.pl --force --max-test-fail=10 --parallel=4 --testcase-timeout=10 --skip-test-list=unstable-tests --suite=main
|
- perl mysql-test-run.pl --force --max-test-fail=10 --parallel=4 --testcase-timeout=10 --skip-test-list=unstable-tests --suite=main
|
||||||
|
|
||||||
|
@ -205,7 +205,8 @@ Bucket *find_longest_match(HashTable *ht, char *str, uint length,
|
|||||||
void completion_hash_clean(HashTable *ht)
|
void completion_hash_clean(HashTable *ht)
|
||||||
{
|
{
|
||||||
free_root(&ht->mem_root,MYF(0));
|
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 *));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,7 +39,8 @@
|
|||||||
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
|
** 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_global.h>
|
||||||
#include <my_sys.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_events= 0, opt_comments_used= 0,
|
||||||
opt_alltspcs=0, opt_notspcs= 0, opt_logging,
|
opt_alltspcs=0, opt_notspcs= 0, opt_logging,
|
||||||
opt_drop_trigger= 0 ;
|
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,
|
static my_bool insert_pat_inited= 0, debug_info_flag= 0, debug_check_flag= 0,
|
||||||
select_field_names_inited= 0;
|
select_field_names_inited= 0;
|
||||||
static ulong opt_max_allowed_packet, opt_net_buffer_length;
|
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,
|
&opt_mysql_unix_port, &opt_mysql_unix_port, 0,
|
||||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#include <sslopt-longopts.h>
|
#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',
|
{"tab",'T',
|
||||||
"Create tab-separated textfile for each table to given path. (Create .sql "
|
"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 "
|
"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 maybe_exit(int error);
|
||||||
static void die(int error, const char* reason, ...);
|
static void die(int error, const char* reason, ...);
|
||||||
static void maybe_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,
|
static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row,
|
||||||
const char *prefix,const char *name,
|
const char *prefix,const char *name,
|
||||||
int string_value);
|
int string_value);
|
||||||
@ -587,6 +605,12 @@ static int init_dumping_tables(char *);
|
|||||||
static int init_dumping(char *, int init_func(char*));
|
static int init_dumping(char *, int init_func(char*));
|
||||||
static int dump_databases(char **);
|
static int dump_databases(char **);
|
||||||
static int dump_all_databases();
|
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);
|
static char *quote_name(const char *name, char *buff, my_bool force);
|
||||||
char check_if_ignore_table(const char *table_name, char *table_type);
|
char check_if_ignore_table(const char *table_name, char *table_type);
|
||||||
static char *primary_key_fields(const char *table_name);
|
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)
|
static void short_usage_sub(FILE *f)
|
||||||
{
|
{
|
||||||
fprintf(f, "Usage: %s [OPTIONS] database [tables]\n", my_progname_short);
|
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);
|
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)
|
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)))
|
if ((ho_error= handle_options(argc, argv, my_long_options, get_one_option)))
|
||||||
return(ho_error);
|
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_max_allowed_packet= opt_max_allowed_packet;
|
||||||
*mysql_params->p_net_buffer_length= opt_net_buffer_length;
|
*mysql_params->p_net_buffer_length= opt_net_buffer_length;
|
||||||
if (debug_info_flag)
|
if (debug_info_flag)
|
||||||
@ -1112,7 +1231,7 @@ static int get_options(int *argc, char ***argv)
|
|||||||
!(charset_info= get_charset_by_csname(default_charset,
|
!(charset_info= get_charset_by_csname(default_charset,
|
||||||
MY_CS_PRIMARY, MYF(MY_WME))))
|
MY_CS_PRIMARY, MYF(MY_WME))))
|
||||||
exit(1);
|
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);
|
short_usage(stderr);
|
||||||
return EX_USAGE;
|
return EX_USAGE;
|
||||||
@ -1236,7 +1355,6 @@ static int fetch_db_collation(const char *db_name,
|
|||||||
my_bool err_status= FALSE;
|
my_bool err_status= FALSE;
|
||||||
MYSQL_RES *db_cl_res;
|
MYSQL_RES *db_cl_res;
|
||||||
MYSQL_ROW db_cl_row;
|
MYSQL_ROW db_cl_row;
|
||||||
|
|
||||||
if (mysql_select_db(mysql, db_name))
|
if (mysql_select_db(mysql, db_name))
|
||||||
{
|
{
|
||||||
DB_error(mysql, "when selecting the database");
|
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
|
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)
|
char *ignore_flag)
|
||||||
{
|
{
|
||||||
my_bool init=0, delayed, write_data, complete_insert;
|
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 ignore_flag;
|
||||||
char buf[200], table_buff[NAME_LEN+3];
|
char buf[200], table_buff[NAME_LEN+3];
|
||||||
@ -4339,6 +4457,442 @@ static char *getTableName(int reset)
|
|||||||
} /* getTableName */
|
} /* 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
|
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_tablespaces_for_tables(*argv, (argv + 1), (argc - 1));
|
||||||
dump_selected_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 */
|
/* One or more databases, all tables */
|
||||||
if (!opt_alltspcs && !opt_notspcs)
|
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 */
|
/* add 'START SLAVE' to end of dump */
|
||||||
if (opt_slave_apply && add_slave_statements())
|
if (opt_slave_apply && add_slave_statements())
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -31,26 +31,28 @@ set_from_component(VENDOR)
|
|||||||
# the scriptlet, if present, is appended (together with the %posttrans tag)
|
# the scriptlet, if present, is appended (together with the %posttrans tag)
|
||||||
# to the pre-uninstall scriptlet
|
# to the pre-uninstall scriptlet
|
||||||
#
|
#
|
||||||
set(base_time "PRE")
|
if(CMAKE_VERSION VERSION_LESS 3.18)
|
||||||
set(base_type "UNINSTALL")
|
set(base_time "PRE")
|
||||||
set(base_var CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_${base_time}_${base_type}_SCRIPT_FILE)
|
set(base_type "UNINSTALL")
|
||||||
set(acc)
|
set(base_var CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_${base_time}_${base_type}_SCRIPT_FILE)
|
||||||
|
set(acc)
|
||||||
|
|
||||||
macro(read_one_file time_ type_ tag_)
|
macro(read_one_file time_ type_ tag_)
|
||||||
set(var CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_${time_}_${type_}_SCRIPT_FILE)
|
set(var CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_${time_}_${type_}_SCRIPT_FILE)
|
||||||
if (${var})
|
if (${var})
|
||||||
file(READ ${${var}} content)
|
file(READ ${${var}} content)
|
||||||
set(acc "${tag_}\n${content}\n\n${acc}")
|
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()
|
endif()
|
||||||
endmacro()
|
endif(CMAKE_VERSION VERSION_LESS 3.18)
|
||||||
|
|
||||||
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()
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Support for the Recommends: tag.
|
# Support for the Recommends: tag.
|
||||||
@ -78,7 +80,9 @@ set(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH})
|
|||||||
|
|
||||||
restore(LICENSE)
|
restore(LICENSE)
|
||||||
restore(VENDOR)
|
restore(VENDOR)
|
||||||
set(${base_var} ${orig_${base_var}})
|
if(${orig_${base_var}})
|
||||||
|
set(${base_var} ${orig_${base_var}})
|
||||||
|
endif()
|
||||||
|
|
||||||
# per-component cleanup
|
# per-component cleanup
|
||||||
foreach(_RPM_SPEC_HEADER URL REQUIRES SUGGESTS PROVIDES OBSOLETES PREFIX CONFLICTS AUTOPROV AUTOREQ AUTOREQPROV)
|
foreach(_RPM_SPEC_HEADER URL REQUIRES SUGGESTS PROVIDES OBSOLETES PREFIX CONFLICTS AUTOPROV AUTOREQ AUTOREQPROV)
|
||||||
|
@ -515,8 +515,11 @@ static inline int my_b_write(IO_CACHE *info, const uchar *Buffer, size_t Count)
|
|||||||
MEM_CHECK_DEFINED(Buffer, Count);
|
MEM_CHECK_DEFINED(Buffer, Count);
|
||||||
if (info->write_pos + Count <= info->write_end)
|
if (info->write_pos + Count <= info->write_end)
|
||||||
{
|
{
|
||||||
memcpy(info->write_pos, Buffer, Count);
|
if (Count)
|
||||||
info->write_pos+= Count;
|
{
|
||||||
|
memcpy(info->write_pos, Buffer, Count);
|
||||||
|
info->write_pos+= Count;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return _my_b_write(info, Buffer, Count);
|
return _my_b_write(info, Buffer, Count);
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 62427520a5ba20e42fe51f5045062a7a9cadb466
|
Subproject commit e38244220646a7e95c9be22576460aa7a4eb715f
|
115
man/mysqldump.1
115
man/mysqldump.1
@ -1,6 +1,6 @@
|
|||||||
'\" t
|
'\" t
|
||||||
.\"
|
.\"
|
||||||
.TH "\FBMYSQLDUMP\FR" "1" "15 May 2020" "MariaDB 10\&.6" "MariaDB Database System"
|
.TH "\FBMYSQLDUMP\FR" "1" "24 October 2020" "MariaDB 10\&.6" "MariaDB Database System"
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" * set default formatting
|
.\" * set default formatting
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
@ -36,7 +36,7 @@ tables, consider using the
|
|||||||
instead because it can accomplish faster backups and faster restores\&. See
|
instead because it can accomplish faster backups and faster restores\&. See
|
||||||
\fBmysqlhotcopy\fR(1)\&.
|
\fBmysqlhotcopy\fR(1)\&.
|
||||||
.PP
|
.PP
|
||||||
There are three general ways to invoke
|
There are four general ways to invoke
|
||||||
\fBmysqldump\fR:
|
\fBmysqldump\fR:
|
||||||
.sp
|
.sp
|
||||||
.if n \{\
|
.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] \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] \-\-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] \-\-all\-databases\fR
|
||||||
|
shell> \fBmysqldump [\fR\fB\fIoptions\fR\fR\fB] \-\-system={options}\fR
|
||||||
.fi
|
.fi
|
||||||
.if n \{\
|
.if n \{\
|
||||||
.RE
|
.RE
|
||||||
@ -2208,6 +2209,110 @@ Verify server's "Common Name" in its cert against hostname used when connecting.
|
|||||||
.sp -1
|
.sp -1
|
||||||
.IP \(bu 2.3
|
.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
|
.\" mysqldump: tab option
|
||||||
.\" tab option: mysqldump
|
.\" tab option: mysqldump
|
||||||
\fB\-\-tab=\fR\fB\fIpath\fR\fR,
|
\fB\-\-tab=\fR\fB\fIpath\fR\fR,
|
||||||
@ -2697,12 +2802,6 @@ This documentation is distributed in the hope that it will be useful, but WITHOU
|
|||||||
.PP
|
.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/.
|
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
|
.sp
|
||||||
.SH "NOTES"
|
|
||||||
.IP " 1." 4
|
|
||||||
Bug#30123
|
|
||||||
.RS 4
|
|
||||||
\%http://bugs.mysql.com/bug.php?id=30123
|
|
||||||
.RE
|
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
For more information, please refer to the MariaDB Knowledge Base, available online at https://mariadb.com/kb/
|
For more information, please refer to the MariaDB Knowledge Base, available online at https://mariadb.com/kb/
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
|
@ -67,6 +67,10 @@ alter user foo identified by password '*88C89BE093D4ECF72D039F62EBB7477EA1FD4D63
|
|||||||
select * from mysql.user where user = 'foo';
|
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
|
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
|
% 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';
|
alter user foo identified with 'somecoolplugin';
|
||||||
ERROR HY000: Operation ALTER USER failed for 'foo'@'%'
|
ERROR HY000: Operation ALTER USER failed for 'foo'@'%'
|
||||||
show warnings;
|
show warnings;
|
||||||
|
@ -66,6 +66,9 @@ select * from mysql.user where user = 'foo';
|
|||||||
alter user foo identified by password '*88C89BE093D4ECF72D039F62EBB7477EA1FD4D63';
|
alter user foo identified by password '*88C89BE093D4ECF72D039F62EBB7477EA1FD4D63';
|
||||||
select * from mysql.user where user = 'foo';
|
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
|
--error ER_CANNOT_USER
|
||||||
alter user foo identified with 'somecoolplugin';
|
alter user foo identified with 'somecoolplugin';
|
||||||
show warnings;
|
show warnings;
|
||||||
|
21
mysql-test/main/mysqldump-system,win.rdiff
Normal file
21
mysql-test/main/mysqldump-system,win.rdiff
Normal 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;
|
||||||
|
|
497
mysql-test/main/mysqldump-system.result
Normal file
497
mysql-test/main/mysqldump-system.result
Normal file
File diff suppressed because one or more lines are too long
155
mysql-test/main/mysqldump-system.test
Normal file
155
mysql-test/main/mysqldump-system.test
Normal 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;
|
@ -5421,8 +5421,9 @@ proc
|
|||||||
one
|
one
|
||||||
DROP DATABASE bug25717383;
|
DROP DATABASE bug25717383;
|
||||||
Usage: mysqldump [OPTIONS] database [tables]
|
Usage: mysqldump [OPTIONS] database [tables]
|
||||||
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
|
OR mysqldump [OPTIONS] --databases DB1 [DB2 DB3...]
|
||||||
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
|
OR mysqldump [OPTIONS] --all-databases
|
||||||
|
OR mysqldump [OPTIONS] --system=[SYSTEMOPTIONS]]
|
||||||
For more options, use mysqldump --help
|
For more options, use mysqldump --help
|
||||||
#
|
#
|
||||||
# MDEV-9001 - [PATCH] Fix DB name quoting in mysqldump --routine
|
# MDEV-9001 - [PATCH] Fix DB name quoting in mysqldump --routine
|
||||||
|
@ -1,14 +1,21 @@
|
|||||||
set global secure_auth=0;
|
set global secure_auth=0;
|
||||||
create user natauth@localhost identified via 'mysql_native_password' using '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
|
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 newpass@localhost identified by password '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
|
||||||
|
create user invalidpass@localhost identified by password 'invalid';
|
||||||
create user newpassnat@localhost identified via 'mysql_native_password';
|
create user newpassnat@localhost identified via 'mysql_native_password';
|
||||||
set password for newpassnat@localhost = '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
|
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 oldauth@localhost identified with 'mysql_old_password' using '378b243e220ca493';
|
||||||
create user oldpass@localhost identified by password '378b243e220ca493';
|
create user oldpass@localhost identified by password '378b243e220ca493';
|
||||||
create user oldpassold@localhost identified with 'mysql_old_password';
|
create user oldpassold@localhost identified with 'mysql_old_password';
|
||||||
set password for oldpassold@localhost = '378b243e220ca493';
|
set password for oldpassold@localhost = '378b243e220ca493';
|
||||||
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
|
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
|
||||||
User Host Password plugin authentication_string
|
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
|
mariadb.sys localhost mysql_native_password
|
||||||
natauth localhost *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 mysql_native_password *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
|
natauth localhost *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 mysql_native_password *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
|
||||||
newpass 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');
|
set password for oldpassold@localhost = PASSWORD('test2');
|
||||||
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
|
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
|
||||||
User Host Password plugin authentication_string
|
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
|
mariadb.sys localhost mysql_native_password
|
||||||
natauth localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E mysql_native_password *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
|
natauth localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E mysql_native_password *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
|
||||||
newpass localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E mysql_native_password *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
|
newpass localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E mysql_native_password *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
|
||||||
@ -141,6 +151,15 @@ select current_user();
|
|||||||
current_user()
|
current_user()
|
||||||
newpassnat@localhost
|
newpassnat@localhost
|
||||||
disconnect con;
|
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,;
|
connect con,localhost,oldauth,test2,;
|
||||||
select current_user();
|
select current_user();
|
||||||
current_user()
|
current_user()
|
||||||
@ -158,6 +177,7 @@ oldpassold@localhost
|
|||||||
disconnect con;
|
disconnect con;
|
||||||
connection default;
|
connection default;
|
||||||
drop user natauth@localhost, newpass@localhost, newpassnat@localhost;
|
drop user natauth@localhost, newpass@localhost, newpassnat@localhost;
|
||||||
|
drop user invalidauth@localhost, invalidpass@localhost, invalidpassnat@localhost;
|
||||||
drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost;
|
drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost;
|
||||||
set global secure_auth=default;
|
set global secure_auth=default;
|
||||||
# switching from mysql.global_priv to mysql.user
|
# switching from mysql.global_priv to mysql.user
|
||||||
|
@ -12,11 +12,18 @@ set global secure_auth=0;
|
|||||||
# The hash (old and new) is for 'test'
|
# The hash (old and new) is for 'test'
|
||||||
create user natauth@localhost identified via 'mysql_native_password' using '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
|
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 newpass@localhost identified by password '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
|
||||||
|
|
||||||
|
create user invalidpass@localhost identified by password 'invalid';
|
||||||
|
|
||||||
create user newpassnat@localhost identified via 'mysql_native_password';
|
create user newpassnat@localhost identified via 'mysql_native_password';
|
||||||
set password for newpassnat@localhost = '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
|
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 oldauth@localhost identified with 'mysql_old_password' using '378b243e220ca493';
|
||||||
|
|
||||||
create user oldpass@localhost identified by password '378b243e220ca493';
|
create user oldpass@localhost identified by password '378b243e220ca493';
|
||||||
@ -114,6 +121,17 @@ select current_user();
|
|||||||
--connect(con,localhost,newpassnat,test2,)
|
--connect(con,localhost,newpassnat,test2,)
|
||||||
select current_user();
|
select current_user();
|
||||||
--disconnect con
|
--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,)
|
--connect(con,localhost,oldauth,test2,)
|
||||||
select current_user();
|
select current_user();
|
||||||
--disconnect con
|
--disconnect con
|
||||||
@ -126,6 +144,7 @@ select current_user();
|
|||||||
|
|
||||||
--connection default
|
--connection default
|
||||||
drop user natauth@localhost, newpass@localhost, newpassnat@localhost;
|
drop user natauth@localhost, newpass@localhost, newpassnat@localhost;
|
||||||
|
drop user invalidauth@localhost, invalidpass@localhost, invalidpassnat@localhost;
|
||||||
drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost;
|
drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost;
|
||||||
set global secure_auth=default;
|
set global secure_auth=default;
|
||||||
|
|
||||||
|
@ -439,4 +439,16 @@ check table t1;
|
|||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
drop table t1;
|
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;
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;
|
||||||
|
5
mysql-test/suite/innodb/t/foreign_key.combinations
Normal file
5
mysql-test/suite/innodb/t/foreign_key.combinations
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[read-ahead]
|
||||||
|
--innodb-random-read-ahead=ON
|
||||||
|
|
||||||
|
[normal]
|
||||||
|
--innodb-random-read-ahead=OFF
|
@ -454,4 +454,17 @@ select * from t1;
|
|||||||
check table t1;
|
check table t1;
|
||||||
drop 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;
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;
|
||||||
|
@ -20,131 +20,6 @@ SET GLOBAL wsrep_provider=none;
|
|||||||
# variables when using "_"
|
# variables when using "_"
|
||||||
#
|
#
|
||||||
CALL mtr.add_suppression("WSREP: Could not open saved state file for reading.*");
|
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';
|
SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
wsrep_local_state_comment #
|
wsrep_local_state_comment #
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
--source include/have_wsrep.inc
|
--source include/have_wsrep.inc
|
||||||
--source include/force_restart.inc
|
--source include/force_restart.inc
|
||||||
--source include/have_innodb.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");
|
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';
|
eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
--replace_column 2 #
|
|
||||||
SHOW GLOBAL STATUS LIKE 'wsrep%';
|
|
||||||
|
|
||||||
--echo
|
|
||||||
--replace_column 2 #
|
|
||||||
SHOW GLOBAL STATUS LIKE 'wsrep_%';
|
|
||||||
|
|
||||||
--replace_column 2 #
|
--replace_column 2 #
|
||||||
SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';
|
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';
|
eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/
|
--replace_regex /.*libgalera.*smm.*/libgalera_smm.so/
|
||||||
SELECT @@global.wsrep_provider;
|
SELECT @@global.wsrep_provider;
|
||||||
SELECT @@global.wsrep_slave_threads;
|
SELECT @@global.wsrep_slave_threads;
|
||||||
SELECT @@global.wsrep_cluster_address;
|
SELECT @@global.wsrep_cluster_address;
|
||||||
@ -91,7 +83,7 @@ SHOW STATUS LIKE 'wsrep_thread_count';
|
|||||||
eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
|
eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/
|
--replace_regex /.*libgalera.*smm.*/libgalera_smm.so/
|
||||||
SELECT @@global.wsrep_provider;
|
SELECT @@global.wsrep_provider;
|
||||||
SELECT @@global.wsrep_cluster_address;
|
SELECT @@global.wsrep_cluster_address;
|
||||||
SELECT @@global.wsrep_on;
|
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_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';
|
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_provider;
|
||||||
SELECT @@global.wsrep_cluster_address;
|
SELECT @@global.wsrep_cluster_address;
|
||||||
SELECT @@global.wsrep_on;
|
SELECT @@global.wsrep_on;
|
||||||
|
@ -140,8 +140,9 @@ void *alloc_dynamic(DYNAMIC_ARRAY *array)
|
|||||||
array->size_of_element,
|
array->size_of_element,
|
||||||
MYF(array->malloc_flags | MY_WME))))
|
MYF(array->malloc_flags | MY_WME))))
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
memcpy(new_ptr, array->buffer,
|
if (array->elements)
|
||||||
array->elements * array->size_of_element);
|
memcpy(new_ptr, array->buffer,
|
||||||
|
array->elements * array->size_of_element);
|
||||||
array->malloc_flags&= ~MY_INIT_BUFFER_USED;
|
array->malloc_flags&= ~MY_INIT_BUFFER_USED;
|
||||||
}
|
}
|
||||||
else if (!(new_ptr=(char*)
|
else if (!(new_ptr=(char*)
|
||||||
|
@ -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)
|
void *memdup_root(MEM_ROOT *root, const void *str, size_t len)
|
||||||
{
|
{
|
||||||
char *pos;
|
char *pos;
|
||||||
if ((pos=alloc_root(root,len)))
|
if ((pos=alloc_root(root,len)) && len)
|
||||||
memcpy(pos,str,len);
|
memcpy(pos,str,len);
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
@ -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 un;
|
||||||
struct user_name *found;
|
struct user_name *found;
|
||||||
|
if (!c->n_users)
|
||||||
|
return 0;
|
||||||
un.name_len= len;
|
un.name_len= len;
|
||||||
un.name= (char *) n;
|
un.name= (char *) n;
|
||||||
found= (struct user_name*) bsearch(&un, c->users, c->n_users,
|
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)
|
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)
|
if (src_len >= dest_size)
|
||||||
src_len= dest_size - 1;
|
src_len= dest_size - 1;
|
||||||
|
|
||||||
memcpy(dest, src, src_len);
|
if (src_len)
|
||||||
|
memcpy(dest, src, src_len);
|
||||||
dest[src_len]= 0;
|
dest[src_len]= 0;
|
||||||
*dest_len= (int)src_len;
|
*dest_len= (int)src_len;
|
||||||
}
|
}
|
||||||
|
@ -8724,7 +8724,10 @@ int Field_blob::cmp_binary(const uchar *a_ptr, const uchar *b_ptr,
|
|||||||
b_length=get_length(b_ptr);
|
b_length=get_length(b_ptr);
|
||||||
if (b_length > max_length)
|
if (b_length > max_length)
|
||||||
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);
|
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;
|
length=(uint) blob_length;
|
||||||
}
|
}
|
||||||
int2store(buff,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;
|
return HA_KEY_BLOB_LENGTH+length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -866,8 +866,10 @@ struct xid_t {
|
|||||||
void set(long f, const char *g, long gl, const char *b, long bl)
|
void set(long f, const char *g, long gl, const char *b, long bl)
|
||||||
{
|
{
|
||||||
formatID= f;
|
formatID= f;
|
||||||
memcpy(data, g, gtrid_length= gl);
|
if ((gtrid_length= gl))
|
||||||
memcpy(data+gl, b, bqual_length= bl);
|
memcpy(data, g, gl);
|
||||||
|
if ((bqual_length= bl))
|
||||||
|
memcpy(data+gl, b, bl);
|
||||||
}
|
}
|
||||||
void set(ulonglong xid)
|
void set(ulonglong xid)
|
||||||
{
|
{
|
||||||
|
@ -4894,7 +4894,8 @@ update_hash(user_var_entry *entry, bool set_null, void *ptr, size_t length,
|
|||||||
length--; // Fix length change above
|
length--; // Fix length change above
|
||||||
entry->value[length]= 0; // Store end \0
|
entry->value[length]= 0; // Store end \0
|
||||||
}
|
}
|
||||||
memmove(entry->value, ptr, length);
|
if (length)
|
||||||
|
memmove(entry->value, ptr, length);
|
||||||
if (type == DECIMAL_RESULT)
|
if (type == DECIMAL_RESULT)
|
||||||
((my_decimal*)entry->value)->fix_buffer_pointer();
|
((my_decimal*)entry->value)->fix_buffer_pointer();
|
||||||
entry->length= length;
|
entry->length= length;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* 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
|
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
|
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)))
|
if (!(orig_args= (Item**) thd->alloc(sizeof(Item*)*arg_count)))
|
||||||
return;
|
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();
|
init_aggregator();
|
||||||
with_distinct= item->with_distinct;
|
with_distinct= item->with_distinct;
|
||||||
if (item->aggr)
|
if (item->aggr)
|
||||||
@ -1132,7 +1133,8 @@ Item_sum_num::fix_fields(THD *thd, Item **ref)
|
|||||||
check_sum_func(thd, ref))
|
check_sum_func(thd, ref))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
memcpy (orig_args, args, sizeof (Item *) * arg_count);
|
if (arg_count)
|
||||||
|
memcpy (orig_args, args, sizeof (Item *) * arg_count);
|
||||||
fixed= 1;
|
fixed= 1;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -1365,7 +1367,8 @@ Item_sum_sp::fix_fields(THD *thd, Item **ref)
|
|||||||
if (check_sum_func(thd, ref))
|
if (check_sum_func(thd, ref))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
memcpy(orig_args, args, sizeof(Item *) * arg_count);
|
if (arg_count)
|
||||||
|
memcpy(orig_args, args, sizeof(Item *) * arg_count);
|
||||||
fixed= 1;
|
fixed= 1;
|
||||||
return FALSE;
|
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 is only used for print() */
|
||||||
orig_args= (Item**) (order + arg_count_order);
|
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)
|
if (limit_clause)
|
||||||
{
|
{
|
||||||
row_limit= row_limit_arg;
|
row_limit= row_limit_arg;
|
||||||
|
@ -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)
|
static inline bool cmp(const LEX_CSTRING *a, const LEX_CSTRING *b)
|
||||||
{
|
{
|
||||||
return (a->length != b->length ||
|
return a->length != b->length ||
|
||||||
memcmp(a->str, b->str, a->length));
|
(a->length && memcmp(a->str, b->str, a->length));
|
||||||
}
|
}
|
||||||
static inline bool cmp(const LEX_CSTRING a, const LEX_CSTRING b)
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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
|
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
|
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
|
do
|
||||||
{
|
{
|
||||||
size_t copied;
|
|
||||||
uint elength, wlength, length;
|
uint elength, wlength, length;
|
||||||
uchar iv[MY_AES_BLOCK_SIZE]= {0};
|
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);
|
DBUG_ASSERT(length <= info->buffer_length);
|
||||||
|
|
||||||
copied= MY_MIN(Count, (size_t)(length - pos_offset));
|
size_t copied= MY_MIN(Count, (size_t)(length - pos_offset));
|
||||||
|
if (copied)
|
||||||
memcpy(Buffer, info->buffer + pos_offset, copied);
|
{
|
||||||
Count-= copied;
|
memcpy(Buffer, info->buffer + pos_offset, copied);
|
||||||
Buffer+= copied;
|
Count-= copied;
|
||||||
|
Buffer+= copied;
|
||||||
|
}
|
||||||
|
|
||||||
info->read_pos= info->buffer + pos_offset + copied;
|
info->read_pos= info->buffer + pos_offset + copied;
|
||||||
info->read_end= info->buffer + length;
|
info->read_end= info->buffer + length;
|
||||||
|
107
sql/opt_range.cc
107
sql/opt_range.cc
@ -15643,6 +15643,113 @@ static void print_ror_scans_arr(TABLE *table, const char *msg,
|
|||||||
DBUG_VOID_RETURN;
|
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
|
** Print a quick range for debugging
|
||||||
|
@ -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
|
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
|
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))
|
if (allocate_dynamic(&keyuse, save_qep->keyuse.elements + added_keyuse_count))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
memcpy(keyuse.buffer,
|
idx= keyuse.elements= save_qep->keyuse.elements;
|
||||||
save_qep->keyuse.buffer,
|
if (keyuse.elements)
|
||||||
(size_t) save_qep->keyuse.elements * keyuse.size_of_element);
|
memcpy(keyuse.buffer,
|
||||||
keyuse.elements= save_qep->keyuse.elements;
|
save_qep->keyuse.buffer,
|
||||||
|
(size_t) keyuse.elements * keyuse.size_of_element);
|
||||||
|
|
||||||
keyuse_ext= &ext_keyuses_for_splitting->at(0);
|
keyuse_ext= &ext_keyuses_for_splitting->at(0);
|
||||||
idx= save_qep->keyuse.elements;
|
|
||||||
for (i=0; i < added_keyuse_count; i++, keyuse_ext++, idx++)
|
for (i=0; i < added_keyuse_count; i++, keyuse_ext++, idx++)
|
||||||
{
|
{
|
||||||
set_dynamic(&keyuse, (KEYUSE *) keyuse_ext, idx);
|
set_dynamic(&keyuse, (KEYUSE *) keyuse_ext, idx);
|
||||||
|
@ -14536,7 +14536,7 @@ static int native_password_authenticate(MYSQL_PLUGIN_VIO *vio,
|
|||||||
info->password_used= PASSWORD_USED_YES;
|
info->password_used= PASSWORD_USED_YES;
|
||||||
if (pkt_len == SCRAMBLE_LENGTH)
|
if (pkt_len == SCRAMBLE_LENGTH)
|
||||||
{
|
{
|
||||||
if (!info->auth_string_length)
|
if (info->auth_string_length != SCRAMBLE_LENGTH)
|
||||||
DBUG_RETURN(CR_AUTH_USER_CREDENTIALS);
|
DBUG_RETURN(CR_AUTH_USER_CREDENTIALS);
|
||||||
|
|
||||||
if (check_scramble(pkt, thd->scramble, (uchar*)info->auth_string))
|
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;
|
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,
|
static int native_password_get_salt(const char *hash, size_t hash_length,
|
||||||
unsigned char *out, size_t *out_length)
|
unsigned char *out, size_t *out_length)
|
||||||
{
|
{
|
||||||
|
DBUG_ASSERT(sizeof(invalid_password) > SCRAMBLE_LENGTH);
|
||||||
DBUG_ASSERT(*out_length >= SCRAMBLE_LENGTH);
|
DBUG_ASSERT(*out_length >= SCRAMBLE_LENGTH);
|
||||||
if (hash_length == 0)
|
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 != 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);
|
my_error(ER_PASSWD_LENGTH, MYF(0), SCRAMBLED_PASSWORD_CHAR_LENGTH);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -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))
|
if (!mysql_mutex_trylock(&thd->LOCK_thd_data))
|
||||||
{
|
{
|
||||||
len= MY_MIN(buflen - 1, thd->query_length());
|
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);
|
mysql_mutex_unlock(&thd->LOCK_thd_data);
|
||||||
}
|
}
|
||||||
buf[len]= '\0';
|
buf[len]= '\0';
|
||||||
|
@ -1397,7 +1397,8 @@ uint JOIN_CACHE::write_record_data(uchar * link, bool *is_full)
|
|||||||
blob_field->get_image(cp, copy->length,
|
blob_field->get_image(cp, copy->length,
|
||||||
blob_field->charset());
|
blob_field->charset());
|
||||||
DBUG_ASSERT(cp + copy->length + copy->blob_length <= buff + buff_size);
|
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;
|
cp+= copy->length+copy->blob_length;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -10209,7 +10209,8 @@ bool LEX::new_sp_instr_stmt(THD *thd,
|
|||||||
qbuff.length= prefix.length + suffix.length;
|
qbuff.length= prefix.length + suffix.length;
|
||||||
if (!(qbuff.str= (char*) alloc_root(thd->mem_root, qbuff.length + 1)))
|
if (!(qbuff.str= (char*) alloc_root(thd->mem_root, qbuff.length + 1)))
|
||||||
return true;
|
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);
|
strmake(qbuff.str + prefix.length, suffix.str, suffix.length);
|
||||||
i->m_query= qbuff;
|
i->m_query= qbuff;
|
||||||
return sphead->add_instr(i);
|
return sphead->add_instr(i);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2002, 2015, Oracle and/or its affiliates.
|
/* 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
|
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
|
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 "sql_handler.h"
|
||||||
#include "transaction.h" // trans_rollback_implicit
|
#include "transaction.h" // trans_rollback_implicit
|
||||||
#include "mysql/psi/mysql_ps.h" // MYSQL_EXECUTE_PS
|
#include "mysql/psi/mysql_ps.h" // MYSQL_EXECUTE_PS
|
||||||
|
#ifdef WITH_WSREP
|
||||||
#include "wsrep_mysqld.h"
|
#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 */
|
/* Constants defining bits in parameter type flags. Flags are read from high byte of short value */
|
||||||
static const uint PARAMETER_FLAG_UNSIGNED = 128U << 8;
|
static const uint PARAMETER_FLAG_UNSIGNED = 128U << 8;
|
||||||
@ -4607,6 +4610,23 @@ reexecute:
|
|||||||
|
|
||||||
thd->m_reprepare_observer= NULL;
|
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) &&
|
if (unlikely(error) &&
|
||||||
(sql_command_flags[lex->sql_command] & CF_REEXECUTION_FRAGILE) &&
|
(sql_command_flags[lex->sql_command] & CF_REEXECUTION_FRAGILE) &&
|
||||||
!thd->is_fatal_error && !thd->killed &&
|
!thd->is_fatal_error && !thd->killed &&
|
||||||
|
@ -27960,10 +27960,10 @@ JOIN::reoptimize(Item *added_where, table_map join_tables,
|
|||||||
if (save_to)
|
if (save_to)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(!keyuse.elements);
|
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;
|
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. */
|
/* Add the new access methods to the keyuse array. */
|
||||||
|
@ -237,8 +237,8 @@ bool Binary_string::copy(const Binary_string &str)
|
|||||||
{
|
{
|
||||||
if (alloc(str.str_length))
|
if (alloc(str.str_length))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
str_length=str.str_length;
|
if ((str_length=str.str_length))
|
||||||
bmove(Ptr,str.Ptr,str_length); // May be overlapping
|
bmove(Ptr,str.Ptr,str_length); // May be overlapping
|
||||||
Ptr[str_length]=0;
|
Ptr[str_length]=0;
|
||||||
return FALSE;
|
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)
|
bool String::append(const char *s, size_t arg_length, CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
|
if (!arg_length)
|
||||||
|
return false;
|
||||||
|
|
||||||
uint32 offset;
|
uint32 offset;
|
||||||
|
|
||||||
if (needs_conversion((uint32)arg_length, cs, charset(), &offset))
|
if (needs_conversion((uint32)arg_length, cs, charset(), &offset))
|
||||||
{
|
{
|
||||||
size_t add_length;
|
size_t add_length;
|
||||||
|
@ -3195,7 +3195,8 @@ inline void mark_as_null_row(TABLE *table)
|
|||||||
{
|
{
|
||||||
table->null_row=1;
|
table->null_row=1;
|
||||||
table->status|=STATUS_NULL_ROW;
|
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);
|
bool is_simple_order(ORDER *order);
|
||||||
|
@ -1104,8 +1104,11 @@ static bool pack_fields(uchar **buff_arg, List<Create_field> &create_fields,
|
|||||||
it.rewind();
|
it.rewind();
|
||||||
while ((field=it++))
|
while ((field=it++))
|
||||||
{
|
{
|
||||||
memcpy(buff, field->comment.str, field->comment.length);
|
if (size_t l= field->comment.length)
|
||||||
buff+= field->comment.length;
|
{
|
||||||
|
memcpy(buff, field->comment.str, l);
|
||||||
|
buff+= l;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*buff_arg= buff;
|
*buff_arg= buff;
|
||||||
|
@ -76,7 +76,8 @@
|
|||||||
#define cmp_record(A,B) memcmp((A)->record[0],(A)->B,(size_t) (A)->s->reclength)
|
#define cmp_record(A,B) memcmp((A)->record[0],(A)->B,(size_t) (A)->s->reclength)
|
||||||
#define empty_record(A) { \
|
#define empty_record(A) { \
|
||||||
restore_record((A),s->default_values); \
|
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 */
|
/* Defines for use with openfrm, openprt and openfrd */
|
||||||
|
@ -431,7 +431,7 @@ no_read_ahead:
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
read_ahead:
|
read_ahead:
|
||||||
if (!space->acquire_if_not_stopped())
|
if (space->is_stopping())
|
||||||
goto no_read_ahead;
|
goto no_read_ahead;
|
||||||
|
|
||||||
/* Read all the suitable blocks within the area */
|
/* Read all the suitable blocks within the area */
|
||||||
|
@ -1467,7 +1467,8 @@ instant_alter_column_possible(
|
|||||||
for (const dict_index_t* index = ib_table.indexes.start;
|
for (const dict_index_t* index = ib_table.indexes.start;
|
||||||
index; index = index->indexes.next) {
|
index; index = index->indexes.next) {
|
||||||
if (index->has_virtual()) {
|
if (index->has_virtual()) {
|
||||||
ut_ad(ib_table.n_v_cols);
|
ut_ad(ib_table.n_v_cols
|
||||||
|
|| index->is_corrupted());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,8 +147,11 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
|||||||
set_if_smaller(length,tmp_length);
|
set_if_smaller(length,tmp_length);
|
||||||
FIX_LENGTH(cs, pos, length, char_length);
|
FIX_LENGTH(cs, pos, length, char_length);
|
||||||
store_key_length_inc(key,char_length);
|
store_key_length_inc(key,char_length);
|
||||||
memcpy(key, pos, char_length);
|
if (char_length)
|
||||||
key+= char_length;
|
{
|
||||||
|
memcpy(key, pos, char_length);
|
||||||
|
key+= char_length;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (keyseg->flag & HA_SWAP_KEY)
|
else if (keyseg->flag & HA_SWAP_KEY)
|
||||||
|
@ -126,12 +126,18 @@ static void set_setup_object_key(PFS_setup_object_key *key,
|
|||||||
char *ptr= &key->m_hash_key[0];
|
char *ptr= &key->m_hash_key[0];
|
||||||
ptr[0]= (char) object_type;
|
ptr[0]= (char) object_type;
|
||||||
ptr++;
|
ptr++;
|
||||||
memcpy(ptr, schema, schema_length);
|
if (schema_length)
|
||||||
ptr+= schema_length;
|
{
|
||||||
|
memcpy(ptr, schema, schema_length);
|
||||||
|
ptr+= schema_length;
|
||||||
|
}
|
||||||
ptr[0]= 0;
|
ptr[0]= 0;
|
||||||
ptr++;
|
ptr++;
|
||||||
memcpy(ptr, object, object_length);
|
if (object_length)
|
||||||
ptr+= object_length;
|
{
|
||||||
|
memcpy(ptr, object, object_length);
|
||||||
|
ptr+= object_length;
|
||||||
|
}
|
||||||
ptr[0]= 0;
|
ptr[0]= 0;
|
||||||
ptr++;
|
ptr++;
|
||||||
key->m_key_length= (uint)(ptr - &key->m_hash_key[0]);
|
key->m_key_length= (uint)(ptr - &key->m_hash_key[0]);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (c) 2002-2007 MySQL AB & tommy@valley.ne.jp
|
/* Copyright (c) 2002-2007 MySQL AB & tommy@valley.ne.jp
|
||||||
Copyright (c) 2002, 2014, Oracle and/or its affiliates.
|
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
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public
|
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, dstlen);
|
||||||
set_if_smaller(srclen, nweights);
|
set_if_smaller(srclen, nweights);
|
||||||
if (dst != src)
|
if (srclen && dst != src)
|
||||||
memcpy(dst, src, srclen);
|
memcpy(dst, src, srclen);
|
||||||
return my_strxfrm_pad_desc_and_reverse(cs, dst, dst + srclen, dst + dstlen,
|
return my_strxfrm_pad_desc_and_reverse(cs, dst, dst + srclen, dst + dstlen,
|
||||||
(uint)(nweights - srclen), flags, 0);
|
(uint)(nweights - srclen), flags, 0);
|
||||||
|
@ -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));
|
alloced= a= (uchar*) my_malloc(PSI_INSTRUMENT_ME, a_length+b_length+2, MYF(MY_FAE));
|
||||||
|
|
||||||
b= a + a_length+1;
|
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' */
|
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 */
|
b[b_length]= 0; /* put end of string */
|
||||||
a_length= thai2sortable(a, a_length);
|
a_length= thai2sortable(a, a_length);
|
||||||
b_length= thai2sortable(b, b_length);
|
b_length= thai2sortable(b, b_length);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user