Write binlog before commit when doing INSERT ... SELECT
This commit is contained in:
parent
968e9a73d4
commit
b879a40120
@ -58,6 +58,13 @@ a$1 $b c$
|
||||
create table test_$1.test2$ (a int);
|
||||
drop table test_$1.test2$;
|
||||
drop database test_$1;
|
||||
create table `` (a int);
|
||||
Incorrect table name ''
|
||||
drop table if exists ``;
|
||||
Incorrect table name ''
|
||||
create table t1 (`` int);
|
||||
Incorrect column name ''
|
||||
drop table if exists t1;
|
||||
create table t1 (a int auto_increment not null primary key, B CHAR(20));
|
||||
insert into t1 (b) values ("hello"),("my"),("world");
|
||||
create table t2 (key (b)) select * from t1;
|
||||
|
@ -1361,6 +1361,14 @@ bool select_insert::send_eof()
|
||||
if (!(error=table->file->extra(HA_EXTRA_NO_CACHE)))
|
||||
error=table->file->activate_all_index(thd);
|
||||
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
|
||||
|
||||
/* Write to binlog before commiting transaction */
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
||||
table->file->has_transactions());
|
||||
mysql_bin_log.write(&qinfo);
|
||||
}
|
||||
if ((error2=ha_autocommit_or_rollback(thd,error)) && ! error)
|
||||
error=error2;
|
||||
if (info.copied || info.deleted)
|
||||
@ -1386,12 +1394,6 @@ bool select_insert::send_eof()
|
||||
thd->insert_id(last_insert_id); // For update log
|
||||
::send_ok(&thd->net,info.copied,last_insert_id,buff);
|
||||
mysql_update_log.write(thd,thd->query,thd->query_length);
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
||||
table->file->has_transactions());
|
||||
mysql_bin_log.write(&qinfo);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -618,7 +618,18 @@ bool multi_update::send_data(List<Item> ¬_used_values)
|
||||
for (cur_table= update_tables; cur_table ; cur_table= cur_table->next)
|
||||
{
|
||||
TABLE *table= cur_table->table;
|
||||
/* Check if we are using outer join and we didn't find the row */
|
||||
/*
|
||||
Check if we are using outer join and we didn't find the row
|
||||
or if we have already updated this row in the previous call to this
|
||||
function.
|
||||
|
||||
The same row may be presented here several times in a join of type
|
||||
UPDATE t1 FROM t1,t2 SET t1.a=t2.a
|
||||
|
||||
In this case we will do the update for the first found row combination.
|
||||
The join algorithm guarantees that we will not find the a row in
|
||||
t1 several times.
|
||||
*/
|
||||
if (table->status & (STATUS_NULL_ROW | STATUS_UPDATED))
|
||||
continue;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user