mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Bug #13004581 BLACKHOLE BINARY LOG WITH ROW IGNORES UPDATE AND DELETE STATEMENTS
When logging to the binary log in row, updates and deletes to a BLACKHOLE engine table are skipped. It is impossible to log binary log in row format for updates and deletes to a BLACKHOLE engine table, as no row events can be generated in these cases. After fix, generate a warning for UPDATE/DELETE statements that modify a BLACKHOLE table, as row events are not logged in row format.
This commit is contained in:
0
sql-bench/example.bat
Normal file → Executable file
0
sql-bench/example.bat
Normal file → Executable file
0
sql-bench/pwd.bat
Normal file → Executable file
0
sql-bench/pwd.bat
Normal file → Executable file
0
sql-bench/uname.bat
Normal file → Executable file
0
sql-bench/uname.bat
Normal file → Executable file
@@ -6506,6 +6506,8 @@ ER_UNSUPPORTED_ENGINE
|
|||||||
ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST
|
ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST
|
||||||
eng "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe."
|
eng "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe."
|
||||||
|
|
||||||
|
WARN_ON_BLOCKHOLE_IN_RBR
|
||||||
|
eng "Row events are not logged for %s statements that modify BLACKHOLE tables in row format. Table(s): '%-.192s'"
|
||||||
#
|
#
|
||||||
# End of 5.5 error messages.
|
# End of 5.5 error messages.
|
||||||
#
|
#
|
||||||
|
@@ -4411,6 +4411,44 @@ int THD::decide_logging_format(TABLE_LIST *tables)
|
|||||||
DBUG_PRINT("info", ("decision: logging in %s format",
|
DBUG_PRINT("info", ("decision: logging in %s format",
|
||||||
is_current_stmt_binlog_format_row() ?
|
is_current_stmt_binlog_format_row() ?
|
||||||
"ROW" : "STATEMENT"));
|
"ROW" : "STATEMENT"));
|
||||||
|
|
||||||
|
if (variables.binlog_format == BINLOG_FORMAT_ROW &&
|
||||||
|
(lex->sql_command == SQLCOM_UPDATE ||
|
||||||
|
lex->sql_command == SQLCOM_UPDATE_MULTI ||
|
||||||
|
lex->sql_command == SQLCOM_DELETE ||
|
||||||
|
lex->sql_command == SQLCOM_DELETE_MULTI))
|
||||||
|
{
|
||||||
|
String table_names;
|
||||||
|
/*
|
||||||
|
Generate a warning for UPDATE/DELETE statements that modify a
|
||||||
|
BLACKHOLE table, as row events are not logged in row format.
|
||||||
|
*/
|
||||||
|
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
||||||
|
{
|
||||||
|
if (table->placeholder())
|
||||||
|
continue;
|
||||||
|
if (table->table->file->ht->db_type == DB_TYPE_BLACKHOLE_DB &&
|
||||||
|
table->lock_type >= TL_WRITE_ALLOW_WRITE)
|
||||||
|
{
|
||||||
|
table_names.append(table->table_name);
|
||||||
|
table_names.append(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!table_names.is_empty())
|
||||||
|
{
|
||||||
|
bool is_update= (lex->sql_command == SQLCOM_UPDATE ||
|
||||||
|
lex->sql_command == SQLCOM_UPDATE_MULTI);
|
||||||
|
/*
|
||||||
|
Replace the last ',' with '.' for table_names
|
||||||
|
*/
|
||||||
|
table_names.replace(table_names.length()-1, 1, ".", 1);
|
||||||
|
push_warning_printf(this, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
|
WARN_ON_BLOCKHOLE_IN_RBR,
|
||||||
|
ER(WARN_ON_BLOCKHOLE_IN_RBR),
|
||||||
|
is_update ? "UPDATE" : "DELETE",
|
||||||
|
table_names.c_ptr());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user