diff options
-rw-r--r-- | libmysql/libmysql.c | 3 | ||||
-rw-r--r-- | sql/sql_prepare.cc | 18 | ||||
-rw-r--r-- | tests/client_test.c | 5 |
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; } |