Commit da7470af authored by evgen@moonbone.local's avatar evgen@moonbone.local
Browse files

Bug#30384: Having SQL_BUFFER_RESULT option in the CREATE .. KEY(..) .. SELECT

led to creating corrupted index.

Corrected fix. The new method called prepare2 is added to the select_create
class. As all preparations are done by the select_create::prepare function
it doesn't do anything. Slightly changed algorithm of calling the 
start_bulk_insert function. Now it's called from the select_insert::prepare2
function when the SQL_BUFFER_RESULT flags is set.
The is_bulk_insert_mode flag is removed as it is not needed anymore.
parent 7ca65155
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2029,14 +2029,13 @@ class select_insert :public select_result_interceptor {
  ulonglong last_insert_id;
  COPY_INFO info;
  bool insert_into_view;
  bool is_bulk_insert_mode;
  select_insert(TABLE_LIST *table_list_par,
		TABLE *table_par, List<Item> *fields_par,
		List<Item> *update_fields, List<Item> *update_values,
		enum_duplicates duplic, bool ignore);
  ~select_insert();
  int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
  int prepare2(void);
  virtual int prepare2(void);
  bool send_data(List<Item> &items);
  virtual void store_values(List<Item> &values);
  void send_error(uint errcode,const char *err);
@@ -2071,6 +2070,7 @@ class select_create: public select_insert {
  void send_error(uint errcode,const char *err);
  bool send_eof();
  void abort();
  int prepare2(void) { return 0; }
};

#include <myisam.h>
+5 −13
Original line number Diff line number Diff line
@@ -2645,8 +2645,7 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par,
                             bool ignore_check_option_errors)
  :table_list(table_list_par), table(table_par), fields(fields_par),
   last_insert_id(0),
   insert_into_view(table_list_par && table_list_par->view != 0),
   is_bulk_insert_mode(FALSE)
   insert_into_view(table_list_par && table_list_par->view != 0)
{
  bzero((char*) &info,sizeof(info));
  info.handle_duplicates= duplic;
@@ -2755,14 +2754,14 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
    Is table which we are changing used somewhere in other parts of
    query
  */
  if (!(lex->current_select->options & OPTION_BUFFER_RESULT) &&
      unique_table(thd, table_list, table_list->next_global, 0))
  if (unique_table(thd, table_list, table_list->next_global, 0))
  {
    /* Using same table for INSERT and SELECT */
    lex->current_select->options|= OPTION_BUFFER_RESULT;
    lex->current_select->join->select_options|= OPTION_BUFFER_RESULT;
  }
  else if (!thd->prelocked_mode)
  else if (!(lex->current_select->options & OPTION_BUFFER_RESULT) &&
           !thd->prelocked_mode)
  {
    /*
      We must not yet prepare the result table if it is the same as one of the 
@@ -2831,11 +2830,8 @@ int select_insert::prepare2(void)
{
  DBUG_ENTER("select_insert::prepare2");
  if (thd->lex->current_select->options & OPTION_BUFFER_RESULT &&
      !thd->prelocked_mode && !is_bulk_insert_mode)
  {
      !thd->prelocked_mode)
    table->file->start_bulk_insert((ha_rows) 0);
    is_bulk_insert_mode= TRUE;
  }
  DBUG_RETURN(0);
}

@@ -2941,7 +2937,6 @@ bool select_insert::send_eof()
  DBUG_ENTER("select_insert::send_eof");

  error= (!thd->prelocked_mode) ? table->file->end_bulk_insert():0;
  is_bulk_insert_mode= FALSE;
  table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
  table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);

@@ -3277,10 +3272,7 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
  if (info.handle_duplicates == DUP_UPDATE)
    table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
  if (!thd->prelocked_mode)
  {
    table->file->start_bulk_insert((ha_rows) 0);
    is_bulk_insert_mode= TRUE;
  }
  thd->abort_on_warning= (!info.ignore &&
                          (thd->variables.sql_mode &
                           (MODE_STRICT_TRANS_TABLES |