summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mysql.h1
-rw-r--r--include/sql_common.h1
-rw-r--r--libmysql/libmysql.c4
-rw-r--r--libmysqld/lib_sql.cc22
-rw-r--r--sql-common/client.c7
-rw-r--r--sql/sql_prepare.cc1
6 files changed, 29 insertions, 7 deletions
diff --git a/include/mysql.h b/include/mysql.h
index 0f3fdc90548..b339b839ab3 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -627,6 +627,7 @@ typedef struct st_mysql_methods
MYSQL_RES * (*use_result)(MYSQL *mysql);
void (*fetch_lengths)(unsigned long *to,
MYSQL_ROW column, unsigned int field_count);
+ void (*flush_use_result)(MYSQL *mysql);
#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY)
MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
diff --git a/include/sql_common.h b/include/sql_common.h
index 3f50008a922..cde53786f83 100644
--- a/include/sql_common.h
+++ b/include/sql_common.h
@@ -25,7 +25,6 @@ extern "C" {
MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
my_bool default_value, uint server_capabilities);
void free_rows(MYSQL_DATA *cur);
-void flush_use_result(MYSQL *mysql);
my_bool mysql_autenticate(MYSQL *mysql, const char *passwd);
void free_old_query(MYSQL *mysql);
void end_server(MYSQL *mysql);
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index fc7728c98e0..2b67d645d1a 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -4181,7 +4181,7 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt)
if (mysql->status != MYSQL_STATUS_READY)
{
/* There is a result set and it belongs to this statement */
- flush_use_result(mysql);
+ (*mysql->methods->flush_use_result)(mysql);
mysql->status= MYSQL_STATUS_READY;
}
}
@@ -4231,7 +4231,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
Flush result set of the connection. If it does not belong
to this statement, set a warning.
*/
- flush_use_result(mysql);
+ (*mysql->methods->flush_use_result)(mysql);
if (mysql->unbuffered_fetch_owner)
*mysql->unbuffered_fetch_owner= TRUE;
mysql->status= MYSQL_STATUS_READY;
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index 0adf9aeb86a..e3d68fbb8eb 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -84,6 +84,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
thd->clear_error();
mysql->affected_rows= ~(my_ulonglong) 0;
mysql->field_count= 0;
+ net->last_errno= 0;
thd->store_globals(); // Fix if more than one connect
/*
@@ -107,17 +108,32 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
if (!skip_check)
result= thd->net.last_errno ? -1 : 0;
- embedded_get_error(mysql);
+ if (!mysql->field_count)
+ embedded_get_error(mysql);
mysql->server_status= thd->server_status;
mysql->warning_count= ((THD*)mysql->thd)->total_warn_count;
return result;
}
+static void emb_flush_use_result(MYSQL *mysql)
+{
+ MYSQL_DATA *data= ((THD*)(mysql->thd))->data;
+
+ if (data)
+ {
+ free_rows(data);
+ ((THD*)(mysql->thd))->data= NULL;
+ }
+}
+
static MYSQL_DATA *
emb_read_rows(MYSQL *mysql, MYSQL_FIELD *mysql_fields __attribute__((unused)),
unsigned int fields __attribute__((unused)))
{
MYSQL_DATA *result= ((THD*)mysql->thd)->data;
+ embedded_get_error(mysql);
+ if (mysql->net.last_errno)
+ return NULL;
if (!result)
{
if (!(result=(MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA),
@@ -227,6 +243,9 @@ int emb_read_binary_rows(MYSQL_STMT *stmt)
int emb_unbuffered_fetch(MYSQL *mysql, char **row)
{
MYSQL_DATA *data= ((THD*)mysql->thd)->data;
+ embedded_get_error(mysql);
+ if (mysql->net.last_errno)
+ return mysql->net.last_errno;
if (!data || !data->data)
{
*row= NULL;
@@ -293,6 +312,7 @@ MYSQL_METHODS embedded_methods=
emb_read_rows,
emb_mysql_store_result,
emb_fetch_lengths,
+ emb_flush_use_result,
emb_list_fields,
emb_read_prepare_result,
emb_stmt_execute,
diff --git a/sql-common/client.c b/sql-common/client.c
index 738904657cc..3046395f7d2 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -723,7 +723,7 @@ void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate)
Flush result set sent from server
*/
-void flush_use_result(MYSQL *mysql)
+static void cli_flush_use_result(MYSQL *mysql)
{
/* Clear the current execution status */
DBUG_PRINT("warning",("Not all packets read, clearing them"));
@@ -842,7 +842,7 @@ mysql_free_result(MYSQL_RES *result)
mysql->unbuffered_fetch_owner= 0;
if (mysql->status == MYSQL_STATUS_USE_RESULT)
{
- flush_use_result(mysql);
+ (*mysql->methods->flush_use_result)(mysql);
mysql->status=MYSQL_STATUS_READY;
}
}
@@ -1493,7 +1493,8 @@ static MYSQL_METHODS client_methods=
cli_advanced_command,
cli_read_rows,
cli_use_result,
- cli_fetch_lengths
+ cli_fetch_lengths,
+ cli_flush_use_result
#ifndef MYSQL_SERVER
,cli_list_fields,
cli_read_prepare_result,
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 4305bee42a2..47cc461fac0 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -696,6 +696,7 @@ static bool emb_insert_params(Prepared_statement *stmt, String *expanded_query)
else
{
uchar *buff= (uchar*) client_param->buffer;
+ param->unsigned_flag= client_param->is_unsigned;
param->set_param_func(param, &buff,
client_param->length ?
*client_param->length :