diff --git a/include/MySQL_Data_Stream.h b/include/MySQL_Data_Stream.h index 2fa068c0c..f0ed5a5a1 100644 --- a/include/MySQL_Data_Stream.h +++ b/include/MySQL_Data_Stream.h @@ -26,10 +26,12 @@ class MyDS_real_query { char *QueryPtr; // pointer to beginning of the query unsigned int QuerySize; // size of the query void init(PtrSize_t *_pkt) { +/* assert(QueryPtr==NULL); assert(QuerySize==0); assert(pkt.ptr==NULL); assert(pkt.size==0); +*/ pkt.ptr=_pkt->ptr; pkt.size=_pkt->size; QueryPtr=(char *)pkt.ptr+5; diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 30acc0edf..ab8158035 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1343,6 +1343,24 @@ bool MySQL_Session::handler_again___verify_backend_autocommit() { } NEXT_IMMEDIATE_NEW(CHANGING_AUTOCOMMIT); } + } else { + if (autocommit == false) { // also IsAutoCommit==false + if (mysql_thread___enforce_autocommit_on_reads == false) { + if (mybe->server_myds->myconn->IsActiveTransaction() == false) { + if (CurrentQuery.is_select_NOT_for_update()==true) { + // client wants autocommit=0 + // enforce_autocommit_on_reads=false + // there is no transaction + // this seems to be the first query, and a SELECT not FOR UPDATE + // we will switch back to autcommit=1 + if (status == PROCESSING_QUERY) { + previous_status.push(PROCESSING_QUERY); + NEXT_IMMEDIATE_NEW(CHANGING_AUTOCOMMIT); + } + } + } + } + } } return false; } @@ -1404,6 +1422,7 @@ bool MySQL_Session::handler_again___status_SETTING_INIT_CONNECT(int *_rc) { int rc=myconn->async_send_simple_command(myds->revents,myconn->options.init_connect,strlen(myconn->options.init_connect)); if (rc==0) { myds->revents|=POLLOUT; // we also set again POLLOUT to send a query immediately! + myds->free_mysql_real_query(); st=previous_status.top(); previous_status.pop(); NEXT_IMMEDIATE_NEW(st); @@ -2019,7 +2038,28 @@ bool MySQL_Session::handler_again___status_CHANGING_AUTOCOMMIT(int *_rc) { if (myds->mypolls==NULL) { thread->mypolls.add(POLLIN|POLLOUT, mybe->server_myds->fd, mybe->server_myds, thread->curtime); } - int rc=myconn->async_set_autocommit(myds->revents, autocommit); + bool ac = autocommit; + if (autocommit == false) { // also IsAutoCommit==false + if (mysql_thread___enforce_autocommit_on_reads == false) { + if (mybe->server_myds->myconn->IsAutoCommit() == false) { + if (mybe->server_myds->myconn->IsActiveTransaction() == false) { + if (CurrentQuery.is_select_NOT_for_update()==true) { + // client wants autocommit=0 + // enforce_autocommit_on_reads=false + // there is no transaction + // this seems to be the first query, and a SELECT not FOR UPDATE + // we will switch back to autcommit=1 + ac = true; + } + } else { + st=previous_status.top(); + previous_status.pop(); + NEXT_IMMEDIATE_NEW(st); + } + } + } + } + int rc=myconn->async_set_autocommit(myds->revents, ac); if (rc==0) { st=previous_status.top(); previous_status.pop(); diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 32452aad7..eee77bfa3 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -4225,33 +4225,7 @@ void MySQL_Threads_Handler::Get_Memory_Stats() { #endif // IDLE_THREADS } pthread_mutex_lock(&thr->thread_mutex); -/* - } - for (i=0;iGet_Memory_Stats(); -/* - } - for (i=0;ithread_mutex); } } @@ -4260,7 +4234,7 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() { const int colnum=14; char port[NI_MAXSERV]; proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 4, "Dumping MySQL Processlist\n"); - SQLite3_result *result=new SQLite3_result(colnum); + SQLite3_result *result=new SQLite3_result(colnum); result->add_column_definition(SQLITE_TEXT,"ThreadID"); result->add_column_definition(SQLITE_TEXT,"SessionID"); result->add_column_definition(SQLITE_TEXT,"user"); @@ -4298,21 +4272,6 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() { } #endif // IDLE_THREADS } -/* - } -#ifdef IDLE_THREADS - for (i=0;i < ( (mysql_thread___session_idle_show_processlist && GloVars.global.idle_threads ) ? num_threads*2 : num_threads); i++) { -#else - for (i=0;i < num_threads; i++) { -#endif // IDLE_THREADS - if (imysql_sessions->len; j++) { MySQL_Session *sess=(MySQL_Session *)thr->mysql_sessions->pdata[j]; @@ -4526,25 +4485,7 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() { free(pta); } } -/* - } -#ifdef IDLE_THREADS - for (i=0;i < ( (mysql_thread___session_idle_show_processlist && GloVars.global.idle_threads ) ? num_threads*2 : num_threads); i++) { -#else - for (i=0;i < num_threads; i++) { -#endif // IDLE_THREADS -*/ - if (ithread_mutex); -#ifdef IDLE_THREADS - } else { - if (mysql_thread___session_idle_show_processlist) { - thr=(MySQL_Thread *)mysql_threads_idles[i-num_threads].worker; - pthread_mutex_unlock(&thr->thread_mutex); - } -#endif // IDLE_THREADS - } + pthread_mutex_unlock(&thr->thread_mutex); } return result; }