Below is the list of changes that have just been committed into a local
5.0 repository of evgen. When evgen does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-11-19 20:20:19+00:00, evgen@stripped +4 -0
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.
mysql-test/r/insert_select.result@stripped, 2007-11-19 20:19:59+00:00, evgen@stripped
+5 -0
Additional test case for the bug#30384.
mysql-test/t/insert_select.test@stripped, 2007-11-19 20:19:34+00:00, evgen@stripped +3
-0
Additional test case for the bug#30384.
sql/sql_class.h@stripped, 2007-11-19 20:20:06+00:00, evgen@stripped +2 -2
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 preparetions are done by the select_create::prepare function
it doesn't do anything.
The is_bulk_insert_mode flag is removed as it is not needed anymore.
sql/sql_insert.cc@stripped, 2007-11-19 20:20:04+00:00, evgen@stripped +5 -13
Bug#30384: Having SQL_BUFFER_RESULT option in the CREATE .. KEY(..) .. SELECT
led to creating corrupted index. 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.
Corrected fix. The is_bulk_insert_mode flag is removed as it is not needed
anymore.
diff -Nrup a/mysql-test/r/insert_select.result b/mysql-test/r/insert_select.result
--- a/mysql-test/r/insert_select.result 2007-09-21 08:05:56 +00:00
+++ b/mysql-test/r/insert_select.result 2007-11-19 20:19:59 +00:00
@@ -840,5 +840,10 @@ create table t2 (key(f1)) engine=myisam
check table t2 extended;
Table Op Msg_type Msg_text
test.t2 check status OK
+create table t3(f1 int, key(f1));
+insert into t3 select sql_buffer_result f1 from t1;
+check table t3 extended;
+Table Op Msg_type Msg_text
+test.t3 check status OK
drop table t1,t2;
##################################################################
diff -Nrup a/mysql-test/t/insert_select.test b/mysql-test/t/insert_select.test
--- a/mysql-test/t/insert_select.test 2007-09-21 08:05:22 +00:00
+++ b/mysql-test/t/insert_select.test 2007-11-19 20:19:34 +00:00
@@ -394,6 +394,9 @@ create table t1(f1 int);
insert into t1 values(1),(2),(3);
create table t2 (key(f1)) engine=myisam select sql_buffer_result f1 from t1;
check table t2 extended;
+create table t3(f1 int, key(f1));
+insert into t3 select sql_buffer_result f1 from t1;
+check table t3 extended;
drop table t1,t2;
--echo ##################################################################
diff -Nrup a/sql/sql_class.h b/sql/sql_class.h
--- a/sql/sql_class.h 2007-09-21 08:06:30 +00:00
+++ b/sql/sql_class.h 2007-11-19 20:20:06 +00:00
@@ -2029,14 +2029,13 @@ class select_insert :public select_resul
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 @@ public:
void send_error(uint errcode,const char *err);
bool send_eof();
void abort();
+ int prepare2(void) { return 0; }
};
#include <myisam.h>
diff -Nrup a/sql/sql_insert.cc b/sql/sql_insert.cc
--- a/sql/sql_insert.cc 2007-09-27 09:17:13 +00:00
+++ b/sql/sql_insert.cc 2007-11-19 20:20:04 +00:00
@@ -2645,8 +2645,7 @@ select_insert::select_insert(TABLE_LIST
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> &value
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> &value
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 |
| Thread |
|---|
| • bk commit into 5.0 tree (evgen:1.2549) BUG#30384 | eugene | 19 Nov |