mirror of
https://github.com/MariaDB/server.git
synced 2025-04-21 22:55:35 +02:00
Merge 10.1 into 10.2
This commit is contained in:
commit
bc862c4ebe
9 changed files with 121 additions and 82 deletions
client
mysql-test
storage
|
@ -98,6 +98,7 @@ enum options_client
|
|||
OPT_REPORT_PROGRESS,
|
||||
OPT_SKIP_ANNOTATE_ROWS_EVENTS,
|
||||
OPT_SSL_CRL, OPT_SSL_CRLPATH,
|
||||
OPT_IGNORE_DATA,
|
||||
OPT_MAX_CLIENT_OPTION /* should be always the last */
|
||||
};
|
||||
|
||||
|
|
|
@ -90,6 +90,7 @@
|
|||
/* Max length GTID position that we will output. */
|
||||
#define MAX_GTID_LENGTH 1024
|
||||
|
||||
static my_bool ignore_table_data(const uchar *hash_key, size_t len);
|
||||
static void add_load_option(DYNAMIC_STRING *str, const char *option,
|
||||
const char *option_value);
|
||||
static ulong find_set(TYPELIB *, const char *, size_t, char **, uint *);
|
||||
|
@ -211,7 +212,7 @@ TYPELIB compatible_mode_typelib= {array_elements(compatible_mode_names) - 1,
|
|||
|
||||
#define MED_ENGINES "MRG_MyISAM, MRG_ISAM, CONNECT, OQGRAPH, SPIDER, VP, FEDERATED"
|
||||
|
||||
HASH ignore_table;
|
||||
HASH ignore_table, ignore_data;
|
||||
|
||||
static struct my_option my_long_options[] =
|
||||
{
|
||||
|
@ -375,6 +376,12 @@ static struct my_option my_long_options[] =
|
|||
&opt_hex_blob, &opt_hex_blob, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"host", 'h', "Connect to host.", ¤t_host,
|
||||
¤t_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"ignore-table-data", OPT_IGNORE_DATA,
|
||||
"Do not dump the specified table data. To specify more than one table "
|
||||
"to ignore, use the directive multiple times, once for each table. "
|
||||
"Each table must be specified with both database and table names, e.g., "
|
||||
"--ignore-table-data=database.table.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"ignore-table", OPT_IGNORE_TABLE,
|
||||
"Do not dump the specified table. To specify more than one table to ignore, "
|
||||
"use the directive multiple times, once for each table. Each table must "
|
||||
|
@ -899,6 +906,18 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
case (int) OPT_TABLES:
|
||||
opt_databases=0;
|
||||
break;
|
||||
case (int) OPT_IGNORE_DATA:
|
||||
{
|
||||
if (!strchr(argument, '.'))
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Illegal use of option --ignore-table-data=<database>.<table>\n");
|
||||
exit(1);
|
||||
}
|
||||
if (my_hash_insert(&ignore_data, (uchar*)my_strdup(argument, MYF(0))))
|
||||
exit(EX_EOM);
|
||||
break;
|
||||
}
|
||||
case (int) OPT_IGNORE_TABLE:
|
||||
{
|
||||
if (!strchr(argument, '.'))
|
||||
|
@ -1001,6 +1020,10 @@ static int get_options(int *argc, char ***argv)
|
|||
(uchar*) my_strdup("mysql.slow_log", MYF(MY_WME))))
|
||||
return(EX_EOM);
|
||||
|
||||
if (my_hash_init(&ignore_data, charset_info, 16, 0, 0,
|
||||
(my_hash_get_key) get_table_key, my_free, 0))
|
||||
return(EX_EOM);
|
||||
|
||||
if ((ho_error= handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
return(ho_error);
|
||||
|
||||
|
@ -1648,6 +1671,8 @@ static void free_resources()
|
|||
free_root(&glob_root, MYF(0));
|
||||
if (my_hash_inited(&ignore_table))
|
||||
my_hash_free(&ignore_table);
|
||||
if (my_hash_inited(&ignore_data))
|
||||
my_hash_free(&ignore_data);
|
||||
dynstr_free(&extended_row);
|
||||
dynstr_free(&dynamic_where);
|
||||
dynstr_free(&insert_pat);
|
||||
|
@ -3622,7 +3647,7 @@ static char *alloc_query_str(ulong size)
|
|||
*/
|
||||
|
||||
|
||||
static void dump_table(char *table, char *db)
|
||||
static void dump_table(char *table, char *db, const uchar *hash_key, size_t len)
|
||||
{
|
||||
char ignore_flag;
|
||||
char buf[200], table_buff[NAME_LEN+3];
|
||||
|
@ -3650,7 +3675,7 @@ static void dump_table(char *table, char *db)
|
|||
DBUG_VOID_RETURN;
|
||||
|
||||
/* Check --no-data flag */
|
||||
if (opt_no_data)
|
||||
if (opt_no_data || (hash_key && ignore_table_data(hash_key, len)))
|
||||
{
|
||||
verbose_msg("-- Skipping dump data for table '%s', --no-data was used\n",
|
||||
table);
|
||||
|
@ -4578,10 +4603,14 @@ static int init_dumping(char *database, int init_func(char*))
|
|||
|
||||
/* Return 1 if we should copy the table */
|
||||
|
||||
my_bool include_table(const uchar *hash_key, size_t len)
|
||||
static my_bool include_table(const uchar *hash_key, size_t len)
|
||||
{
|
||||
return ! my_hash_search(&ignore_table, hash_key, len);
|
||||
}
|
||||
static my_bool ignore_table_data(const uchar *hash_key, size_t len)
|
||||
{
|
||||
return my_hash_search(&ignore_data, hash_key, len) != NULL;
|
||||
}
|
||||
|
||||
|
||||
static int dump_all_tables_in_db(char *database)
|
||||
|
@ -4646,7 +4675,7 @@ static int dump_all_tables_in_db(char *database)
|
|||
char *end= strmov(afterdot, table);
|
||||
if (include_table((uchar*) hash_key, end - hash_key))
|
||||
{
|
||||
dump_table(table,database);
|
||||
dump_table(table, database, (uchar*) hash_key, end - hash_key);
|
||||
my_free(order_by);
|
||||
order_by= 0;
|
||||
if (opt_dump_triggers && mysql_get_server_version(mysql) >= 50009)
|
||||
|
@ -5035,7 +5064,7 @@ static int dump_selected_tables(char *db, char **table_names, int tables)
|
|||
for (pos= dump_tables; pos < end; pos++)
|
||||
{
|
||||
DBUG_PRINT("info",("Dumping table %s", *pos));
|
||||
dump_table(*pos, db);
|
||||
dump_table(*pos, db, NULL, 0);
|
||||
if (opt_dump_triggers &&
|
||||
mysql_get_server_version(mysql) >= 50009)
|
||||
{
|
||||
|
@ -6016,6 +6045,7 @@ int main(int argc, char **argv)
|
|||
compatible_mode_normal_str[0]= 0;
|
||||
default_charset= (char *)mysql_universal_client_charset;
|
||||
bzero((char*) &ignore_table, sizeof(ignore_table));
|
||||
bzero((char*) &ignore_data, sizeof(ignore_data));
|
||||
|
||||
exit_code= get_options(&argc, &argv);
|
||||
if (exit_code)
|
||||
|
|
|
@ -1154,71 +1154,6 @@ void do_eval(DYNAMIC_STRING *query_eval, const char *query,
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
Run query and dump the result to stderr in vertical format
|
||||
|
||||
NOTE! This function should be safe to call when an error
|
||||
has occurred and thus any further errors will be ignored (although logged)
|
||||
|
||||
SYNOPSIS
|
||||
show_query
|
||||
mysql - connection to use
|
||||
query - query to run
|
||||
|
||||
*/
|
||||
|
||||
static void show_query(MYSQL* mysql, const char* query)
|
||||
{
|
||||
MYSQL_RES* res;
|
||||
DBUG_ENTER("show_query");
|
||||
|
||||
if (!mysql)
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
if (mysql_query(mysql, query))
|
||||
{
|
||||
log_msg("Error running query '%s': %d %s",
|
||||
query, mysql_errno(mysql), mysql_error(mysql));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
if ((res= mysql_store_result(mysql)) == NULL)
|
||||
{
|
||||
/* No result set returned */
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
{
|
||||
MYSQL_ROW row;
|
||||
unsigned int i;
|
||||
unsigned int row_num= 0;
|
||||
unsigned int num_fields= mysql_num_fields(res);
|
||||
MYSQL_FIELD *fields= mysql_fetch_fields(res);
|
||||
|
||||
fprintf(stderr, "=== %s ===\n", query);
|
||||
while ((row= mysql_fetch_row(res)))
|
||||
{
|
||||
unsigned long *lengths= mysql_fetch_lengths(res);
|
||||
row_num++;
|
||||
|
||||
fprintf(stderr, "---- %d. ----\n", row_num);
|
||||
for(i= 0; i < num_fields; i++)
|
||||
{
|
||||
fprintf(stderr, "%s\t%.*s\n",
|
||||
fields[i].name,
|
||||
(int)lengths[i], row[i] ? row[i] : "NULL");
|
||||
}
|
||||
}
|
||||
for (i= 0; i < strlen(query)+8; i++)
|
||||
fprintf(stderr, "=");
|
||||
fprintf(stderr, "\n\n");
|
||||
}
|
||||
mysql_free_result(res);
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Show any warnings just before the error. Since the last error
|
||||
is added to the warning stack, only print @@warning_count-1 warnings.
|
||||
|
@ -4808,9 +4743,6 @@ void do_sync_with_master2(struct st_command *command, long offset,
|
|||
if (!result_str || result < 0)
|
||||
{
|
||||
/* master_pos_wait returned NULL or < 0 */
|
||||
show_query(mysql, "SHOW MASTER STATUS");
|
||||
show_query(mysql, "SHOW SLAVE STATUS");
|
||||
show_query(mysql, "SHOW PROCESSLIST");
|
||||
fprintf(stderr, "analyze: sync_with_master\n");
|
||||
|
||||
if (!result_str)
|
||||
|
|
|
@ -5647,9 +5647,27 @@ count(*)
|
|||
2
|
||||
drop tables t2, t1;
|
||||
#
|
||||
# MDEV-22037: Add ability to skip content of some tables
|
||||
# (work around for MDEV-20939)
|
||||
#
|
||||
use mysql;
|
||||
# check that all tables we need are not empty
|
||||
select count(*) >= 1 from mysql.proc;
|
||||
count(*) >= 1
|
||||
1
|
||||
select count(*) >= 1 from mysql.db;
|
||||
count(*) >= 1
|
||||
1
|
||||
# for proc we have CREATE and INSERT for all other only CREATE
|
||||
FOUND 1 /INSERT INTO `proc`/ in MDEV-20939.sql
|
||||
NOT FOUND /INSERT INTO `db`/ in MDEV-20939.sql
|
||||
FOUND 1 /CREATE TABLE `db`/ in MDEV-20939.sql
|
||||
FOUND 1 /CREATE TABLE `proc`/ in MDEV-20939.sql
|
||||
use test;
|
||||
# End of 10.1 tests
|
||||
#
|
||||
# Test for --add-drop-trigger
|
||||
#
|
||||
use test;
|
||||
CREATE TABLE t1 (a int, b int);
|
||||
CREATE TRIGGER tt1_t1 BEFORE INSERT ON t1 FOR EACH ROW
|
||||
SET NEW.b=NEW.a + 10;
|
||||
|
@ -5695,3 +5713,4 @@ DELIMITER ;
|
|||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
DROP TABLE t1;
|
||||
# End of 10.2 tests
|
||||
|
|
|
@ -274,6 +274,13 @@ CREATE TABLE t2 (f INT, KEY(f)) ENGINE=InnoDB;
|
|||
ALTER TABLE t1 ADD FOREIGN KEY (f2) REFERENCES t2 (f);
|
||||
ALTER IGNORE TABLE t1 ADD FOREIGN KEY (f3) REFERENCES t1 (f1);
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1 (a INT, b INT, KEY idx(a)) ENGINE=InnoDB;
|
||||
SET FOREIGN_KEY_CHECKS= OFF;
|
||||
ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES tx(x);
|
||||
ALTER TABLE t1 DROP KEY idx;
|
||||
ALTER TABLE t1 CHANGE a c INT;
|
||||
DROP TABLE t1;
|
||||
SET FOREIGN_KEY_CHECKS=1;
|
||||
# Start of 10.2 tests
|
||||
#
|
||||
# MDEV-13246 Stale rows despite ON DELETE CASCADE constraint
|
||||
|
|
|
@ -257,6 +257,17 @@ ALTER TABLE t1 ADD FOREIGN KEY (f2) REFERENCES t2 (f);
|
|||
ALTER IGNORE TABLE t1 ADD FOREIGN KEY (f3) REFERENCES t1 (f1);
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
# MDEV-19092 Server crash when renaming the column when
|
||||
# FOREIGN_KEY_CHECKS is disabled
|
||||
CREATE TABLE t1 (a INT, b INT, KEY idx(a)) ENGINE=InnoDB;
|
||||
SET FOREIGN_KEY_CHECKS= OFF;
|
||||
ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES tx(x);
|
||||
ALTER TABLE t1 DROP KEY idx;
|
||||
ALTER TABLE t1 CHANGE a c INT;
|
||||
# Cleanup
|
||||
DROP TABLE t1;
|
||||
SET FOREIGN_KEY_CHECKS=1;
|
||||
|
||||
--echo # Start of 10.2 tests
|
||||
|
||||
--echo #
|
||||
|
|
|
@ -2688,10 +2688,45 @@ select count(*) from t2;
|
|||
--remove_file $MYSQLTEST_VARDIR/tmp/t2.txt
|
||||
drop tables t2, t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22037: Add ability to skip content of some tables
|
||||
--echo # (work around for MDEV-20939)
|
||||
--echo #
|
||||
|
||||
use mysql;
|
||||
|
||||
--echo # check that all tables we need are not empty
|
||||
|
||||
select count(*) >= 1 from mysql.proc;
|
||||
select count(*) >= 1 from mysql.db;
|
||||
|
||||
|
||||
--exec $MYSQL_DUMP mysql --ignore-table-data=mysql.db >$MYSQLTEST_VARDIR/tmp/MDEV-20939.sql
|
||||
|
||||
|
||||
--echo # for proc we have CREATE and INSERT for all other only CREATE
|
||||
|
||||
let SEARCH_RANGE=500000000;
|
||||
let SEARCH_FILE=$MYSQLTEST_VARDIR/tmp/MDEV-20939.sql;
|
||||
let SEARCH_PATTERN=INSERT INTO `proc`;
|
||||
source include/search_pattern_in_file.inc;
|
||||
let SEARCH_PATTERN=INSERT INTO `db`;
|
||||
source include/search_pattern_in_file.inc;
|
||||
let SEARCH_PATTERN=CREATE TABLE `db`;
|
||||
source include/search_pattern_in_file.inc;
|
||||
let SEARCH_PATTERN=CREATE TABLE `proc`;
|
||||
source include/search_pattern_in_file.inc;
|
||||
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/MDEV-20939.sql
|
||||
use test;
|
||||
|
||||
--echo # End of 10.1 tests
|
||||
|
||||
--echo #
|
||||
--echo # Test for --add-drop-trigger
|
||||
--echo #
|
||||
use test;
|
||||
|
||||
CREATE TABLE t1 (a int, b int);
|
||||
CREATE TRIGGER tt1_t1 BEFORE INSERT ON t1 FOR EACH ROW
|
||||
SET NEW.b=NEW.a + 10;
|
||||
|
@ -2699,3 +2734,5 @@ CREATE TRIGGER tt1_t1 BEFORE INSERT ON t1 FOR EACH ROW
|
|||
INSERT INTO t1 (a) VALUES (1),(2),(3);
|
||||
--exec $MYSQL_DUMP --default-character-set=utf8mb4 --triggers --no-data --no-create-info --add-drop-trigger --skip-comments --databases test
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # End of 10.2 tests
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Copyright (c) 1996, 2018, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2012, Facebook Inc.
|
||||
Copyright (c) 2013, 2019, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2020, MariaDB Corporation.
|
||||
|
||||
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 the Free Software
|
||||
|
@ -564,9 +564,10 @@ dict_mem_table_col_rename_low(
|
|||
foreign->foreign_col_names,
|
||||
foreign->n_fields, NULL, true, false,
|
||||
NULL, NULL, NULL);
|
||||
/* There must be an equivalent index in this case. */
|
||||
ut_ad(new_index != NULL);
|
||||
|
||||
/* New index can be null if InnoDB already dropped
|
||||
the foreign index when FOREIGN_KEY_CHECKS is
|
||||
disabled */
|
||||
foreign->foreign_index = new_index;
|
||||
|
||||
} else {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2012, Facebook Inc.
|
||||
Copyright (c) 2013, 2019, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2020, MariaDB Corporation.
|
||||
|
||||
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 the Free Software
|
||||
|
@ -421,9 +421,10 @@ dict_mem_table_col_rename_low(
|
|||
foreign->foreign_col_names,
|
||||
foreign->n_fields, NULL, true, false,
|
||||
NULL, NULL, NULL);
|
||||
/* There must be an equivalent index in this case. */
|
||||
ut_ad(new_index != NULL);
|
||||
|
||||
/* New index can be null if XtraDB already dropped
|
||||
the foreign index when FOREIGN_KEY_CHECKS is
|
||||
disabled */
|
||||
foreign->foreign_index = new_index;
|
||||
|
||||
} else {
|
||||
|
|
Loading…
Add table
Reference in a new issue