Commit 9786ccd0 authored by holyfoot/hf@mysql.com/hfmain.(none)'s avatar holyfoot/hf@mysql.com/hfmain.(none)
Browse files

Bug #32624 Error with multi queries in MySQL embedded server 5.1.22.

server status wasn't properly sent to the client after the error
by the embedded server. Wasn't noticed before as one usually stopped
retrieving results after he gets an error.
parent 8c3d5135
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ void embedded_get_error(MYSQL *mysql, MYSQL_DATA *data)
  net->last_errno= ei->last_errno;
  strmake(net->last_error, ei->info, sizeof(net->last_error));
  memcpy(net->sqlstate, ei->sqlstate, sizeof(net->sqlstate));
  mysql->server_status= ei->server_status;
  my_free((gptr) data, MYF(0));
}

@@ -1027,6 +1028,7 @@ void net_send_error_packet(THD *thd, uint sql_errno, const char *err)
  ei->last_errno= sql_errno;
  strmake(ei->info, err, sizeof(ei->info)-1);
  strmov(ei->sqlstate, mysql_errno_to_sqlstate(sql_errno));
  ei->server_status= thd->server_status;
  thd->cur_data= 0;
}

+3 −2
Original line number Diff line number Diff line
@@ -110,13 +110,14 @@ void net_send_error(THD *thd, uint sql_errno, const char *err)
    push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, sql_errno, err);
  }

  /* Abort multi-result sets */
  thd->server_status&= ~SERVER_MORE_RESULTS_EXISTS;

  net_send_error_packet(thd, sql_errno, err);

  thd->is_fatal_error=0;			// Error message is given
  thd->net.report_error= 0;

  /* Abort multi-result sets */
  thd->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
  DBUG_VOID_RETURN;
}

+14 −0
Original line number Diff line number Diff line
@@ -5643,6 +5643,20 @@ DROP TABLE IF EXISTS test_multi_tab";
  (void) my_process_result_set(result);
  mysql_free_result(result);

  /*
    Check if errors in one of the queries handled properly.
  */
  rc= mysql_query(mysql_local, "select 1; select * from not_existing_table");
  myquery(rc);
  result= mysql_store_result(mysql_local);
  mysql_free_result(result);

  rc= mysql_next_result(mysql_local);
  DIE_UNLESS(rc > 0);

  rc= mysql_next_result(mysql_local);
  DIE_UNLESS(rc < 0);

  mysql_close(mysql_local);
}