Commit 07b1a774 authored by Aleksey Midenkov's avatar Aleksey Midenkov

SQL: Backup_query_start_time RAII

parent 3395ab73
...@@ -3273,7 +3273,7 @@ sp_instr_stmt::execute(THD *thd, uint *nextp) ...@@ -3273,7 +3273,7 @@ sp_instr_stmt::execute(THD *thd, uint *nextp)
int res; int res;
bool save_enable_slow_log; bool save_enable_slow_log;
const CSET_STRING query_backup= thd->query_string; const CSET_STRING query_backup= thd->query_string;
QUERY_START_TIME_INFO time_info; Backup_query_start_time time_info;
Sub_statement_state backup_state; Sub_statement_state backup_state;
DBUG_ENTER("sp_instr_stmt::execute"); DBUG_ENTER("sp_instr_stmt::execute");
DBUG_PRINT("info", ("command: %d", m_lex_keeper.sql_command())); DBUG_PRINT("info", ("command: %d", m_lex_keeper.sql_command()));
...@@ -3289,7 +3289,7 @@ sp_instr_stmt::execute(THD *thd, uint *nextp) ...@@ -3289,7 +3289,7 @@ sp_instr_stmt::execute(THD *thd, uint *nextp)
Save start time info for the CALL statement and overwrite it with the Save start time info for the CALL statement and overwrite it with the
current time for log_slow_statement() to log the individual query timing. current time for log_slow_statement() to log the individual query timing.
*/ */
thd->backup_query_start_time(&time_info); time_info.backup(*thd);
thd->set_time(); thd->set_time();
} }
thd->store_slow_query_state(&backup_state); thd->store_slow_query_state(&backup_state);
...@@ -3355,9 +3355,6 @@ sp_instr_stmt::execute(THD *thd, uint *nextp) ...@@ -3355,9 +3355,6 @@ sp_instr_stmt::execute(THD *thd, uint *nextp)
thd->get_stmt_da()->reset_diagnostics_area(); thd->get_stmt_da()->reset_diagnostics_area();
} }
} }
/* Restore the original query start time */
if (thd->enable_slow_log)
thd->restore_query_start_time(&time_info);
DBUG_RETURN(res || thd->is_error()); DBUG_RETURN(res || thd->is_error());
} }
......
...@@ -2085,14 +2085,36 @@ struct QUERY_START_TIME_INFO ...@@ -2085,14 +2085,36 @@ struct QUERY_START_TIME_INFO
my_time_t start_time; my_time_t start_time;
ulong start_time_sec_part; ulong start_time_sec_part;
ulonglong start_utime, utime_after_lock; ulonglong start_utime, utime_after_lock;
};
class Backup_query_start_time : public QUERY_START_TIME_INFO
{
QUERY_START_TIME_INFO *m_origin;
void backup_query_start_time(QUERY_START_TIME_INFO *backup) public:
Backup_query_start_time() : m_origin(NULL)
{}
Backup_query_start_time(QUERY_START_TIME_INFO &origin)
{ {
*backup= *this; backup(origin);
} }
void restore_query_start_time(QUERY_START_TIME_INFO *backup) ~Backup_query_start_time()
{ {
*this= *backup; restore();
}
void backup(QUERY_START_TIME_INFO &origin)
{
m_origin= &origin;
QUERY_START_TIME_INFO *backup_= this;
*backup_= origin;
}
void restore()
{
if (m_origin)
{
*m_origin= *this;
m_origin= NULL;
}
} }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment