From 6b47e896c03bc8c2568b767ac4bbe917ac9f414c Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Wed, 13 Aug 2014 15:24:32 +0300 Subject: [PATCH 1/2] Basic test of slave_run_triggers_for_rbr variable added. --- .../r/slave_run_triggers_for_rbr_basic.result | 45 +++++++++++++++++++ .../t/slave_run_triggers_for_rbr_basic.test | 30 +++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 mysql-test/suite/sys_vars/r/slave_run_triggers_for_rbr_basic.result create mode 100644 mysql-test/suite/sys_vars/t/slave_run_triggers_for_rbr_basic.test diff --git a/mysql-test/suite/sys_vars/r/slave_run_triggers_for_rbr_basic.result b/mysql-test/suite/sys_vars/r/slave_run_triggers_for_rbr_basic.result new file mode 100644 index 00000000000..02a3cdf27ce --- /dev/null +++ b/mysql-test/suite/sys_vars/r/slave_run_triggers_for_rbr_basic.result @@ -0,0 +1,45 @@ +SET @old_slave_run_triggers_for_rbr= @@global.slave_run_triggers_for_rbr; +SET @@global.slave_run_triggers_for_rbr= NO; +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +NO +SET @@global.slave_run_triggers_for_rbr= YES; +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +YES +SET @@global.slave_run_triggers_for_rbr= LOGGING; +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +LOGGING +SET @@global.slave_run_triggers_for_rbr= default; +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +NO +SET @@global.slave_run_triggers_for_rbr= 0; +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +NO +SET @@global.slave_run_triggers_for_rbr= 1; +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +YES +SET @@global.slave_run_triggers_for_rbr= 2; +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +LOGGING +SET @@global.slave_run_triggers_for_rbr= 3; +ERROR 42000: Variable 'slave_run_triggers_for_rbr' can't be set to the value of '3' +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +LOGGING +SET @@global.slave_run_triggers_for_rbr= "N"; +ERROR 42000: Variable 'slave_run_triggers_for_rbr' can't be set to the value of 'N' +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +LOGGING +SET @@global.slave_run_triggers_for_rbr= -1; +ERROR 42000: Variable 'slave_run_triggers_for_rbr' can't be set to the value of '-1' +select @@global.slave_run_triggers_for_rbr; +@@global.slave_run_triggers_for_rbr +LOGGING +SET @@global.slave_run_triggers_for_rbr= @old_slave_run_triggers_for_rbr; diff --git a/mysql-test/suite/sys_vars/t/slave_run_triggers_for_rbr_basic.test b/mysql-test/suite/sys_vars/t/slave_run_triggers_for_rbr_basic.test new file mode 100644 index 00000000000..ac5296677b9 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/slave_run_triggers_for_rbr_basic.test @@ -0,0 +1,30 @@ + +-- source include/have_rbr_triggers.inc + +SET @old_slave_run_triggers_for_rbr= @@global.slave_run_triggers_for_rbr; +SET @@global.slave_run_triggers_for_rbr= NO; +select @@global.slave_run_triggers_for_rbr; +SET @@global.slave_run_triggers_for_rbr= YES; +select @@global.slave_run_triggers_for_rbr; +SET @@global.slave_run_triggers_for_rbr= LOGGING; +select @@global.slave_run_triggers_for_rbr; +SET @@global.slave_run_triggers_for_rbr= default; +select @@global.slave_run_triggers_for_rbr; +SET @@global.slave_run_triggers_for_rbr= 0; +select @@global.slave_run_triggers_for_rbr; +SET @@global.slave_run_triggers_for_rbr= 1; +select @@global.slave_run_triggers_for_rbr; +SET @@global.slave_run_triggers_for_rbr= 2; +select @@global.slave_run_triggers_for_rbr; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_run_triggers_for_rbr= 3; +select @@global.slave_run_triggers_for_rbr; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_run_triggers_for_rbr= "N"; +select @@global.slave_run_triggers_for_rbr; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.slave_run_triggers_for_rbr= -1; +select @@global.slave_run_triggers_for_rbr; + + +SET @@global.slave_run_triggers_for_rbr= @old_slave_run_triggers_for_rbr; From 8d3a432f12e5fdfbde3368dc5a859ecc3e42621f Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Wed, 13 Aug 2014 18:06:53 +0400 Subject: [PATCH 2/2] MDEV-6575: main.view --ps-protocol fails in ANALYZE code - After PREPARE is done, save the value of thd->select_number (this is what will be assigned to next select_lex object) - Restore the value at each execution of the prepared statement. --- sql/sql_prepare.cc | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 9ea496a81dc..6b5a3396abe 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -160,6 +160,20 @@ public: uint param_count; uint last_errno; uint flags; + /* + The value of thd->select_number at the end of the PREPARE phase. + + The issue is: each statement execution opens VIEWs, which may cause + select_lex objects to be created, and select_number values to be assigned. + + On the other hand, PREPARE assigns select_number values for triggers and + subqueries. + + In order for select_number values from EXECUTE not to conflict with + select_number values from PREPARE, we keep the number and set it at each + execution. + */ + uint select_number_after_prepare; char last_error[MYSQL_ERRMSG_SIZE]; #ifndef EMBEDDED_LIBRARY bool (*set_params)(Prepared_statement *st, uchar *data, uchar *data_end, @@ -3455,6 +3469,8 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) trans_rollback_implicit(thd); thd->mdl_context.release_transactional_locks(); } + + select_number_after_prepare= thd->select_number; lex_end(lex); cleanup_stmt(); @@ -3581,7 +3597,8 @@ Prepared_statement::execute_loop(String *expanded_query, Reprepare_observer reprepare_observer; bool error; int reprepare_attempt= 0; - + + thd->select_number= select_number_after_prepare; /* Check if we got an error when sending long data */ if (state == Query_arena::STMT_ERROR) {