mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
merge from 5.1 for bug#11764633
This commit is contained in:
@ -50,6 +50,23 @@ extern "C" void unireg_clear(int exit_code)
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wrapper error handler for embedded server to call client/server error
|
||||||
|
handler based on whether thread is in client/server context
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void embedded_error_handler(uint error, const char *str, myf MyFlags)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("embedded_error_handler");
|
||||||
|
|
||||||
|
/*
|
||||||
|
If current_thd is NULL, it means restore_global has been called and
|
||||||
|
thread is in client context, then call client error handler else call
|
||||||
|
server error handler.
|
||||||
|
*/
|
||||||
|
DBUG_RETURN(current_thd ? my_message_sql(error, str, MyFlags):
|
||||||
|
my_message_stderr(error, str, MyFlags));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Reads error information from the MYSQL_DATA and puts
|
Reads error information from the MYSQL_DATA and puts
|
||||||
@ -106,7 +123,8 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
|||||||
if (mysql->status != MYSQL_STATUS_READY)
|
if (mysql->status != MYSQL_STATUS_READY)
|
||||||
{
|
{
|
||||||
set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
|
set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
|
||||||
return 1;
|
result= 1;
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear result variables */
|
/* Clear result variables */
|
||||||
@ -147,6 +165,9 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
|||||||
#if defined(ENABLED_PROFILING)
|
#if defined(ENABLED_PROFILING)
|
||||||
thd->profiling.finish_current_query();
|
thd->profiling.finish_current_query();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
end:
|
||||||
|
thd->restore_globals();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -545,7 +566,10 @@ int init_embedded_server(int argc, char **argv, char **groups)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_handler_hook = my_message_sql;
|
/*
|
||||||
|
set error_handler_hook to embedded_error_handler wrapper.
|
||||||
|
*/
|
||||||
|
error_handler_hook= embedded_error_handler;
|
||||||
|
|
||||||
acl_error= 0;
|
acl_error= 0;
|
||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
|
@ -216,6 +216,10 @@ extern char err_shared_dir[];
|
|||||||
extern TYPELIB thread_handling_typelib;
|
extern TYPELIB thread_handling_typelib;
|
||||||
extern my_decimal decimal_zero;
|
extern my_decimal decimal_zero;
|
||||||
|
|
||||||
|
/*
|
||||||
|
THR_MALLOC is a key which will be used to set/get MEM_ROOT** for a thread,
|
||||||
|
using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr().
|
||||||
|
*/
|
||||||
extern pthread_key(MEM_ROOT**,THR_MALLOC);
|
extern pthread_key(MEM_ROOT**,THR_MALLOC);
|
||||||
|
|
||||||
#ifdef HAVE_PSI_INTERFACE
|
#ifdef HAVE_PSI_INTERFACE
|
||||||
@ -503,6 +507,10 @@ get_thread_running()
|
|||||||
extern "C" THD *_current_thd_noinline();
|
extern "C" THD *_current_thd_noinline();
|
||||||
#define _current_thd() _current_thd_noinline()
|
#define _current_thd() _current_thd_noinline()
|
||||||
#else
|
#else
|
||||||
|
/*
|
||||||
|
THR_THD is a key which will be used to set/get THD* for a thread,
|
||||||
|
using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr().
|
||||||
|
*/
|
||||||
extern pthread_key(THD*, THR_THD);
|
extern pthread_key(THD*, THR_THD);
|
||||||
inline THD *_current_thd(void)
|
inline THD *_current_thd(void)
|
||||||
{
|
{
|
||||||
|
@ -1354,6 +1354,25 @@ bool THD::store_globals()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Remove the thread specific info (THD and mem_root pointer) stored during
|
||||||
|
store_global call for this thread.
|
||||||
|
*/
|
||||||
|
bool THD::restore_globals()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Assert that thread_stack is initialized: it's necessary to be able
|
||||||
|
to track stack overrun.
|
||||||
|
*/
|
||||||
|
DBUG_ASSERT(thread_stack);
|
||||||
|
|
||||||
|
/* Undocking the thread specific data. */
|
||||||
|
my_pthread_setspecific_ptr(THR_THD, NULL);
|
||||||
|
my_pthread_setspecific_ptr(THR_MALLOC, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Cleanup after query.
|
Cleanup after query.
|
||||||
|
@ -2199,6 +2199,7 @@ public:
|
|||||||
void cleanup(void);
|
void cleanup(void);
|
||||||
void cleanup_after_query();
|
void cleanup_after_query();
|
||||||
bool store_globals();
|
bool store_globals();
|
||||||
|
bool restore_globals();
|
||||||
#ifdef SIGNAL_WITH_VIO_CLOSE
|
#ifdef SIGNAL_WITH_VIO_CLOSE
|
||||||
inline void set_active_vio(Vio* vio)
|
inline void set_active_vio(Vio* vio)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user