diff --git a/mysql-test/suite/rpl/r/rpl_change_master_implicit_gtid_warning.result b/mysql-test/suite/rpl/r/rpl_change_master_implicit_gtid_warning.result new file mode 100644 index 0000000000000..9692bffced266 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_change_master_implicit_gtid_warning.result @@ -0,0 +1,36 @@ +include/master-slave.inc +[connection master] +connection slave; +include/stop_slave.inc +# +# Test 1: CHANGE MASTER TO with relay_log_pos when Using_Gtid is +# already No should NOT produce a spurious 'from No to No' warning +# +CHANGE MASTER TO MASTER_USE_GTID=NO; +CHANGE MASTER TO relay_log_pos=0; +SHOW WARNINGS; +Level Code Message +# +# Test 2: CHANGE MASTER TO with master_log_file/pos when Using_Gtid +# is already No should NOT produce a warning +# +CHANGE MASTER TO master_log_pos=IO_LOG_POS, master_log_file='IO_LOG_FILE'; +SHOW WARNINGS; +Level Code Message +# +# Test 3: CHANGE MASTER TO with log coordinates when Using_Gtid is +# Slave_Pos SHOULD produce a warning (value actually changes) +# +CHANGE MASTER TO MASTER_USE_GTID=Slave_Pos; +CHANGE MASTER TO master_log_pos=IO_LOG_POS, master_log_file='IO_LOG_FILE'; +Warnings: +Note 4190 CHANGE MASTER TO is implicitly changing the value of 'Using_Gtid' from 'Slave_Pos' to 'No' +SHOW WARNINGS; +Level Code Message +Note 4190 CHANGE MASTER TO is implicitly changing the value of 'Using_Gtid' from 'Slave_Pos' to 'No' +# +# Cleanup +# +CHANGE MASTER TO MASTER_USE_GTID=Slave_Pos; +include/start_slave.inc +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_from_mysql80.result b/mysql-test/suite/rpl/r/rpl_from_mysql80.result index 1fac65adbad90..0f67f8a623596 100644 --- a/mysql-test/suite/rpl/r/rpl_from_mysql80.result +++ b/mysql-test/suite/rpl/r/rpl_from_mysql80.result @@ -22,8 +22,6 @@ include/wait_for_slave_sql_error.inc [errno=1594] STOP SLAVE IO_THREAD; include/wait_for_slave_io_to_stop.inc CHANGE MASTER TO Master_log_file='master-bin.000001', Master_log_pos=2297; -Warnings: -Note 4190 CHANGE MASTER TO is implicitly changing the value of 'Using_Gtid' from 'No' to 'No' START SLAVE IO_THREAD; START SLAVE SQL_THREAD; include/wait_for_slave_io_to_start.inc @@ -41,8 +39,6 @@ a b STOP SLAVE IO_THREAD; include/wait_for_slave_io_to_stop.inc CHANGE MASTER TO Master_log_file='master-bin.000002', Master_log_pos=4; -Warnings: -Note 4190 CHANGE MASTER TO is implicitly changing the value of 'Using_Gtid' from 'No' to 'No' START SLAVE IO_THREAD; START SLAVE SQL_THREAD; include/wait_for_slave_io_to_start.inc diff --git a/mysql-test/suite/rpl/t/rpl_change_master_implicit_gtid_warning.test b/mysql-test/suite/rpl/t/rpl_change_master_implicit_gtid_warning.test new file mode 100644 index 0000000000000..898c1ed32c792 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_change_master_implicit_gtid_warning.test @@ -0,0 +1,52 @@ +# +# Purpose: +# This test validates that CHANGE MASTER TO does not emit a spurious +# warning about implicitly changing Using_Gtid when the value is not +# actually changing. +# +# References: +# MDEV-37842: CHANGE MASTER TO is implicitly changing the value of +# 'Using_Gtid' from 'No' to 'No' +# + +# Format independent test so just use one +--source include/have_binlog_format_mixed.inc +--source include/master-slave.inc + +--connection slave +--source include/stop_slave.inc + +--echo # +--echo # Test 1: CHANGE MASTER TO with relay_log_pos when Using_Gtid is +--echo # already No should NOT produce a spurious 'from No to No' warning +--echo # +CHANGE MASTER TO MASTER_USE_GTID=NO; +CHANGE MASTER TO relay_log_pos=0; +SHOW WARNINGS; + +--echo # +--echo # Test 2: CHANGE MASTER TO with master_log_file/pos when Using_Gtid +--echo # is already No should NOT produce a warning +--echo # +--let $io_log_pos= query_get_value('SHOW SLAVE STATUS', Read_Master_Log_Pos, 1) +--let $io_log_file= query_get_value('SHOW SLAVE STATUS', Master_Log_File, 1) +--replace_result $io_log_file IO_LOG_FILE $io_log_pos IO_LOG_POS +--eval CHANGE MASTER TO master_log_pos=$io_log_pos, master_log_file='$io_log_file' +SHOW WARNINGS; + +--echo # +--echo # Test 3: CHANGE MASTER TO with log coordinates when Using_Gtid is +--echo # Slave_Pos SHOULD produce a warning (value actually changes) +--echo # +CHANGE MASTER TO MASTER_USE_GTID=Slave_Pos; +--replace_result $io_log_file IO_LOG_FILE $io_log_pos IO_LOG_POS +--eval CHANGE MASTER TO master_log_pos=$io_log_pos, master_log_file='$io_log_file' +SHOW WARNINGS; + +--echo # +--echo # Cleanup +--echo # +CHANGE MASTER TO MASTER_USE_GTID=Slave_Pos; +--source include/start_slave.inc + +--source include/rpl_end.inc diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 21b7aa84f1780..bc6a310b147f6 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -3869,7 +3869,8 @@ bool change_master(THD* thd, Master_info* mi, bool *master_info_added) lex_mi->log_file_name || lex_mi->pos || lex_mi->relay_log_name || lex_mi->relay_log_pos) { - if (lex_mi->use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_NO) + if (lex_mi->use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_NO && + mi->using_gtid != Master_info::USE_GTID_NO) { push_warning_printf( thd, Sql_condition::WARN_LEVEL_NOTE, WARN_OPTION_CHANGING,