Skip to content

Commit

Permalink
Merge 10.1 into 10.2
Browse files Browse the repository at this point in the history
  • Loading branch information
dr-m committed Apr 1, 2020
2 parents b1742a5 + f9639c2 commit bc862c4
Show file tree
Hide file tree
Showing 9 changed files with 121 additions and 82 deletions.
1 change: 1 addition & 0 deletions client/client_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
};

Expand Down
42 changes: 36 additions & 6 deletions client/mysqldump.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down Expand Up @@ -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[] =
{
Expand Down Expand Up @@ -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.", &current_host,
&current_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 "
Expand Down Expand Up @@ -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, '.'))
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
Expand Down
68 changes: 0 additions & 68 deletions client/mysqltest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)
Expand Down
21 changes: 20 additions & 1 deletion mysql-test/r/mysqldump.result
Original file line number Diff line number Diff line change
Expand Up @@ -5647,9 +5647,27 @@ count(*)
2
drop tables t2, t1;
#
# Test for --add-drop-trigger
# 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
#
CREATE TABLE t1 (a int, b int);
CREATE TRIGGER tt1_t1 BEFORE INSERT ON t1 FOR EACH ROW
SET NEW.b=NEW.a + 10;
Expand Down Expand Up @@ -5695,3 +5713,4 @@ DELIMITER ;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

DROP TABLE t1;
# End of 10.2 tests
7 changes: 7 additions & 0 deletions mysql-test/suite/innodb/r/foreign_key.result
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions mysql-test/suite/innodb/t/foreign_key.test
Original file line number Diff line number Diff line change
Expand Up @@ -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 #
Expand Down
39 changes: 38 additions & 1 deletion mysql-test/t/mysqldump.test
Original file line number Diff line number Diff line change
Expand Up @@ -2688,14 +2688,51 @@ select count(*) from t2;
--remove_file $MYSQLTEST_VARDIR/tmp/t2.txt
drop tables t2, t1;


--echo #
--echo # Test for --add-drop-trigger
--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 #

CREATE TABLE t1 (a int, b int);
CREATE TRIGGER tt1_t1 BEFORE INSERT ON t1 FOR EACH ROW
SET NEW.b=NEW.a + 10;

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
7 changes: 4 additions & 3 deletions storage/innobase/dict/dict0mem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
7 changes: 4 additions & 3 deletions storage/xtradb/dict/dict0mem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit bc862c4

Please sign in to comment.