mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Bug#19995 (Extreneous table maps generated for statements that do not generate rows):
Switched to writing out table maps for tables that are locked when the first row in a statement is seen. mysql-test/include/master-slave.inc: Moved code to reset master and slave into separate file. mysql-test/r/binlog_row_blackhole.result: Result change mysql-test/r/binlog_row_mix_innodb_myisam.result: Result change mysql-test/r/ndb_binlog_ignore_db.result: Result change mysql-test/r/rpl_ndb_charset.result: Result change mysql-test/r/rpl_row_basic_11bugs.result: Result change mysql-test/r/rpl_row_charset.result: Result change mysql-test/r/rpl_row_create_table.result: Result change mysql-test/t/rpl_row_basic_11bugs.test: Added test to check that no events are generated when no rows are changed. mysql-test/t/rpl_row_create_table.test: Master log position changed sql/handler.cc: Adding function write_locked_table_maps() that will write table maps for all tables locked for write. Using "table->in_use" instead of "current_thd" since tables are now locked when the function is called. Removing old code to write table map. sql/log_event.cc: Added assertion sql/sql_class.cc: Removing code to write "dummy termination event". sql/sql_class.h: Adding getter for binlog_table_maps. sql/sql_insert.cc: Setting thd->lock before calling write_record for the execution of CREATE-SELECT and INSERT-SELECT since they keep multiple locks in the air at the same time. mysql-test/include/master-slave-reset.inc: New BitKeeper file ``mysql-test/include/master-slave-reset.inc''
This commit is contained in:
@ -2152,6 +2152,7 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par,
|
||||
bool ignore_check_option_errors)
|
||||
:table_list(table_list_par), table(table_par), fields(fields_par),
|
||||
last_insert_id(0),
|
||||
lock(0),
|
||||
insert_into_view(table_list_par && table_list_par->view != 0)
|
||||
{
|
||||
bzero((char*) &info,sizeof(info));
|
||||
@ -2348,7 +2349,36 @@ bool select_insert::send_data(List<Item> &values)
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
if (!(error= write_record(thd, table, &info)))
|
||||
|
||||
/*
|
||||
The thd->lock lock contain the locks for the select part of the
|
||||
statement and the 'lock' variable contain the write lock for the
|
||||
currently locked table that is being created or inserted
|
||||
into. However, the row-based replication will investigate the
|
||||
thd->lock to decide what table maps are to be written, so this one
|
||||
has to contain the tables locked for writing. To be able to write
|
||||
table map for the table being created, we temporarily set
|
||||
THD::lock to select_insert::lock while writing the record to the
|
||||
storage engine. We cannot set this elsewhere, since the execution
|
||||
of a stored function inside the select expression might cause the
|
||||
lock structures to be NULL.
|
||||
*/
|
||||
|
||||
{
|
||||
MYSQL_LOCK *saved_lock= NULL;
|
||||
if (lock)
|
||||
{
|
||||
saved_lock= thd->lock;
|
||||
thd->lock= lock;
|
||||
}
|
||||
|
||||
error= write_record(thd, table, &info);
|
||||
|
||||
if (lock)
|
||||
thd->lock= saved_lock;
|
||||
}
|
||||
|
||||
if (!error)
|
||||
{
|
||||
if (table->triggers || info.handle_duplicates == DUP_UPDATE)
|
||||
{
|
||||
|
Reference in New Issue
Block a user