summaryrefslogtreecommitdiff
path: root/sql/sql_class.h
diff options
context:
space:
mode:
authorSachin Kumar <sachin.setiya@mariadb.com>2021-05-24 11:23:03 +0100
committerSachin Kumar <sachin.setiya@mariadb.com>2021-05-27 06:35:37 +0100
commit6b79bd2b5081a61903f66bc21d079d0eb07227e3 (patch)
treec4f31e597ab4a26f47d94f186361c24bb2f2f3fc /sql/sql_class.h
parent5c75ba9cadc7877e91d6b712f157ff5623c09c60 (diff)
downloadmariadb-git-bb-10.2-24667.tar.gz
MDEV-24667 LOAD DATA INFILE/inserted rows not written to binlogbb-10.2-24667
Problem:- In master slave replication , when master is using statement format and slave is using mixed format, sometime we can have binlog which is not written. For example LOAD DATA INFILE is a unsafe statement , it is logged as a row format, and if it is on temporary table , it wont be logged. If the next statement is copy data from the tmp table to normal table, it is logged as a statement format on the slave , because it thinks this statement is unsafe. As we can see we did not log LOAD DATA INFILE and we simply logging insert into from * into statement format , we have effectively lost the tmp table data. Solution:- On master in mixed format if tmp table is created thd->temporary_tables is set to not null. This will make THD::reset_for_next_command to not change the binlog format back to stmt. So till the tmp table exist all the logs will be written in row format. On master THD::has_thd_temporary_tables() is used to determine whether we have temporary tables or not. But this does not work for the slave , slave shifts temporary tables from thd->temporary_tables to rgi_slave->rli->save_temporary_tables, so this will make has_thd_temporary_tables() check to return false on slave. So instead of this function I am calling has_temporary_tables() , which also checks slave thread tmp tables.
Diffstat (limited to 'sql/sql_class.h')
-rw-r--r--sql/sql_class.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 50ab3c56ca9..795e6a5e8b2 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -3899,13 +3899,13 @@ public:
*/
DBUG_PRINT("debug",
("temporary_tables: %s, in_sub_stmt: %s, system_thread: %s",
- YESNO(has_thd_temporary_tables()), YESNO(in_sub_stmt),
+ YESNO(has_temporary_tables()), YESNO(in_sub_stmt),
show_system_thread(system_thread)));
if (in_sub_stmt == 0)
{
if (wsrep_binlog_format() == BINLOG_FORMAT_ROW)
set_current_stmt_binlog_format_row();
- else if (!has_thd_temporary_tables())
+ else if (!has_temporary_tables())
set_current_stmt_binlog_format_stmt();
}
DBUG_VOID_RETURN;