summaryrefslogtreecommitdiff
path: root/libmysql
diff options
context:
space:
mode:
authorunknown <venu@myvenu.com>2003-01-31 15:20:03 -0800
committerunknown <venu@myvenu.com>2003-01-31 15:20:03 -0800
commitb58dd39b9923cfe0bb30cdc3d1c533ea1976c278 (patch)
tree21ebf7cfb3e79c1294c13f21efc10b790ab0e44a /libmysql
parent28f3c41f498a72c67c44c02c5bc7899b89a7ecb4 (diff)
downloadmariadb-git-b58dd39b9923cfe0bb30cdc3d1c533ea1976c278.tar.gz
Force to read all unread packets on stmt_close
tests/client_test.c: tests for un cleared packets
Diffstat (limited to 'libmysql')
-rw-r--r--libmysql/libmysql.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 28a35da4f72..932bc276814 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -5340,22 +5340,42 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
*/
static my_bool stmt_close(MYSQL_STMT *stmt, my_bool skip_list)
{
+ MYSQL *mysql;
my_bool error= 0;
DBUG_ENTER("mysql_stmt_close");
DBUG_ASSERT(stmt != 0);
+
+ mysql= stmt->mysql;
+ if (mysql->status != MYSQL_STATUS_READY)
+ {
+ /* Clear the current execution status */
+ DBUG_PRINT("warning",("Not all packets read, clearing them"));
+ for (;;)
+ {
+ ulong pkt_len;
+ if ((pkt_len= net_safe_read(mysql)) == packet_error)
+ break;
+ if (pkt_len <= 8 && mysql->net.read_pos[0] == 254)
+ break;
+ }
+ mysql->status= MYSQL_STATUS_READY;
+ }
if (stmt->state == MY_ST_PREPARE || stmt->state == MY_ST_EXECUTE)
{
char buff[4];
int4store(buff, stmt->stmt_id);
- error= simple_command(stmt->mysql, COM_CLOSE_STMT, buff, 4, 1);
+ error= simple_command(mysql, COM_CLOSE_STMT, buff, 4, 1);
+ }
+ if (!error)
+ {
+ mysql_free_result(stmt->result);
+ free_root(&stmt->mem_root, MYF(0));
+ if (!skip_list)
+ mysql->stmts= list_delete(mysql->stmts, &stmt->list);
+ mysql->status= MYSQL_STATUS_READY;
+ my_free((gptr) stmt, MYF(MY_WME));
}
- mysql_free_result(stmt->result);
- free_root(&stmt->mem_root, MYF(0));
- if (!skip_list)
- stmt->mysql->stmts= list_delete(stmt->mysql->stmts, &stmt->list);
- stmt->mysql->status= MYSQL_STATUS_READY;
- my_free((gptr) stmt, MYF(MY_WME));
DBUG_RETURN(error);
}