[Commits] 8bae7b6: MDEV-6956:SET STATEMENT default_master_connection = ... has no effect

sanja at mariadb.com sanja at mariadb.com
Thu Feb 26 12:25:08 EET 2015


revision-id: 8bae7b66a911ad4f275a146fe8a23c8fa3e8d387
parent(s): da181fee4ec849985b15a758c6b26058a0f5e318
committer: Oleksandr Byelkin
branch nick: server
timestamp: 2015-02-26 11:23:30 +0100
message:

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
 .../rpl/r/rpl_set_statement_default_master.result  | 14 +++++
 .../rpl/t/rpl_set_statement_default_master.test    | 26 +++++++++
 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, 112 insertions(+), 10 deletions(-)

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 0000000..4c96c31
--- /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 e45ae36..561c30d 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 0000000..e69de29
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 0000000..7398780
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result
@@ -0,0 +1,14 @@
+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;
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 0000000..39309e4
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test
@@ -0,0 +1,26 @@
+--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;
diff --git a/mysql-test/t/set_statement_notembedded.test b/mysql-test/t/set_statement_notembedded.test
index b0021de..7bb8f5e 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 64e016f..bf79f30 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2726,6 +2726,9 @@ static bool do_execute_sp(THD *thd, sp_head *sp)
     }
   }
 
+  if (thd->lex->mi.connection_name.str == NullS)
+      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 8025340..8255306 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -2445,7 +2445,9 @@ optional_connection_name:
           /* empty */
           {
             LEX *lex= thd->lex;
-            lex->mi.connection_name= thd->variables.default_master_connection;
+            lex->mi.connection_name.str= NullS;
+            lex->mi.connection_name.length= 0;
+              //thd->variables.default_master_connection;
           }
         | connection_name;
         ;
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 0dea5a1..74e0c6b 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


More information about the commits mailing list