summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mysql.h1
-rw-r--r--include/mysql_com.h1
-rw-r--r--libmysql/libmysql.c23
-rw-r--r--libmysql/libmysql.def1
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/sql_parse.cc5
-rw-r--r--sql/sql_prepare.cc2
7 files changed, 33 insertions, 1 deletions
diff --git a/include/mysql.h b/include/mysql.h
index bd63a10ba45..27d6b03bd0b 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -566,6 +566,7 @@ unsigned long STDCALL mysql_param_count(MYSQL_STMT * stmt);
my_bool STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
my_bool STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt);
my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt);
unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt);
const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt);
diff --git a/include/mysql_com.h b/include/mysql_com.h
index e87001ff27d..5eb59a1c7ab 100644
--- a/include/mysql_com.h
+++ b/include/mysql_com.h
@@ -44,6 +44,7 @@ enum enum_server_command
COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
COM_PREPARE, COM_EXECUTE, COM_LONG_DATA, COM_CLOSE_STMT,
+ COM_RESET_STMT,
COM_END /* Must be last */
};
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 771278c1dbb..1461d2fa128 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -3316,6 +3316,7 @@ mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong row)
}
else
DBUG_PRINT("exit", ("stmt doesn't contain any resultset"));
+ DBUG_VOID_RETURN;
}
@@ -3422,6 +3423,28 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
}
/*
+ Reset the statement buffers in server
+*/
+
+my_bool STDCALL mysql_stmt_reset(MYSQL_STMT *stmt)
+{
+ char buff[MYSQL_STMT_HEADER];
+ MYSQL *mysql;
+ DBUG_ENTER("mysql_stmt_reset");
+ DBUG_ASSERT(stmt != 0);
+
+ mysql= stmt->mysql->last_used_con;
+ int4store(buff, stmt->stmt_id); /* Send stmt id to server */
+ if (advanced_command(mysql, COM_RESET_STMT,buff,MYSQL_STMT_HEADER,0,0,1))
+ {
+ set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno,
+ mysql->net.sqlstate);
+ DBUG_RETURN(1);
+ }
+ DBUG_RETURN(0);
+}
+
+/*
Return statement error code
*/
diff --git a/libmysql/libmysql.def b/libmysql/libmysql.def
index d641ca57274..51869eacc4b 100644
--- a/libmysql/libmysql.def
+++ b/libmysql/libmysql.def
@@ -98,6 +98,7 @@ EXPORTS
mysql_stat
mysql_stmt_affected_rows
mysql_stmt_close
+ mysql_stmt_reset
mysql_stmt_data_seek
mysql_stmt_errno
mysql_stmt_error
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 5ad2cc56b8c..6633912967e 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -557,6 +557,7 @@ void free_prep_stmt(PREP_STMT *stmt, TREE_FREE mode, void *not_used);
bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length);
void mysql_stmt_execute(THD *thd, char *packet);
void mysql_stmt_free(THD *thd, char *packet);
+void mysql_stmt_reset(THD *thd, char *packet);
void mysql_stmt_get_longdata(THD *thd, char *pos, ulong packet_length);
int check_insert_fields(THD *thd,TABLE *table,List<Item> &fields,
List<Item> &values, ulong counter);
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 0db6ce8a642..00917e296ca 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1290,6 +1290,11 @@ restore_user:
mysql_stmt_free(thd, packet);
break;
}
+ case COM_RESET_STMT:
+ {
+ mysql_stmt_reset(thd, packet);
+ break;
+ }
case COM_QUERY:
{
if (alloc_query(thd, packet, packet_length))
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index c38fb44db1c..550e4bbe086 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -965,7 +965,7 @@ void mysql_stmt_reset(THD *thd, char *packet)
PREP_STMT *stmt;
DBUG_ENTER("mysql_stmt_reset");
- if (!(stmt=find_prepared_statement(thd, stmt_id, "close")))
+ if (!(stmt= find_prepared_statement(thd, stmt_id, "reset")))
{
send_error(thd);
DBUG_VOID_RETURN;