summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libmysql/libmysql.c3
-rw-r--r--sql/sql_prepare.cc18
-rw-r--r--tests/client_test.c5
3 files changed, 17 insertions, 9 deletions
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 6ee2ba438bd..a8a4b2449f3 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -3992,7 +3992,8 @@ my_bool STDCALL mysql_stmt_reset(MYSQL_STMT *stmt)
mysql= stmt->mysql->last_used_con;
int4store(buff, stmt->stmt_id); /* Send stmt id to server */
- if ((*mysql->methods->advanced_command)(mysql, COM_RESET_STMT,buff,MYSQL_STMT_HEADER,0,0,1))
+ if ((*mysql->methods->advanced_command)(mysql, COM_RESET_STMT, buff,
+ MYSQL_STMT_HEADER,0,0,0))
{
set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno,
mysql->net.sqlstate);
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 951f92011ca..61e5b778b64 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -1555,18 +1555,20 @@ set_params_data_err:
/*
- Reset a prepared statement, in case there was an error in send_longdata.
- Note: we don't send any reply to that command.
+ Reset a prepared statement in case there was a recoverable error.
SYNOPSIS
mysql_stmt_reset()
thd Thread handle
packet Packet with stmt id
DESCRIPTION
- This function is useful when one gets an error after calling
- mysql_stmt_getlongdata() and wants to reset the handle
- so that one can call execute again.
- See also bug #1664
+ This function resets statement to the state it was right after prepare.
+ It can be used to:
+ - clear an error happened during mysql_stmt_send_long_data
+ - cancel long data stream for all placeholders without
+ having to call mysql_stmt_execute.
+ Sends 'OK' packet in case of success (statement was reset)
+ or 'ERROR' packet (unrecoverable error/statement not found/etc).
*/
void mysql_stmt_reset(THD *thd, char *packet)
@@ -1577,7 +1579,7 @@ void mysql_stmt_reset(THD *thd, char *packet)
DBUG_ENTER("mysql_stmt_reset");
- if (!(stmt= find_prepared_statement(thd, stmt_id, "reset", DONT_SEND_ERROR)))
+ if (!(stmt= find_prepared_statement(thd, stmt_id, "reset", SEND_ERROR)))
DBUG_VOID_RETURN;
stmt->get_longdata_error= 0;
@@ -1587,6 +1589,8 @@ void mysql_stmt_reset(THD *thd, char *packet)
mysql_stmt_send_long_data() call.
*/
reset_stmt_params(stmt);
+
+ send_ok(thd);
DBUG_VOID_RETURN;
}
diff --git a/tests/client_test.c b/tests/client_test.c
index facb3de70f0..d382377fe49 100644
--- a/tests/client_test.c
+++ b/tests/client_test.c
@@ -163,8 +163,11 @@ MYSQL_STMT *STDCALL
mysql_simple_prepare(MYSQL *mysql, const char *query)
{
MYSQL_STMT *stmt= mysql_stmt_init(mysql);
- if (mysql_stmt_prepare(stmt, query, strlen(query)))
+ if (stmt && mysql_stmt_prepare(stmt, query, strlen(query)))
+ {
+ mysql_stmt_close(stmt);
return 0;
+ }
return stmt;
}