MDEV-6956:SET STATEMENT default_master_connection = ... has no effect

the problem was in assigning default value during parsing.
This commit is contained in:
Oleksandr Byelkin 2015-02-25 21:29:13 +01:00
parent e91bc2e91d
commit dab12366b1
9 changed files with 124 additions and 11 deletions

View file

@ -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

View file

@ -16,7 +16,3 @@ Max_statement_time_exceeded 1
SELECT @@MAX_STATEMENT_TIME; SELECT @@MAX_STATEMENT_TIME;
@@MAX_STATEMENT_TIME @@MAX_STATEMENT_TIME
0.000000 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.

View file

@ -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 = '';

View file

@ -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

View file

@ -10,8 +10,4 @@ SET STATEMENT MAX_STATEMENT_TIME=2 FOR SELECT SLEEP(3);
SHOW STATUS LIKE "max_statement_time_exceeded"; SHOW STATUS LIKE "max_statement_time_exceeded";
SELECT @@MAX_STATEMENT_TIME; 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;

View file

@ -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 Force statement logging for DDL commands to allow us to update
privilege, system or statistic tables directly without the updates privilege, system or statistic tables directly without the updates

View file

@ -2443,7 +2443,7 @@ optional_connection_name:
/* empty */ /* empty */
{ {
LEX *lex= thd->lex; LEX *lex= thd->lex;
lex->mi.connection_name= thd->variables.default_master_connection; lex->mi.connection_name= null_lex_str;
} }
| connection_name; | connection_name;
; ;
@ -12674,7 +12674,7 @@ show_param:
| SLAVE STATUS_SYM | SLAVE STATUS_SYM
{ {
LEX *lex= thd->lex; 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->sql_command = SQLCOM_SHOW_SLAVE_STAT;
lex->verbose= 0; lex->verbose= 0;
} }

View file

@ -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( static Sys_var_session_lexstring Sys_default_master_connection(
"default_master_connection", "default_master_connection",
"Master connection to use for all slave variables and slave commands", "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, NO_CMD_LINE, IN_SYSTEM_CHARSET,
DEFAULT(""), MAX_CONNECTION_NAME, ON_CHECK(check_master_connection)); DEFAULT(""), MAX_CONNECTION_NAME, ON_CHECK(check_master_connection));
#endif #endif