From 34df3140f2e5fe3a8531c5f6eb430e2192bfa737 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Wed, 27 Jan 2016 13:57:25 +0400 Subject: MDEV-5273 Prepared statement doesn't return metadata after prepare. SHOW BINARY LOGS fixed. --- sql/sql_prepare.cc | 31 +++++++++++++++++++++++++++++++ sql/sql_repl.cc | 23 +++++++++++++++-------- sql/sql_repl.h | 1 + 3 files changed, 47 insertions(+), 8 deletions(-) (limited to 'sql') diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 7ba269ed131..c67acff32f6 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -104,6 +104,7 @@ When one supplies long data for a placeholder: // mysql_handle_derived #include "sql_cursor.h" #include "sql_show.h" +#include "sql_repl.h" #include "slave.h" #include "sp_head.h" #include "sp.h" @@ -1939,6 +1940,29 @@ static bool mysql_test_show_master_status(Prepared_statement *stmt) } +/** + Validate and prepare for execution SHOW BINLOGS statement. + + @param stmt prepared statement + + @retval + FALSE success + @retval + TRUE error, error message is set in THD +*/ + +static bool mysql_test_show_binlogs(Prepared_statement *stmt) +{ + DBUG_ENTER("mysql_test_show_binlogs"); + THD *thd= stmt->thd; + List fields; + + show_binlogs_get_fields(thd, &fields); + + DBUG_RETURN(send_stmt_metadata(thd, stmt, &fields)); +} + + /** @brief Validate and prepare for execution CREATE VIEW statement @@ -2307,6 +2331,13 @@ static bool check_prepared_statement(Prepared_statement *stmt) DBUG_RETURN(FALSE); } break; + case SQLCOM_SHOW_BINLOGS: + if (!(res= mysql_test_show_binlogs(stmt))) + { + /* Statement and field info has already been sent */ + DBUG_RETURN(FALSE); + } + break; case SQLCOM_CREATE_VIEW: if (lex->create_view_mode == VIEW_ALTER) { diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 3a73237ad4f..19f7e5ab4e6 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -4146,6 +4146,19 @@ bool show_binlog_info(THD* thd) } +void show_binlogs_get_fields(THD *thd, List *field_list) +{ + MEM_ROOT *mem_root= thd->mem_root; + field_list->push_back(new (mem_root) + Item_empty_string(thd, "Log_name", 255), + mem_root); + field_list->push_back(new (mem_root) + Item_return_int(thd, "File_size", 20, + MYSQL_TYPE_LONGLONG), + mem_root); +} + + /** Execute a SHOW BINARY LOGS statement. @@ -4165,7 +4178,6 @@ bool show_binlogs(THD* thd) uint length; int cur_dir_len; Protocol *protocol= thd->protocol; - MEM_ROOT *mem_root= thd->mem_root; DBUG_ENTER("show_binlogs"); if (!mysql_bin_log.is_open()) @@ -4174,13 +4186,8 @@ bool show_binlogs(THD* thd) DBUG_RETURN(TRUE); } - field_list.push_back(new (mem_root) - Item_empty_string(thd, "Log_name", 255), - mem_root); - field_list.push_back(new (mem_root) - Item_return_int(thd, "File_size", 20, - MYSQL_TYPE_LONGLONG), - mem_root); + show_binlogs_get_fields(thd, &field_list); + if (protocol->send_result_set_metadata(&field_list, Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) DBUG_RETURN(TRUE); diff --git a/sql/sql_repl.h b/sql/sql_repl.h index 774e43c0a87..e2000bbca73 100644 --- a/sql/sql_repl.h +++ b/sql/sql_repl.h @@ -52,6 +52,7 @@ bool purge_master_logs(THD* thd, const char* to_log); bool purge_master_logs_before_date(THD* thd, time_t purge_time); bool log_in_use(const char* log_name); void adjust_linfo_offsets(my_off_t purge_offset); +void show_binlogs_get_fields(THD *thd, List *field_list); bool show_binlogs(THD* thd); extern int init_master_info(Master_info* mi); void kill_zombie_dump_threads(uint32 slave_server_id); -- cgit v1.2.1