From: Mayank Prasad Date: May 18 2011 2:43pm Subject: bzr push into mysql-trunk branch (mayank.prasad:3100 to 3101) Bug#11764633 List-Archive: http://lists.mysql.com/commits/137578 X-Bug: 11764633 Message-Id: <201105181443.p4IEhvjT002209@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3101 Mayank Prasad 2011-05-18 [merge] merge from 5.5 for bug#11764633 modified: client/mysql.cc libmysqld/lib_sql.cc sql/mysqld.h sql/sql_class.cc sql/sql_class.h 3100 Tor Didriksen 2011-05-18 [merge] Automerge opt-team => trunk modified: mysql-test/include/mrr_tests.inc mysql-test/include/subquery.inc mysql-test/r/func_in_all.result mysql-test/r/innodb_mrr.result mysql-test/r/innodb_mrr_all.result mysql-test/r/innodb_mrr_cost.result mysql-test/r/innodb_mrr_cost_all.result mysql-test/r/innodb_mrr_cost_icp.result mysql-test/r/innodb_mrr_icp.result mysql-test/r/innodb_mrr_none.result mysql-test/r/myisam_mrr.result mysql-test/r/myisam_mrr_all.result mysql-test/r/myisam_mrr_cost.result mysql-test/r/myisam_mrr_cost_all.result mysql-test/r/myisam_mrr_cost_icp.result mysql-test/r/myisam_mrr_icp.result mysql-test/r/myisam_mrr_none.result mysql-test/r/subquery_all.result mysql-test/r/subquery_all_jcl6.result mysql-test/r/subquery_nomat_nosj.result mysql-test/r/subquery_nomat_nosj_jcl6.result mysql-test/r/subquery_none.result mysql-test/r/subquery_none_jcl6.result sql/filesort.cc sql/filesort_utils.cc sql/ha_ndbcluster.cc sql/handler.cc sql/item_cmpfunc.cc sql/item_func.h sql/opt_range.cc sql/sql_const.h sql/sql_select.cc sql/uniques.cc === modified file 'client/mysql.cc' --- a/client/mysql.cc 2011-05-06 08:26:00 +0000 +++ b/client/mysql.cc 2011-05-18 14:36:45 +0000 @@ -3764,8 +3764,6 @@ com_tee(String *buffer __attribute__((un { char file_name[FN_REFLEN], *end, *param; - if (status.batch) - return 0; while (my_isspace(charset_info,*line)) line++; if (!(param = strchr(line, ' '))) // if outfile wasn't given, use the default === modified file 'libmysqld/lib_sql.cc' --- a/libmysqld/lib_sql.cc 2011-03-09 20:54:55 +0000 +++ b/libmysqld/lib_sql.cc 2011-05-18 14:36:45 +0000 @@ -50,6 +50,24 @@ 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 +124,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 +166,9 @@ emb_advanced_command(MYSQL *mysql, enum #if defined(ENABLED_PROFILING) thd->profiling.finish_current_query(); #endif + +end: + thd->restore_globals(); return result; } @@ -555,7 +577,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-05-13 13:59:55 +0000 +++ b/sql/mysqld.h 2011-05-18 14:36:45 +0000 @@ -231,6 +231,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 @@ -632,6 +636,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-05-12 17:29:19 +0000 +++ b/sql/sql_class.cc 2011-05-18 14:36:45 +0000 @@ -1382,6 +1382,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-12 17:29:19 +0000 +++ b/sql/sql_class.h 2011-05-18 14:36:45 +0000 @@ -2521,6 +2521,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).