Bug #12574 | rbr of "after insert trigger" causes stack on slave mysqld process. | ||
---|---|---|---|
Submitted: | 14 Aug 2005 16:40 | Modified: | 26 Oct 2005 17:55 |
Reporter: | Jonathan Miller | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Replication | Severity: | S1 (Critical) |
Version: | 5.0-wl1012 | OS: | Linux (Linux) |
Assigned to: | Mats Kindahl | CPU Architecture: | Any |
[14 Aug 2005 16:40]
Jonathan Miller
[16 Aug 2005 16:15]
Jonathan Miller
New test case produces same results: 0x40250da1 in kill () from /lib/libc.so.6 #1 0x40181f4a in pthread_kill () from /lib/libpthread.so.0 #2 0x0828fd2d in write_core (sig=11) at stacktrace.c:220 #3 0x0818b4ed in handle_segfault (sig=11) at mysqld.cc:2064 #4 0x401855cd in __pthread_sighandler () from /lib/libpthread.so.0 #5 <signal handler called> #6 lock_tables (thd=0x872f338, tables=0x87460b8, count=0) at table.h:486 #7 0x0872b078 in ?? () #8 0x0820b25c in Rows_log_event::exec_event(st_relay_log_info*) ( this=0x872f338, rli=0x873d67c) at log_event.cc:5064 #9 0x08285c3f in exec_relay_log_event (thd=0x8775510, rli=0x873d67c) at slave.cc:2960 #10 0x082839a8 in handle_slave_sql (arg=0x8737498) at slave.cc:3508 #11 0x4017f6de in pthread_start_thread () from /lib/libpthread.so.0 ############################################################################# # Original Author: Jonathan Miller # # Original Date: Aug/14/2005 # ############################################################################# # Includes -- source include/have_binlog_format_row.inc -- source include/master-slave.inc #-- disable_query_log #-- disable_result_log # Begin clean up test section connection master; --disable_warnings --error 0,1360 DROP TRIGGER test.t1_bi; --error 0,1360 DROP TRIGGER test.t2_ai; --error 0,1360 DROP TRIGGER test.t1_bu; --error 0,1360 DROP TRIGGER test.t1_au; --error 0,1360 DROP TRIGGER test.t1_bd; --error 0,1360 DROP TRIGGER test.t1_ad; DROP TABLE IF EXISTS test.t1; DROP TABLE IF EXISTS test.t2; --enable_warnings # test section 1 CREATE TABLE test.t1 (id MEDIUMINT NOT NULL AUTO_INCREMENT, b1 BIT(8), vc VARCHAR(255), bc CHAR(255), d DECIMAL(10,4) DEFAULT 0, f FLOAT DEFAULT 0, total BIGINT UNSIGNED, y YEAR, t TIMESTAMP,PRIMARY KEY(id)); CREATE TABLE test.t2 (id MEDIUMINT NOT NULL AUTO_INCREMENT, b1 BIT(8), vc VARCHAR(255), bc CHAR(255), d DECIMAL(10,4) DEFAULT 0, f FLOAT DEFAULT 0, total BIGINT UNSIGNED, y YEAR, t TIMESTAMP,PRIMARY KEY(id)); delimiter |; CREATE TRIGGER test.t1_bi BEFORE INSERT ON test.t1 FOR EACH ROW UPDATE test.t1 SET b1=100110011 and y=YEAR(NOW())| #CREATE TRIGGER test.t2_ai AFTER INSERT ON test.t2 FOR EACH ROW BEGIN # INSERT INTO test.t2 VALUES(NULL,11111111,'Testing MySQL databases is a dream job come true', 'Theonlyjobbetteristestingdarkbeerprague',1234567891.1234,12.51,0,1965,NOW()); # UPDATE test.t1 SET f = ROUND(f); #END| delimiter ;| INSERT INTO test.t1 VALUES(NULL,00001111,'Testing MySQL databases is a cool ', 'Must make it good for the customer',987654321.4321,15.21,0,1965,NOW()); INSERT INTO test.t2 VALUES(NULL,00001111,'Testing MySQL databases is a cool ', 'Must make it good for the customer',987654321.4321,15.21,0,1965,NOW()); select * from test.t1; select * from test.t2; show binlog events; connection slave; use test; show tables; sleep 6; select * from test.t1; select * from test.t2; connection master; # cleanup --disable_warnings --error 0,1360 DROP TRIGGER test.t1_bi; --error 0,1360 DROP TRIGGER test.t2_ai; --error 0,1360 #DROP TRIGGER test.t1_bu; --error 0,1360 #DROP TRIGGER test.t1_au; --error 0,1360 #DROP TRIGGER test.t1_bd; --error 0,1360 #DROP TRIGGER test.t1_ad; DROP TABLE IF EXISTS test.t1; DROP TABLE IF EXISTS test.t2; --enable_warnings
[16 Aug 2005 19:42]
Jonathan Miller
Before update seems to have same issue: #0 0x40250da1 in kill () from /lib/libc.so.6 #1 0x40181f4a in pthread_kill () from /lib/libpthread.so.0 #2 0x0828fd2d in write_core (sig=11) at stacktrace.c:220 #3 0x0818b4ed in handle_segfault (sig=11) at mysqld.cc:2064 #4 0x401855cd in __pthread_sighandler () from /lib/libpthread.so.0 #5 <signal handler called> #6 lock_tables (thd=0x413006c0, tables=0x41302630, count=0) at table.h:486 #7 0x41302d20 in ?? () #8 0x0820b25c in Rows_log_event::exec_event(st_relay_log_info*) ( this=0x413006c0, rli=0x873d67c) at log_event.cc:5064 #9 0x08285c3f in exec_relay_log_event (thd=0x8775510, rli=0x873d67c) at slave.cc:2960 #10 0x082839a8 in handle_slave_sql (arg=0x8737498) at slave.cc:3508 #11 0x4017f6de in pthread_start_thread () from /lib/libpthread.so.0 CREATE TABLE test.t1 (id MEDIUMINT NOT NULL AUTO_INCREMENT, b1 BIT(8), vc VARCHAR(255), bc CHAR(255), d DECIMAL(10,4) DEFAULT 0, f FLOAT DEFAULT 0, total BIGINT UNSIGNED, y YEAR, t TIMESTAMP,PRIMARY KEY(id)); CREATE TABLE test.t2 (id MEDIUMINT NOT NULL AUTO_INCREMENT, b1 BIT(8), vc VARCHAR(255), bc CHAR(255), d DECIMAL(10,4) DEFAULT 0, f FLOAT DEFAULT 0, total BIGINT UNSIGNED, y YEAR, t TIMESTAMP,PRIMARY KEY(id)); delimiter |; CREATE TRIGGER test.t1_bu BEFORE UPDATE on test.t1 FOR EACH ROW BEGIN UPDATE test.t2 SET y = '2000'; INSERT INTO test.t1 VALUES(NULL,1,'Testing MySQL databases before update ', 'Insert should work',621.43, 0105.21,0,1974,NOW()); END| delimiter ;| INSERT INTO test.t1 VALUES(NULL,1,'Testing MySQL databases is a cool ', 'Must make it bug free for the customer',654321.4321,15.21,0,1965,NOW()); INSERT INTO test.t2 VALUES(NULL,0,'Testing MySQL databases is a cool ', 'MySQL Customers ROCK!',654321.4321,115.24521,0,1965,NOW()); select * from test.t1; select * from test.t2; connection slave; use test; show tables; sleep 9; select * from test.t1; select * from test.t2; connection master; UPDATE test.t1 SET b1 = 0 WHERE b1 = 1;
[16 Aug 2005 20:23]
Jonathan Miller
Here is an after update :-( #0 0x40250da1 in kill () from /lib/libc.so.6 #1 0x40181f4a in pthread_kill () from /lib/libpthread.so.0 #2 0x0828fd2d in write_core (sig=11) at stacktrace.c:220 #3 0x0818b4ed in handle_segfault (sig=11) at mysqld.cc:2064 #4 0x401855cd in __pthread_sighandler () from /lib/libpthread.so.0 #5 <signal handler called> #6 lock_tables (thd=0x41505750, tables=0x41500bc8, count=0) at table.h:486 #7 0x415012b8 in ?? () #8 0x0820b25c in Rows_log_event::exec_event(st_relay_log_info*) ( this=0x41505750, rli=0x873d67c) at log_event.cc:5064 #9 0x08285c3f in exec_relay_log_event (thd=0x8775510, rli=0x873d67c) at slave.cc:2960 #10 0x082839a8 in handle_slave_sql (arg=0x8737498) at slave.cc:3508 #11 0x4017f6de in pthread_start_thread () from /lib/libpthread.so.0 CREATE TABLE test.t1 (id MEDIUMINT NOT NULL AUTO_INCREMENT, b1 BIT(8), vc VARCHAR(255), bc CHAR(255), d DECIMAL(10,4) DEFAULT 0, f FLOAT DEFAULT 0, total BIGINT UNSIGNED, y YEAR, t TIMESTAMP,PRIMARY KEY(id)); CREATE TABLE test.t2 (id MEDIUMINT NOT NULL AUTO_INCREMENT, b1 BIT(8), vc VARCHAR(255), bc CHAR(255), d DECIMAL(10,4) DEFAULT 0, f FLOAT DEFAULT 0, total BIGINT UNSIGNED, y YEAR, t TIMESTAMP,PRIMARY KEY(id)); delimiter |; CREATE TRIGGER test.t2_au AFTER UPDATE on test.t2 FOR EACH ROW BEGIN DECLARE done INT DEFAULT 0; DECLARE a DECIMAL(10,4); DECLARE b FLOAT; DECLARE num MEDIUMINT; DECLARE cur1 CURSOR FOR SELECT t2.id, t2.d, t2.f FROM test.t2; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cur1; REPEAT FETCH cur1 INTO num, a, b; IF NOT done THEN UPDATE test.t2 SET total =(a*b) WHERE ID = num; END IF; UNTIL done END REPEAT; CLOSE cur1; END| delimiter ;| INSERT INTO test.t1 VALUES(NULL,1,'Testing MySQL databases is a cool ', 'Must make it bug free for the customer',654321.4321,15.21,0,1965,NOW()); INSERT INTO test.t2 VALUES(NULL,0,'Testing MySQL databases is a cool ', 'MySQL Customers ROCK!',654321.4321,1.24521,0,YEAR(NOW()),NOW()); select * from test.t1; select * from test.t2; connection slave; use test; show tables; sleep 9; select * from test.t1; select * from test.t2; connection master; UPDATE test.t1 SET b1 = 0 WHERE b1 = 1; INSERT INTO test.t2 VALUES(NULL,1,'This is an after update test.', 'If this works, total will not be zero on the master or slave',1.4321,5.221,0,YEAR(NOW()),NOW()); UPDATE test.t2 SET b1 = 0 WHERE b1 = 1; select * from test.t1; select * from test.t2; connection slave; use test; show tables; sleep 9; select * from test.t1; select * from test.t2; connection master; show binlog events;
[18 Aug 2005 20:31]
Jonathan Miller
Another test case: (gdb) bt #0 0x40250da1 in kill () from /lib/libc.so.6 #1 0x40181f4a in pthread_kill () from /lib/libpthread.so.0 #2 0x0828fd2d in write_core (sig=11) at stacktrace.c:220 #3 0x0818b4ed in handle_segfault (sig=11) at mysqld.cc:2064 #4 0x401855cd in __pthread_sighandler () from /lib/libpthread.so.0 #5 <signal handler called> #6 lock_tables (thd=0x4131ab50, tables=0x4130da40, count=0) at table.h:486 #7 0x4131ccc0 in ?? () #8 0x0820b25c in Rows_log_event::exec_event(st_relay_log_info*) ( this=0x4131ab50, rli=0x873d67c) at log_event.cc:5064 #9 0x08285c3f in exec_relay_log_event (thd=0x41300590, rli=0x873d67c) at slave.cc:2960 #10 0x082839a8 in handle_slave_sql (arg=0x8737498) at slave.cc:3508 #11 0x4017f6de in pthread_start_thread () from /lib/libpthread.so.0 ***************************************************** ./t/rpl_row_NOW.test ############################################################################# # Original Author: Jonathan Miller # # Original Date: Aug/18/2005 # ############################################################################# #TEST: Taken and modfied from http://bugs.mysql.com/bug.php?id=12480 # ############################################################################# # Includes -- source include/have_binlog_format_row.inc -- source include/master-slave.inc # Begin clean up test section connection master; --disable_warnings DROP TABLE IF EXISTS test.t1; DROP TABLE IF EXISTS test.t2; # Begin test section 1 CREATE TABLE test.t1 (n MEDIUMINT NOT NULL AUTO_INCREMENT, a TIMESTAMP DEFAULT '2005-05-05 01:01:01', b TIMESTAMP DEFAULT '2005-05-05 01:01:01', PRIMARY KEY(n)); delimiter |; CREATE FUNCTION test.f1() RETURNS TIMESTAMP BEGIN DECLARE v1 INT DEFAULT 300; WHILE v1 > 0 DO SET v1 = v1 - 1; END WHILE; RETURN NOW(); END| delimiter ;| INSERT INTO test.t1 VALUES(NULL,NOW(),test.f1()); delimiter |; CREATE TRIGGER test.trig1 BEFORE INSERT ON test.t1 FOR EACH ROW BEGIN SET new.b = test.f1(); END| delimiter ;| INSERT INTO test.t1 SET n = NULL, a = now(); SELECT * FROM test.t1; connection slave; sleep 3; SELECT * FROM test.t1; connection master; #show binlog events; # lets cleanup DROP TABLE IF EXISTS test.t1; DROP TABLE IF EXISTS test.t2;
[26 Oct 2005 17:55]
Jonathan Miller
Test do not produce cores at this point.