1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

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.
This commit is contained in:
evgen@moonbone.local
2007-11-19 21:05:17 +00:00
parent 7ca65155ad
commit da7470afb1
2 changed files with 7 additions and 15 deletions

View File

@@ -2029,14 +2029,13 @@ class select_insert :public select_result_interceptor {
ulonglong last_insert_id; ulonglong last_insert_id;
COPY_INFO info; COPY_INFO info;
bool insert_into_view; bool insert_into_view;
bool is_bulk_insert_mode;
select_insert(TABLE_LIST *table_list_par, select_insert(TABLE_LIST *table_list_par,
TABLE *table_par, List<Item> *fields_par, TABLE *table_par, List<Item> *fields_par,
List<Item> *update_fields, List<Item> *update_values, List<Item> *update_fields, List<Item> *update_values,
enum_duplicates duplic, bool ignore); enum_duplicates duplic, bool ignore);
~select_insert(); ~select_insert();
int prepare(List<Item> &list, SELECT_LEX_UNIT *u); int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
int prepare2(void); virtual int prepare2(void);
bool send_data(List<Item> &items); bool send_data(List<Item> &items);
virtual void store_values(List<Item> &values); virtual void store_values(List<Item> &values);
void send_error(uint errcode,const char *err); void send_error(uint errcode,const char *err);
@@ -2071,6 +2070,7 @@ public:
void send_error(uint errcode,const char *err); void send_error(uint errcode,const char *err);
bool send_eof(); bool send_eof();
void abort(); void abort();
int prepare2(void) { return 0; }
}; };
#include <myisam.h> #include <myisam.h>

View File

@@ -2645,8 +2645,7 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par,
bool ignore_check_option_errors) bool ignore_check_option_errors)
:table_list(table_list_par), table(table_par), fields(fields_par), :table_list(table_list_par), table(table_par), fields(fields_par),
last_insert_id(0), last_insert_id(0),
insert_into_view(table_list_par && table_list_par->view != 0), insert_into_view(table_list_par && table_list_par->view != 0)
is_bulk_insert_mode(FALSE)
{ {
bzero((char*) &info,sizeof(info)); bzero((char*) &info,sizeof(info));
info.handle_duplicates= duplic; 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 Is table which we are changing used somewhere in other parts of
query query
*/ */
if (!(lex->current_select->options & OPTION_BUFFER_RESULT) && if (unique_table(thd, table_list, table_list->next_global, 0))
unique_table(thd, table_list, table_list->next_global, 0))
{ {
/* Using same table for INSERT and SELECT */ /* Using same table for INSERT and SELECT */
lex->current_select->options|= OPTION_BUFFER_RESULT; lex->current_select->options|= OPTION_BUFFER_RESULT;
lex->current_select->join->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 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"); DBUG_ENTER("select_insert::prepare2");
if (thd->lex->current_select->options & OPTION_BUFFER_RESULT && 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); table->file->start_bulk_insert((ha_rows) 0);
is_bulk_insert_mode= TRUE;
}
DBUG_RETURN(0); DBUG_RETURN(0);
} }
@@ -2941,7 +2937,6 @@ bool select_insert::send_eof()
DBUG_ENTER("select_insert::send_eof"); DBUG_ENTER("select_insert::send_eof");
error= (!thd->prelocked_mode) ? table->file->end_bulk_insert():0; 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_NO_IGNORE_DUP_KEY);
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE); 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) if (info.handle_duplicates == DUP_UPDATE)
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE); table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
if (!thd->prelocked_mode) if (!thd->prelocked_mode)
{
table->file->start_bulk_insert((ha_rows) 0); table->file->start_bulk_insert((ha_rows) 0);
is_bulk_insert_mode= TRUE;
}
thd->abort_on_warning= (!info.ignore && thd->abort_on_warning= (!info.ignore &&
(thd->variables.sql_mode & (thd->variables.sql_mode &
(MODE_STRICT_TRANS_TABLES | (MODE_STRICT_TRANS_TABLES |