Commit 1d062682 authored by unknown's avatar unknown

Bug #32624 Error with multi queries in MySQL embedded server 5.1.22.

server status wasn't properly sent to the client after the error
by the embedded server. Wasn't noticed before as one usually stopped
retrieving results after he gets an error.


libmysqld/lib_sql.cc:
  Bug #32624 Error with multi queries in MySQL embedded server 5.1.22.
  
  server status transferred to the client after errors
sql/protocol.cc:
  Bug #32624 Error with multi queries in MySQL embedded server 5.1.22.
  
  set server status before net_send_error_packet() call as this
  function sends it to the client in the embedded server
tests/mysql_client_test.c:
  Bug #32624 Error with multi queries in MySQL embedded server 5.1.22.
  
  testcase added
parent 63b65169
...@@ -73,6 +73,7 @@ void embedded_get_error(MYSQL *mysql, MYSQL_DATA *data) ...@@ -73,6 +73,7 @@ void embedded_get_error(MYSQL *mysql, MYSQL_DATA *data)
net->last_errno= ei->last_errno; net->last_errno= ei->last_errno;
strmake(net->last_error, ei->info, sizeof(net->last_error)); strmake(net->last_error, ei->info, sizeof(net->last_error));
memcpy(net->sqlstate, ei->sqlstate, sizeof(net->sqlstate)); memcpy(net->sqlstate, ei->sqlstate, sizeof(net->sqlstate));
mysql->server_status= ei->server_status;
my_free((gptr) data, MYF(0)); my_free((gptr) data, MYF(0));
} }
...@@ -1027,6 +1028,7 @@ void net_send_error_packet(THD *thd, uint sql_errno, const char *err) ...@@ -1027,6 +1028,7 @@ void net_send_error_packet(THD *thd, uint sql_errno, const char *err)
ei->last_errno= sql_errno; ei->last_errno= sql_errno;
strmake(ei->info, err, sizeof(ei->info)-1); strmake(ei->info, err, sizeof(ei->info)-1);
strmov(ei->sqlstate, mysql_errno_to_sqlstate(sql_errno)); strmov(ei->sqlstate, mysql_errno_to_sqlstate(sql_errno));
ei->server_status= thd->server_status;
thd->cur_data= 0; thd->cur_data= 0;
} }
......
...@@ -110,13 +110,14 @@ void net_send_error(THD *thd, uint sql_errno, const char *err) ...@@ -110,13 +110,14 @@ void net_send_error(THD *thd, uint sql_errno, const char *err)
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, sql_errno, err); push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, sql_errno, err);
} }
/* Abort multi-result sets */
thd->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
net_send_error_packet(thd, sql_errno, err); net_send_error_packet(thd, sql_errno, err);
thd->is_fatal_error=0; // Error message is given thd->is_fatal_error=0; // Error message is given
thd->net.report_error= 0; thd->net.report_error= 0;
/* Abort multi-result sets */
thd->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -5643,6 +5643,20 @@ DROP TABLE IF EXISTS test_multi_tab"; ...@@ -5643,6 +5643,20 @@ DROP TABLE IF EXISTS test_multi_tab";
(void) my_process_result_set(result); (void) my_process_result_set(result);
mysql_free_result(result); mysql_free_result(result);
/*
Check if errors in one of the queries handled properly.
*/
rc= mysql_query(mysql_local, "select 1; select * from not_existing_table");
myquery(rc);
result= mysql_store_result(mysql_local);
mysql_free_result(result);
rc= mysql_next_result(mysql_local);
DIE_UNLESS(rc > 0);
rc= mysql_next_result(mysql_local);
DIE_UNLESS(rc < 0);
mysql_close(mysql_local); mysql_close(mysql_local);
} }
......
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