mirror of
https://github.com/MariaDB/server.git
synced 2025-07-10 04:22:00 +03:00
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.
This commit is contained in:
@ -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)
|
|||||||
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)
|
|||||||
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";
|
|||||||
(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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user