Skip to content

Commit de1fa45

Browse files
committed
[MDEV-8411] Assertion failed in !table->write_set
The reason for the assertion failure is that the update statement for the minimal row image sets only the PK column in the write_set of the table to true. On the other hand, the trigger aims to update a different column. Make sure that triggers update the used columns accordingly, when being processed.
1 parent 0e20137 commit de1fa45

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

mysql-test/suite/rpl/r/rpl_row_triggers.result

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,50 @@ a b
237237
3 30
238238
set global slave_run_triggers_for_rbr = @slave_run_triggers_for_rbr.saved;
239239
drop table t1, tlog;
240+
#
241+
# MDEV-8411 Assertion `is_stat_field || !table || (!table->write_set ||
242+
# bitmap_is_set(table->write_set, field_index) ||
243+
# bitmap_is_set(table->vcol_set, field_index))'
244+
# failed in Field_timestamp::store_TIME_with_warning
245+
#
246+
#
247+
# Create table on master, replicate it on slave.
248+
#
249+
connection master;
250+
set @binlog_row_image.saved = @@binlog_row_image;
251+
set binlog_row_image = MINIMAL;
252+
create table t1 (pk int primary key, f int);
253+
connection slave;
254+
#
255+
# Create a trigger on the slave.
256+
#
257+
create trigger tr before update on t1 for each row set new.f = 1000;
258+
set @old_slave_run_triggers_for_rbr = @@global.slave_run_triggers_for_rbr;
259+
set global slave_run_triggers_for_rbr = YES;
260+
connection master;
261+
#
262+
# Update the table to have the trigger fire on the slave.,
263+
#
264+
insert into t1 values (1,1),(2,2);
265+
update t1 set pk=pk+10;
266+
select * from t1;
267+
pk f
268+
11 1
269+
12 2
270+
connection slave;
271+
#
272+
# Check to see if slave has the table updated.
273+
#
274+
select * from t1;
275+
pk f
276+
11 1000
277+
12 1000
278+
#
279+
# Cleanup
280+
#
281+
set global slave_run_triggers_for_rbr = @old_slave_run_triggers_for_rbr;
282+
connection master;
283+
set binlog_row_image = @binlog_row_image.saved;
284+
drop table t1;
285+
connection slave;
240286
include/rpl_end.inc

mysql-test/suite/rpl/t/rpl_row_triggers.test

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,5 +276,54 @@ drop table t1, tlog;
276276
sync_slave_with_master;
277277

278278

279+
--echo #
280+
--echo # MDEV-8411 Assertion `is_stat_field || !table || (!table->write_set ||
281+
--echo # bitmap_is_set(table->write_set, field_index) ||
282+
--echo # bitmap_is_set(table->vcol_set, field_index))'
283+
--echo # failed in Field_timestamp::store_TIME_with_warning
284+
--echo #
285+
--enable_connect_log
286+
--echo #
287+
--echo # Create table on master, replicate it on slave.
288+
--echo #
289+
--connection master
290+
set @binlog_row_image.saved = @@binlog_row_image;
291+
set binlog_row_image = MINIMAL;
292+
create table t1 (pk int primary key, f int);
293+
294+
--sync_slave_with_master
295+
--echo #
296+
--echo # Create a trigger on the slave.
297+
--echo #
298+
create trigger tr before update on t1 for each row set new.f = 1000;
299+
set @old_slave_run_triggers_for_rbr = @@global.slave_run_triggers_for_rbr;
300+
set global slave_run_triggers_for_rbr = YES;
301+
302+
--connection master
303+
--echo #
304+
--echo # Update the table to have the trigger fire on the slave.,
305+
--echo #
306+
insert into t1 values (1,1),(2,2);
307+
update t1 set pk=pk+10;
308+
select * from t1;
309+
310+
--sync_slave_with_master
311+
--echo #
312+
--echo # Check to see if slave has the table updated.
313+
--echo #
314+
select * from t1;
315+
316+
--echo #
317+
--echo # Cleanup
318+
--echo #
319+
320+
set global slave_run_triggers_for_rbr = @old_slave_run_triggers_for_rbr;
321+
322+
--connection master
323+
set binlog_row_image = @binlog_row_image.saved;
324+
drop table t1;
325+
326+
--sync_slave_with_master
327+
--disable_connect_log
279328

280329
--source include/rpl_end.inc

sql/log_event.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11352,6 +11352,7 @@ bool Rows_log_event::process_triggers(trg_event_type event,
1135211352
{
1135311353
bool result;
1135411354
DBUG_ENTER("Rows_log_event::process_triggers");
11355+
m_table->triggers->mark_fields_used(event);
1135511356
if (slave_run_triggers_for_rbr == SLAVE_RUN_TRIGGERS_FOR_RBR_YES)
1135611357
{
1135711358
tmp_disable_binlog(thd); /* Do not replicate the low-level changes. */

0 commit comments

Comments
 (0)