From: Mayank Prasad Date: May 18 2011 2:42pm Subject: bzr push into mysql-5.5 branch (mayank.prasad:3386 to 3387) Bug#11764633 List-Archive: http://lists.mysql.com/commits/137568 X-Bug: 11764633 Message-Id: <201105181443.p4IEh4a2003702@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3387 Mayank Prasad 2011-05-18 merge from 5.1 for bug#11764633 modified: libmysqld/lib_sql.cc sql/mysqld.h sql/sql_class.cc sql/sql_class.h 3386 Sergey Glukhov 2011-05-18 [merge] 5.1 -> 5.5 merge @ mysql-test/r/func_time.result 5.1 -> 5.5 merge @ mysql-test/t/func_time.test 5.1 -> 5.5 merge @ sql/item_timefunc.cc 5.1 -> 5.5 merge modified: mysql-test/r/func_time.result mysql-test/t/func_time.test sql/item_timefunc.cc === modified file 'libmysqld/lib_sql.cc' --- a/libmysqld/lib_sql.cc 2010-11-04 10:00:59 +0000 +++ b/libmysqld/lib_sql.cc 2011-05-18 14:17:29 +0000 @@ -50,6 +50,23 @@ extern "C" void unireg_clear(int exit_co 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 @@ -106,7 +123,8 @@ emb_advanced_command(MYSQL *mysql, enum if (mysql->status != MYSQL_STATUS_READY) { set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate); - return 1; + result= 1; + goto end; } /* Clear result variables */ @@ -147,6 +165,9 @@ emb_advanced_command(MYSQL *mysql, enum #if defined(ENABLED_PROFILING) thd->profiling.finish_current_query(); #endif + +end: + thd->restore_globals(); return result; } @@ -545,7 +566,10 @@ int init_embedded_server(int argc, char 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; #ifndef NO_EMBEDDED_ACCESS_CHECKS === modified file 'sql/mysqld.h' --- a/sql/mysqld.h 2011-04-22 06:56:56 +0000 +++ b/sql/mysqld.h 2011-05-18 14:17:29 +0000 @@ -216,6 +216,10 @@ extern char err_shared_dir[]; extern TYPELIB thread_handling_typelib; 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); #ifdef HAVE_PSI_INTERFACE @@ -503,6 +507,10 @@ get_thread_running() extern "C" THD *_current_thd_noinline(); #define _current_thd() _current_thd_noinline() #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); inline THD *_current_thd(void) { === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2011-04-21 05:34:21 +0000 +++ b/sql/sql_class.cc 2011-05-18 14:17:29 +0000 @@ -1354,6 +1354,25 @@ bool THD::store_globals() 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. === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2011-05-06 11:39:40 +0000 +++ b/sql/sql_class.h 2011-05-18 14:17:29 +0000 @@ -2199,6 +2199,7 @@ public: void cleanup(void); void cleanup_after_query(); bool store_globals(); + bool restore_globals(); #ifdef SIGNAL_WITH_VIO_CLOSE inline void set_active_vio(Vio* vio) { No bundle (reason: useless for push emails).