Commit 0288cc9d authored by evgen@moonbone.local's avatar evgen@moonbone.local

Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-5.0-opt

into  moonbone.local:/work/30384-bug-5.0-opt-mysql
parents fedeec6c da7470af
...@@ -2051,14 +2051,13 @@ class select_insert :public select_result_interceptor { ...@@ -2051,14 +2051,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);
...@@ -2093,6 +2092,7 @@ class select_create: public select_insert { ...@@ -2093,6 +2092,7 @@ class select_create: public select_insert {
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>
......
...@@ -2645,8 +2645,7 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par, ...@@ -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) ...@@ -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) ...@@ -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() ...@@ -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) ...@@ -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 |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment