From dab12366b1c7ee4e3477ac9dd37ea6c24113cf5b Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Wed, 25 Feb 2015 21:29:13 +0100 Subject: [PATCH] MDEV-6956:SET STATEMENT default_master_connection = ... has no effect the problem was in assigning default value during parsing. --- mysql-test/include/show_all_slaves_status.inc | 65 +++++++++++++++++++ mysql-test/r/set_statement_notembedded.result | 4 -- mysql-test/suite/rpl/r/rpl_set_statement.test | 0 .../r/rpl_set_statement_default_master.result | 19 ++++++ .../t/rpl_set_statement_default_master.test | 34 ++++++++++ mysql-test/t/set_statement_notembedded.test | 4 -- sql/sql_parse.cc | 3 + sql/sql_yacc.yy | 4 +- sql/sys_vars.cc | 2 +- 9 files changed, 124 insertions(+), 11 deletions(-) create mode 100644 mysql-test/include/show_all_slaves_status.inc create mode 100644 mysql-test/suite/rpl/r/rpl_set_statement.test create mode 100644 mysql-test/suite/rpl/r/rpl_set_statement_default_master.result create mode 100644 mysql-test/suite/rpl/t/rpl_set_statement_default_master.test diff --git a/mysql-test/include/show_all_slaves_status.inc b/mysql-test/include/show_all_slaves_status.inc new file mode 100644 index 00000000000..4c96c31ce50 --- /dev/null +++ b/mysql-test/include/show_all_slaves_status.inc @@ -0,0 +1,65 @@ +# ==== Usage ==== +# +# --let $status_items= Column_Name[, Column_Name[, ...]] +# --source include/show_all_slaves_status.inc +# +# Parameters: +# $status_items +# Set to the name of the column in the output of SHOW SLAVE STATUS +# that you want to display. Example: +# +# --let $status_items= Master_SSL_Allowed +# +# You can show multiple columns by setting $status_items to a +# comma-separated list. Example: +# +# --let $status_items= Master_Log_File, Relay_Master_Log_File +# +# $slave_field_result_replace +# If set, one or more regex patterns for replacing variable +# text in the error message. Syntax as --replace-regex +# +# $slave_sql_mode +# If set, change the slave sql mode during this macro, reverting +# to the previous on exit. Default sql_mode is NO_BACKSLASH_ESCAPES +# to allow replace '\' by '/' making paths OS independent. Example: +# +# --let $slave_sql_mode= NO_BACKSLASH_ESCAPES +# + + +--let $_show_slave_status_items=$status_items +if (!$status_items) +{ + --die Bug in test case: The mysqltest variable $status_items is not set. +} + + +--let $_slave_sql_mode= NO_BACKSLASH_ESCAPES +if ($slave_sql_mode) +{ + --let $_slave_sql_mode= $slave_sql_mode +} +--let $_previous_slave_sql_mode = `SELECT @@sql_mode` +--disable_query_log +eval SET sql_mode= '$_slave_sql_mode'; +--enable_query_log + + +while ($_show_slave_status_items) +{ + --let $_show_slave_status_name= `SELECT SUBSTRING_INDEX('$_show_slave_status_items', ',', 1)` + --let $_show_slave_status_items= `SELECT LTRIM(SUBSTRING('$_show_slave_status_items', LENGTH('$_show_slave_status_name') + 2))` + + --replace_regex /\.[\\\/]master/master/ + --let $_show_slave_status_value= query_get_value(SHOW ALL SLAVES STATUS, $_show_slave_status_name, 1) + --let $_slave_field_result_replace= /[\\\\]/\// $slave_field_result_replace + --replace_regex $_slave_field_result_replace + --let $_show_slave_status_value= `SELECT REPLACE("$_show_slave_status_value", '$MYSQL_TEST_DIR', 'MYSQL_TEST_DIR')` + --echo $_show_slave_status_name = '$_show_slave_status_value' +} + + +--disable_query_log +eval SET sql_mode= '$_previous_slave_sql_mode'; +--enable_query_log diff --git a/mysql-test/r/set_statement_notembedded.result b/mysql-test/r/set_statement_notembedded.result index e45ae366c6e..561c30d49ac 100644 --- a/mysql-test/r/set_statement_notembedded.result +++ b/mysql-test/r/set_statement_notembedded.result @@ -16,7 +16,3 @@ Max_statement_time_exceeded 1 SELECT @@MAX_STATEMENT_TIME; @@MAX_STATEMENT_TIME 0.000000 -set statement default_master_connection=default for select 1; -ERROR 42000: The system variable default_master_connection cannot be set in SET STATEMENT. -set statement default_master_connection=default for select 1; -ERROR 42000: The system variable default_master_connection cannot be set in SET STATEMENT. diff --git a/mysql-test/suite/rpl/r/rpl_set_statement.test b/mysql-test/suite/rpl/r/rpl_set_statement.test new file mode 100644 index 00000000000..e69de29bb2d diff --git a/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result b/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result new file mode 100644 index 00000000000..fdefdc9d7c3 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result @@ -0,0 +1,19 @@ +include/master-slave.inc +[connection master] +include/stop_slave.inc +RESET SLAVE ALL; +# Does not work for CHANGE MASTER: +SET STATEMENT default_master_connection = 'm1' FOR +CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_MYPORT, MASTER_USER='root'; +# +# The first field, Connection_name, should say 'm1'... +# +Connection_name = 'm1' +RESET SLAVE ALL; +CHANGE MASTER 'm1' TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_MYPORT, MASTER_USER='root'; +SET STATEMENT default_master_connection = 'm1' FOR START SLAVE; +set default_master_connection = 'm1'; +stop slave; +include/wait_for_slave_to_stop.inc +reset slave all; +set default_master_connection = ''; diff --git a/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test b/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test new file mode 100644 index 00000000000..106cb4547f4 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test @@ -0,0 +1,34 @@ +--source include/master-slave.inc + +--connection slave + +--source include/stop_slave.inc +RESET SLAVE ALL; + +--echo # Does not work for CHANGE MASTER: +--replace_result $MASTER_MYPORT MASTER_MYPORT +eval SET STATEMENT default_master_connection = 'm1' FOR + CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$MASTER_MYPORT, MASTER_USER='root'; + + +--echo # +--echo # The first field, Connection_name, should say 'm1'... +--echo # +--let $status_items= Connection_name +--source include/show_all_slaves_status.inc +#query_vertical SHOW ALL SLAVES STATUS; + + +RESET SLAVE ALL; + +--replace_result $MASTER_MYPORT MASTER_MYPORT +eval CHANGE MASTER 'm1' TO MASTER_HOST='127.0.0.1', MASTER_PORT=$MASTER_MYPORT, MASTER_USER='root'; +SET STATEMENT default_master_connection = 'm1' FOR START SLAVE; + +set default_master_connection = 'm1'; +stop slave; +--source include/wait_for_slave_to_stop.inc +reset slave all; +set default_master_connection = ''; +--disconnect slave +--connection default diff --git a/mysql-test/t/set_statement_notembedded.test b/mysql-test/t/set_statement_notembedded.test index b0021de51ee..7bb8f5e1aab 100644 --- a/mysql-test/t/set_statement_notembedded.test +++ b/mysql-test/t/set_statement_notembedded.test @@ -10,8 +10,4 @@ SET STATEMENT MAX_STATEMENT_TIME=2 FOR SELECT SLEEP(3); SHOW STATUS LIKE "max_statement_time_exceeded"; SELECT @@MAX_STATEMENT_TIME; ---error ER_SET_STATEMENT_NOT_SUPPORTED -set statement default_master_connection=default for select 1; ---error ER_SET_STATEMENT_NOT_SUPPORTED -set statement default_master_connection=default for select 1; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 9c084555475..723e348aca7 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2730,6 +2730,9 @@ mysql_execute_command(THD *thd) } } + if (thd->lex->mi.connection_name.str == NULL) + thd->lex->mi.connection_name= thd->variables.default_master_connection; + /* Force statement logging for DDL commands to allow us to update privilege, system or statistic tables directly without the updates diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 492e774509e..fe44fd21675 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2443,7 +2443,7 @@ optional_connection_name: /* empty */ { LEX *lex= thd->lex; - lex->mi.connection_name= thd->variables.default_master_connection; + lex->mi.connection_name= null_lex_str; } | connection_name; ; @@ -12674,7 +12674,7 @@ show_param: | SLAVE STATUS_SYM { LEX *lex= thd->lex; - lex->mi.connection_name= thd->variables.default_master_connection; + lex->mi.connection_name= null_lex_str; lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; lex->verbose= 0; } diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 079861f48d0..34af4318372 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -993,7 +993,7 @@ static bool check_master_connection(sys_var *self, THD *thd, set_var *var) static Sys_var_session_lexstring Sys_default_master_connection( "default_master_connection", "Master connection to use for all slave variables and slave commands", - NO_SET_STMT SESSION_ONLY(default_master_connection), + SESSION_ONLY(default_master_connection), NO_CMD_LINE, IN_SYSTEM_CHARSET, DEFAULT(""), MAX_CONNECTION_NAME, ON_CHECK(check_master_connection)); #endif