mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Write binlog before commit when doing INSERT ... SELECT
mysql-test/r/create.result: After merge fix sql/sql_insert.cc: Write binlog before commit sql/sql_update.cc: Added comment
This commit is contained in:
@ -58,6 +58,13 @@ a$1 $b c$
|
|||||||
create table test_$1.test2$ (a int);
|
create table test_$1.test2$ (a int);
|
||||||
drop table test_$1.test2$;
|
drop table test_$1.test2$;
|
||||||
drop database test_$1;
|
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));
|
create table t1 (a int auto_increment not null primary key, B CHAR(20));
|
||||||
insert into t1 (b) values ("hello"),("my"),("world");
|
insert into t1 (b) values ("hello"),("my"),("world");
|
||||||
create table t2 (key (b)) select * from t1;
|
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)))
|
if (!(error=table->file->extra(HA_EXTRA_NO_CACHE)))
|
||||||
error=table->file->activate_all_index(thd);
|
error=table->file->activate_all_index(thd);
|
||||||
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
|
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)
|
if ((error2=ha_autocommit_or_rollback(thd,error)) && ! error)
|
||||||
error=error2;
|
error=error2;
|
||||||
if (info.copied || info.deleted)
|
if (info.copied || info.deleted)
|
||||||
@ -1386,12 +1394,6 @@ bool select_insert::send_eof()
|
|||||||
thd->insert_id(last_insert_id); // For update log
|
thd->insert_id(last_insert_id); // For update log
|
||||||
::send_ok(&thd->net,info.copied,last_insert_id,buff);
|
::send_ok(&thd->net,info.copied,last_insert_id,buff);
|
||||||
mysql_update_log.write(thd,thd->query,thd->query_length);
|
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;
|
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)
|
for (cur_table= update_tables; cur_table ; cur_table= cur_table->next)
|
||||||
{
|
{
|
||||||
TABLE *table= cur_table->table;
|
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))
|
if (table->status & (STATUS_NULL_ROW | STATUS_UPDATED))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user