Commit 2cd7e4cd authored by unknown's avatar unknown
Browse files

Fixes for bugs in embedded library:

#4700 (Unsigned value returned as signed)
    just no appropriate checking
#4701 (Errors returned earlier than expected)
    all errors returned from send_command()
#4702 (Result isn't freed properly if there's no retrieval)
    flush_use_result has only 'client' version and should
    be made 'virtual'


include/mysql.h:
  flush_use_result 'virtual' method added to MYSQL (#4701)
include/sql_common.h:
  no flush_use_result() now (#4702)
libmysql/libmysql.c:
  call of the flush_use_result changed (#4702)
libmysqld/lib_sql.cc:
  now errors returned from emb_advanced_command() or from emb_read_rows()
  depending on if number of returned fields is not 0 (#4701)
  emb_flush_use_result() implementation (#4702)
sql-common/client.c:
  cli_flush_use_result() implementation (#4702)
sql/sql_prepare.cc:
  unsigned flag now checked (#4700)
parent be922a58
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+0 −1
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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;
+21 −1
Original line number Diff line number Diff line
@@ -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;

  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,
+4 −3
Original line number Diff line number Diff line
@@ -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,
Loading